基础面经札记2

1.详述一下路由寻址方式

1.在数据包中得到目的IP地址,根据IP地址及子网掩码计算目标网络地址;
2.根据目标网络地址查找路由表得到下一跳的出口并转发数据包;
3.其他路由器根据类似的转发规则直至把数据包转发到目标IP地址所在主机。

2.NAT,一般使用的场景有哪些

NAT:Network Address Translation 网络地址转换(作用就是帮助把内网的IP地址可以转换为公网的IP地址)

家庭局域网,公司局域网的网络设备没有公网IP地址如何访问互联网?

  1. 互联网中网络设备互相访问时基于IP地址的
  2. 我们把发起一方的IP叫做源IP,被访问的一方叫做目的IP
  3. 源IP如何找到目的IP,是基于路由(route),也即网络设备中存放的路由表(routing table)
  4. 我们内网PC一般会有一个网关,即有一条到达网关的路由,但是互联网上有几十亿个ip地址,我们不可能在电脑上存放那么多的路由条目。其实即便我们真的写了一条这样的路由(Cisco静态路由):ip route 202.100.1.2 255.255.255.250 202.100.1.1 那么人家回包的时候更根本不认识192.168.1.1这样的地址,因为这个地址在全世界到处都是。
  5. 但是我们的网关设备一般会有一个默认路由目的IP为0.0.0.0,表示任意地址,我们只需指明下一跳即可,这样运营商帮我们解决后续数据包的传递
  6. 所以,综上的意思为:我们内网PC不能直接访问互联网,但是我们的网关设备可以,那我们的电脑怎么上网呢?
  7. 因此出现NAT技术,它的作用就是帮助把内网的IP地址可以转换为公网的IP地址

3.SNAT和DNAT

SNAT:内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

DNAT:当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。

4.是否曾经配置ip和路由?知道哪些命令

利用思科网络模拟器模拟配置过

单机换机VLAN配置
跨机换机VLAN配置
RIP配置
OSPF配置

命令
Router#configure terminal
Router(config)#interface fastEthernet 0/0
……

5.说一下sql注入,写一个sql注入的例子,如何防御sql注入

SQL 注入:就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞

如:
select id,no from user where id=" + id;
正常id=1
攻击:id= 2 or 1=1

防御
1.采用sql语句预编译和绑定变量,是防御sql注入的最佳方法;
2.使用一些安全函数,来防止sql注入;
3.对特殊字符进行转译与过滤,使用sql语句绑定变量;

6.广播,广播风暴

广播:指在IP子网内广播数据包,所有在子网内部的主机都将受到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和交换机网络设备控制广播传输。

广播风暴:是网络上的广播帧由于被转发,数量急剧增加而出现正常网络通信的反常现象,也就是说就是在网络中有大量的ARP协议数据包传送,而影响到正常数据的传送

预防
1.在采用一种通讯协议的网络中,计算机不要太多。如果计算机的数量较多,应采用划分VLAN的方式将网络分隔开来,将大的广播域划分为若干个小的广播域,以减小广播风暴可能造成的危害。
2.广播风暴多是出现在环形连接的局域网中,如果用路由器和交换机的话,由于路由器和交换机是树形连接设计的,可以有效的防止广播风暴的产生。

7.linux中查看进程和CPU占用的命令是什么

查看内存使用情况:cat /proc/meminfo;
查看CPU使用情况:cat /proc/cpuinfo;

在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要。
在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况。

8.字符串拼接String、StringBuilder、StringBuffer

相同点:
1.都可以存储和操作字符串;
2.都是用final修饰,不能被继承;
3.提供的API相似;

区别:
1.String是只读字符串,String对象内容是不能被修改的;
2.StringBuffer和StringBuilder的字符串对象可以对字符串内容进行修改,修改后的内存地址不会发生改变;
3.StringBuilder线程不安全,StringBuffer线程安全;
方法体没有对字符串的并发操作,且存在大量字符串拼接操作,建议使用StringBuilder,效率高。

9.final关键字

在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)

1.修饰类:当用final修饰一个类时,表明这个类不能被继承

2.修饰方法:使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率

3、修饰变量:final成员变量表示常量,只能被赋值一次,赋值后值不再改变。当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

10.多态:重写和重载

重写:是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常

重载(overloading) :是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。

11.可以用于定位网络问题的Linux操作指令

grep -v 排除指定字符串
ps -ef | grep 查询服务进程路径(或路径中的关键字符串)
netstat -apn | grep PID此命令可查看进程占据的端口信息

ifconfig:获取主机ip配置
traceroute:路由跟踪

12.与文件相关的Linux操作指令

新建文件:touch
chgrp 组名 文件或目录
chown:改变文件所有者
chmod:改变文件或目录的权限
cp sourceFile targetFile:拷贝文件
mv source target:移动文件
rm:删除
basename:取得路径的文件名称

13.视频传输协议(TCP\UDP),存在哪些传输问题

视频图像传输有以下几个特点:

  1. 要求传输延时小,实时性高;
  2. 传输流量大,要求传输效率高;
  3. 在一定程序上允许传输错误或数据丢失。根据以上特点知,使用UDP协议来传输视频相对TCP协议更理想。

RTMP——Real Time Messaging Protocol(实时消息传输协议)
RTMP协议是基于TCP协议的,也就是说RTMP实际上是使用TCP作为传输协议。TCP协议在处在传输层,是面向连接的协议,能够为数据的传输提供可靠保障,因此数据在网络上传输不会出现丢包的情况。不过这种可靠的保障也会造成一些问题,也就是说前面的数据包没有交付到目的地,后面的数据也无法进行传输

RTSP
RTSP(Real Time Streaming Protocol)是TCP/UDP协议体系中的一个应用层协议
RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或者RTP完成数据传输,目前市场上大多数采用RTP来传输媒体数据。

14.ArrayList和LinkedList

1.ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于双向链表实现的非线程安全的集合;

2.扩容问题:ArrayList使用数组实现,无惨构造函数默认初始化长度为10,数组扩容是会将原数组中的元素重新拷贝到新数组中,长度为原来的1.5倍(扩容代价高);LinkedList不存在扩容问题,新增元素放到集合尾部,修改相应的指针结点即可;

3.LinkedList比ArrayList更占内存空间,因为LinkedList为每一个节点存储了两个引用结点,一个指向前一个元素,一个指向下一个元素;

4.对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素,LinkedList要移动指针遍历每个元素直到找到为止;

5.新增和删除元素,一般LinkedList的速度要优于ArrayList,因为ArrayList在增删元素时,可能扩容和复制数组;LinkedList实例化对象需要时间外,只需要修改节点指针即可;

6.LinkedList集合不支持高效的随机访问;

7.ArrayList的空间浪费主要体现在list列表的结尾预留一定的容量空间;linkedList的空间花费则体现在它的每一个元素都需要消耗存储指针结点对象的空间;

8.都是非线程安全,允许放null.

15.数据库的事务以及四大特性

什么是数据库事务?
数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。意思就是一连串的数据库操作,即一串增删查改的集合。

数据库事务做了什么?
它把数据库从一个一致的状态转换到另一个一致的状态,比如数据库操作前是一个点,数据库操作后是一个点,我们只管这两个点的状态,而两点之间的连线上的状态我们不管因为他们可能对我们想要的结果产生影响。

特性
原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚;
一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态;
隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离;
持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的;

16.数据库锁

Mysql为例
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

17.死锁,如何破坏死锁

线程死锁是指由两个或两个以上线程相互持有对方所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法继续执行,如果线程都不主动释放所占有的资源,将产生死锁。当线程处于这种僵持状态,若无外力,他们都将无法再向前推进。

产生原因
1.持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。
2.持有资源的锁,去竞争锁已被占用的其他资源,形成程序僵死的竞争关系
3.信号量使用不当。

如何避免死锁?

死锁发生的条件:

  1. 互斥,共享资源只能被一个线程占有;
  2. 占有且等待
  3. 不可抢占;
  4. 循环等待;

避免死锁方法:只要破坏以上4个中的一个条件就可以避免死锁,互斥是不能破坏的,因为加锁就是为了保证互斥;

  1. 一次性申请所有资源,破坏‘占有且等待’条件;
  2. 占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它所占有的资源,破坏‘不可抢占’条件;
  3. 按序申请资源,破坏‘循环等待’条件;

18.进程和线程

进程
进程是程序执行的的一个实例
每个进程拥有独立内存地址空间
是系统进行资源分配和调度的基本单位

线程
线程是进程的一个实体,是进程的一个执行路径
CPU调度和分派的基本单位
线程本身不会独立存在
系统不会为线程分配内存,多个线程之间共享所属进程的资源
线程只拥有在运行中必不可少的资源(如程序计数器,栈等)

为什么要有线程?
因为每个进程都有自己的地址空间,即进程空间,在并发请求中,如果为每一个请求创建一个进程,系统开销很大,请求响应效率低,因此引进了线程

一个程序至少一个进程,一个进程至少一个线程,进程中多个线程共享进程的资源
进程通信是通过管道,信号量,套接字,消息队列文件等来通信的

19.SSD和HDD

ssd:即固态硬盘,简称固盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片dao、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。
它的优点是速度快,日常的读写比机械硬盘快几十倍上百倍。缺点是单位成本高,不适合做大容量存储。

hdd:即硬盘驱动器,机械硬盘,是最基本的电脑存储器,我们电脑中常说的电脑硬盘C盘、D盘为磁盘分区都属于硬盘驱动器。
它的优点是单位成本低,适合做大容量存储,但速度远不如SSD。

20.测试

黑盒测试(Black Box Testing):
黑盒测试是根据软件的规格对软件进行的测试,这类测试不考虑软件内部的运作原理,因此软件对用户来说就像一个黑盒子。简单来说,这种测试只关心输入和输出的结果,并不考虑程序的源代码。黑盒测试分为功能测试和性能测试:

白盒测试(White Box Testing):
白盒测试是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。与黑盒测试相反,这种测试就要研究程序里面的源代码和程序结构

21.Linux下查找文件

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。

区别
1.find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
2.grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
3.which:查看可执行文件的位置 ,只有设置了环境变量的程序才可以用 (4)whereis 寻找特定文件,只能用于查找二进制文件、源代码文件和man手册页
4.locate:配合数据库查看文件位置 ,详情:locate -h查看帮助信息

22.网络安全

网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。

安全涉及到的三个要素包括内部的脆弱,外部的威胁以及潜在的风险。

安全需要关注的三个最主要指标是保密性、完整性和可用性。

  1. 保密性,就是确保只有经过授权的人才能访问,而没有经过授权的人是绝对不可以的。
  2. 可用性的定义也比较清晰,就是确保经过授权的用户,在需要访问相关信息的时候随时可以访问。
  3. 完整性的定义相对复杂一些,应该是建立在可用基础上的完备和准确,包括信息本身和相关的过程

23.Linux系统下的init 3

0:停机
1:单用户形式,只root进行维护
2:多用户,不能使用net file system
3:完全多用户
5:图形化
6:重启

24.get和post

1.安全性:Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。

2.数据长度:Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
3.字符:.Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
4.效率:Get执行效率却比Post方法好。Get是form提交的默认方法。

25.什么是内存泄漏

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的,使用完后必须显式释放的内存。如果没有,则这块内存就不能被再次使用,就是这块内存泄漏了。

内存泄露多数属于程序本身设计问题,有以下几种解决方法:

  1. 从程序内部重新编译。养成良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。
  2. 结束程序,内存自然就会被操作系统回收。
  3. 重新启动电脑后,立刻恢复。

26.Http

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

27.网络层次

7层是指OSI七层协议模型,主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

五层体系结构包括:应用层、运输层、网络层、数据链路层和物理层

4层是指TCP/IP四层模型,主要包括:应用层、运输层、网际层和网络接口层。

28.TCP和UDP

1、连接方面区别
TCP面向连接(如打电话要先拨号建立连接)。
UDP是无连接的,即发送数据之前不需要建立连接。

2、安全方面的区别
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
UDP尽最大努力交付,即不保证可靠交付。

3、传输效率的区别
TCP传输效率相对较低。
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

4、连接对象数量的区别
TCP连接只能是点到点、一对一的。
UDP支持一对一,一对多,多对一和多对多的交互通信。

29.同步和异步主要的优缺点

1、同步的执行效率会比较低,耗费时间,但有利于我们对流程进行控制,避免很多不可掌控的意外情况;
2、异步的执行效率高,节省时间,但是会占用更多的资源,也不利于我们对进程进行控制

30.网络熟悉哪一层(应用层)

应用层(baiApplication layer)是网络传输协议七层OSI模型的第七层。主要是提供网络任意端上应用程序之间的接口,如远程访问和管理、电子邮件、虚拟中端以及目录服务等其它功能。

1.DNS:域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。
2.FTP:文件传输协议FTP是因特网上使用得最广泛的文件传送协议。
3.telnet远程终端协议:telnet是一个简单的远程终端协议
4.HTTP:超文本传送协议,
5.电子邮件协议SMTP:即简单邮件传送协议
6.POP3:邮件读取协议

31.http的报头、请求方式

1.请求行
格式为:
Method Request-URI HTTP-Version 结尾符
结尾符一般用\r\n

2.请求头
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
User-Agent:发送请求的浏览器类型、操作系统等信息
Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
Accept-Encoding:客户端可识别的数据编码
Accept-Language:表示浏览器所支持的语言类型
Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

3.空行

4.消息主体

32 http1.0、1.x、2.x的区别

HTTP1.0与HTTP 1.1的主要区别

长连接
节约带宽
HOST域

HTTP1.1与HTTP 2.0的主要区别

多路复用
二进制分帧
首部压缩
服务器推送

33.数据库索引的作用优点和缺点

优点
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2.可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

34.计算机内存分配

内存为程序分配空间有四种分配方式:
1、连续分配方式
2、基本分页存储管理方式
3、基本分段存储管理方式
4、段页式存储管理方式

35.快速排序

package Sort;

/**
 * 快速排序
 */
public class quickSort {
    
    

    public static void quicksort(int []num , int low ,int high){
    
    
        if(low < high){
    
    
            //找寻基准数据的索引
            int index = getIndex(num,low,high);
            // 进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序
            quicksort(num, low, index - 1);
            quicksort(num, index + 1, high);
        }
    }

    public static int getIndex(int []num , int low ,int high){
    
    
        //基准数据
        int tmp = num[low];
        while(low < high){
    
    
            //当队尾的元素大于基准数据是,向前移动指针
            while(low < high && num[high] >= tmp){
    
    
                high--;
            }
            //如果队尾元素小于tmp了,需要将其赋值给low
            num[low] = num[high];
            //当队头的元素小于基准数据是,向后移动指针
            while(low < high && num[low] <= tmp){
    
    
                low++;
            }
            //当队首元素大于tmp时,需要将其赋值给high
            num[high] = num[low];
        }
        /**
        跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
        由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给num[low]
        */
        num[low] = tmp;
        return low;
    }

    public static void print(int []num){
    
    
        for(int val : num){
    
    
            System.out.print(val + " ");
        }
        System.out.println();
    }

    public static void main(String []args){
    
    
        int []num = {
    
    15,16,9,32,26,7,21,19,6};
        print(num);
        quicksort(num,0,num.length-1);
        print(num);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/112688789
今日推荐