计算机网络面经

282 阅读17分钟

一、OSI模型

1.1七层和五层模型

  • 七层

    • 物理层:底层数据传输,如网线,网卡;
    • 数据链路层:控制网路层和物理层之间通信;
    • 网络层:定义IP编址,定义路由功能,如不同设备的数据转发;
    • 传输层:端到端传输数据的基本功能,如TCP、UDP;
    • 会话层:软件之间的对接。建立、维护、管理软件间的会话。
    • 表示层:对应用软件的数据压缩编码,加密,解密;
    • 应用层:各种应用软件;
  • 五层

    • 物理层
    • 数据链路层
    • 传输层
    • 网络层
    • 应用层

二、应用层

  • HTTP:超文本传输协议;
  • HTTPS:超文本安全传输协议;
  • Telnet:远程登陆服务标准协议;
  • FTP:文本传输协议;
  • TFTP:简单文件传输协议;
  • SMTP:简单邮件传输协议;
  • POP;邮局协议;
  • DNS;域名解析服务;

2.1、一次完整的HTTP请求过程包括哪些内容?

  1. 客户机与服务器建立连接;
  2. 连接成功,客户机发送请求给服务器;
  3. 服务器返回响应给客户机;
  4. 客户机解析数据,断开连接。

2.2、HTTPS是如何保证数据传输的安全,整体的流程是什么?

HTTPS使用了SSL/TLS加密算法对传输的数据进行加密,保证了数据的安全性。它的流程包括四步:

  1. 客户端向服务器发送TLS加密请求(TLS版本、加密套件、随机数1);
  2. 服务端收到请求后,返回响应确认支持的TLS版本、加密套件并生成一个随机数2发送给客户端。接下来将会发送第二个响应出示自己的CA证书以及公钥给客户端。
  3. 客户端浏览器收到响应后对照证书列表确认服务器是否可信,可信则生成第三个随机数(预主密钥),并使用服务器公钥进行加密,发送给服务器;
  4. 客户端、服务器通过随机数1、2、3生成会话密钥,后面通信通过会话密钥进行通信。

CA证书是由证书颁发机构颁发的,用来保证证书持有者合法可靠性的,CA证书内存储了对应服务器的公钥信息,所以能验证加密公钥的可靠性。

image.png

HTTPS是什么?加密原理和证书。SSL/TLS握手过程_哔哩哔哩_bilibili

2.3、HTTPS和HTTP的区别

  1. http传输数据是明文的,对应隐私数据的传输安全性不够;HTTPS是按照TLS+HTTP协议构建的加密传输身份认证的网络协议,比HTTP更安全;
  2. HTTPS协议需要申请ca证书,需要一定费用;
  3. 使用端口不一样,HTTP默认端口是80,HTTPS是443;
  4. 连接方式不一样,https连接支持多路复用。

2.4、SSL/TLS ?

是对客户端和服务器通信加密解密的协议。

2.5、密钥不被篡改?

将公钥放在数字证书中,由CA证书颁发机构去验证证书的合法性,从而验证公钥的合法性。

2.6、Cookie是什么?

Cookie是由服务器发送给客户端并保存在客户端本地的数据,用来告诉服务器两次请求都来自同一个客户端。

2.7、Cookie有什么用途?

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

2.8、Session的工作原理是什么?

工作原理是当客户端访问服务器时,服务器会创建对应session,返回session给客户端,客户端将其保存在cookie中,下次访问的时候会携带,从而实现有状态的访问。

2.9、Cookie与Session的对比

cookie是由服务器发送给客户端,客户端保存的一段字符串,下次访问时将cookie携带上,服务器就能识别对应cookie的客户端。 session是服务器保存状态的方法。客户端访问服务器时,服务器会为每个客户端都分配唯一的Session ID,从而鉴别访问的客户端。

2.10、HTTP长连接和短连接的区别

长连接指客户端和服务器建立连接,进行传输数据结束后,若没主动断开连接,连接将会一直保持,当有新的数据需要传输,将直接用该连接通道进行传输(HTTP1.1); 短连接,短连接指每进行一次http操作就建立一次连接,任务结束就中断连接(HTTP1.0);

2.11、HTTP请求方法你知道多少?

  • GET: 向服务器获取数据
  • POST: 发送数据给服务器;
  • PUT: 全量修改服务器数据;
  • PATCH:修改服务器资源的部分数据;
  • DELETE:删除指定资源;
  • HEAD: 获取报文首部,不返回报文主体部分。例如下载一个大文件前,先查看其大小再决定是否下载;
  • OPTIONS: 询问支持的请求方法,跨域请求,预检请求,判断目标是否安全;
  • CONECT:要求与代理服务器进行通信时,建立管道,在管道内使用TCP通信,把服务器作为跳板,让服务器访问其它网页,并将结果返回给客户端;
  • TRACE:让服务器原样返回任意客户端请求的信息内容,主要用于测试或诊断;

2.12、GET和POST的区别,你知道哪些?

  1. GET一般用于获取数据,POST一般用于添加数据;
  2. GET把请求数据直接放在URL上,不太安全,POST将请求数据放在请求体上,相对安全;
  3. GET提交数据有大小限制,POST理论上无限制;
  4. GET产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
  5. GET请求浏览器会主动缓存,POST不会,除非手动设置;
  6. 本质区别:GET是幂等的,而POST不是。

幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。正因为它们有这样的区别,所以不应该且不能用get请求做数据的增删改这些有副作用的操作。因为get请求是幂等的,在网络不好的隧道中会尝试重试。如果用get请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用(浏览器和操作系统并不知道你会用get请求去做增操作)

2.13、POST 方法会产生两个 TCP 数据包?你了解吗?

在部分浏览器中,POST请求会将headr和body分开发送,从而产生两个数据包。首先将header发送,服务器返回状态码100后,继续发送body包。这主要看浏览器的行为,不是POST请求的必然要求。

2.14、HTTP中有个缓存机制,但如何保证缓存是最新的呢?(缓存过期机制)

客户端发送请求时,会检查本地是否有缓存,无则去访问服务器,有则会检查缓存是否过期,过期了则和服务器进行验证,没过期就直接用。浏览器cache-control的max-age中记录了保存缓存的最大时间,超过了就过期了,expires是过期时间。一般对于长期不变的固定资源,有较大的缓存时间,对于可能变的资源,也只需要发送请求和服务器确认。

2.15、DNS工作原理

将主机域名转换为IP地址,属于应用层协议,使用UDP传输。工作流程如下:

  1. 当用户输入域名时,将检查浏览器缓存是否包含该域名映射的IP地址;
  2. 若未命中,将检查操作系统缓存;
  3. 未命中,再检查本地域名服务器;
  4. 若无,本地域名服务器请求根域名服务器,根域名服务器返回给本地域名服务器一个顶级域名服务器地址;
  5. 此时,本地域名服务器会去请求顶级域名服务器,顶级域名服务器将返回一个权威域名服务器;
  6. 本地域名服务器请求权威域名服务器,将会找到域名和IP的映射关系;
  7. 本地域名服务器将会缓存该域名和IP地址的映射关系,并返回给用户;
  8. 用户收到IP地址即可去访问网站的服务器,同时本地系统缓存关系。

本地解析用的是递归查询,远程解析用的是递归查询

2.16、DNS负载均衡是什么策略?

当一个服务器的访问用户过多时,可能导致服务器压力过大而崩溃。DNS负载均衡是在DNS中,将一个域名对应多个可以响应请求的IP地址,按请求服务器的当前承载量返回解析对应的IP地址,从而实现负载均衡。

2.17、为什么域名解析用UDP协议?

UDP速度快,并且UDP一般返回的内容不能超过512字节,而域名解析正好满足这个要求。

2.18、为什么区域传送用TCP协议?

区域传输是指将一个服务器的文件复制到多个服务器上。这导致文件的数据很可能大于UDP最大512字节的限制,而TCP没有这个限制,所以要使用TCP。此外,TCP可靠性更好,传输过程不会出错。

2.19、DNS查询方式有哪些?

有递归查询和迭代查询。

  • 递归查询:首先在本地缓存中去寻找->到本地DNS解析服务器寻找->根域名寻找->顶级域名找->二级域名->三级域名找到后,按顺序递归的返回查询结果。
  • 迭代查询:客户端在本地缓存未找到,就去请求本地DNS服务器,DNS服务器无就返回根域名地址,让客户端去根域名找,若没找到,根域名就会返回顶级域名地址,让客户端去顶级域名找。依此类推,直至查找成功。

三、传输层

3.1、TCP是什么?

是一个面向可靠连接的、基于字节流的传输层通信协议。

3.2、TCP常用报文段

  1. 源端口和目标端口
  2. 序列号
  3. 确认序列号
  4. TCP Flag
  5. 滑动窗口大小

3.1、TCP粘包/拆包以及解决方案

  • 粘包:是指TCP在传输数据时,将多个小的数据包组合在一起进行发送,服务器无法区分各个包,导致数据错乱;
  • 拆包:指一个大的数据包拆分为多个小的包进行传输,服务器有可能一次性无法接收所有包,导致数据丢失;
  • 解决方案:
    • 在数据包中添加开始和结束标志;
    • 自定义消息协议,并在协议头中保存数据的长度信息;
    • 定长的发送消息。

3.2、一个TCP连接可以对应几个HTTP请求?

如果是长连接,一个TCP可以对应多个HTTP请求。

3.3、一个 TCP 连接中 HTTP 请求发送可以一起发送么

在HTTP1.1中,单个TCP在同一时刻只能处理一个HTTP请求。可以使用流水线技术,按顺序的完成多个请求的发送,但默认是关闭的。 在HTTP2中,可以使用多路技术让多个请求在同一个TCP连接中并行处理。

3.4、浏览器对同一 Host 建立 TCP 连接到的数量有没有限制?

有数量限制。例如谷歌浏览器只允许一个HOST建立6个TCP连接,不同的浏览器不太一样。

3.5、为何需要把 TCP/IP 协议栈分成 5 层(或7层)?开放式回答。

答:ARPANET 的研制经验表明,对于复杂的计算机网络协议,其结构应该是层次式的。

分层的好处:

①隔层之间是独立的

②灵活性好

③结构上可以分隔开

④易于实现和维护

⑤能促进标准化工作

3.6、常见TCP的连接状态有哪些?

  • CLOSED:初始状态。
  • LISTEN:服务器处于监听状态。
  • SYN_SEND:客户端socket执行CONNECT连接,发送SYN包,进入此状态。
  • SYN_RECV:服务端收到SYN包并发送服务端SYN包,进入此状态。
  • ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态,服务端接收到ACK包后进入此状态。
  • FIN_WAIT_1:终止连接的一方(通常是客户机)发送了FIN报文后进入。等待对方FIN。
  • CLOSE_WAIT:(假设服务器)接收到客户机FIN包之后等待关闭的阶段。在接收到对方的FIN包之后,自然是需要立即回复ACK包的,表示已经知道断开请求。但是本方是否立即断开连接(发送FIN包)取决于是否还有数据需要发送给客户端,若有,则在发送FIN包之前均为此状态。
  • FIN_WAIT_2:此时是半连接状态,即有一方要求关闭连接,等待另一方关闭。客户端接收到服务器的ACK包,但并没有立即接收到服务端的FIN包,进入FIN_WAIT_2状态。
  • LAST_ACK:服务端发动最后的FIN包,等待最后的客户端ACK响应,进入此状态。
  • TIME_WAIT:客户端收到服务端的FIN包,并立即发出ACK包做最后的确认,在此之后的2MSL时间称为TIME_WAIT状态

3.7、TCP三次握手、四次挥手

  • 三次握手
    1. 客户端发送一个SYN包和序列号x向服务器请求建立连接;(客户端发送SYN报文和客户端序列号给服务器请求建立连接)
    2. 服务器响应一个SYN+ACK、并将自己生成的一个序列号y,和确认序号为x+1给客户端(服务器收到后,返回SYN、和ACK给客户端,这里的ACK是对客户端请求的确认);
    3. 客户端收到后,响应ACK,并返回序号x+1,消息确认序号为y+1给服务器端,建立连接(客户端收到后,再次发送ACK,这次ACK是客户端对服务器消息的确认)。

二次握手为什么不行?如果是二次握手,那么在第二次握手的时候,服务器只能选择接收连接或者拒绝连接,但是服务器不知道该请求是之前由于网络阻塞已过期的无效请求还是正常的有效请求,如果是无效请求,那么将导致服务器建立错误的连接。

  • 四次挥手
    1. 客户端发送FIN 包去请求断开连接;
    2. 服务器收到后,返回ACK包,表示进入关闭等待状态;
    3. 待服务器数据全部发送完毕后,发送FIN包,进入最后确认状态;
    4. 客户端收到后返回ACK包,客户端进入超时关闭状态,服务端收到ACK包后会立马关闭连接。

能不能变成三次挥手?因为客户端突然请求断开连接,服务器此时可能还正在发送数据,还需要一段时间才能发送完数据,因此需要先发个ACK确认包表示收到客户端请求了,待服务器数据发送或者处理完后,再发送FIN包确认能够断开连接。

3.8、三次握手过程中可以携带数据吗?

第1,2次不能携带数据,因为第1、2次还未确定客户端和服务器接收、发送能力是否正常,此外,携带数据也会让SYN攻击更加有效。第三次可以,因为已经确认了双方能力正常了。

3.9、2MSL的等待时间

为了防止发送给服务器的包被丢失,导致服务器一直等待客户端的ACK包。

3.10、TCP四大拥塞控制算法总结?(极其重要)

网络负载过大,导致网络吞吐量下降,出现拥塞。

  • 慢启动算法:TCP连接后,拥塞窗口按指数增长去发送数据,直至拥塞窗口大于慢开始阈值;
  • 拥塞避免算法:拥塞窗口每次+1的缓慢增长,直至发生丢包;
  • 快重传:让发送方尽快重传,而不是等超时后再重传。
    • 发送方不要等自己要发送数据后再捎带确定,而是立刻发送确认;

    • 即使收到了失序的报文段也要立即发送对已收到报文段的重复确认;

    • 发送方一旦收到三个重复确认,就立即重新发送数据;

    对于个别丢失的报文段,发送方不会误认为发生了拥塞。发生送方一旦收到三个重复确认,就能知道只是个别丢失,不是网络拥塞,因此不会启动慢开始算法,而执行快速恢复算法。

  • 快速恢复算法:将拥塞窗口和慢开始阈值调整为当前的一半,开始执行拥塞避免算法。

四、网络层

  • IP:网际协议。定义了数据传输的基本单元和格式,还定义了数据包的交付方式和路由选择;
  • ICMP:Internet控制报文协议。用于检测网络的连线状况,是Ping的工作协议;
  • RIP:路由信息协议,使用“跳数”衡量到达目标地址的距离;
  • IGMP:Internet组管理协议,用于实现组播、广播等通信。

四、数据链路层

4.1、ARP和RARP

  • ARP:地址解析协议。局域网中通信使用的是MAC地址,ARP协议用于将IP地址解析为MAC地址。流程如下:
    1. 请求主机封装自己IP地址、MAC地址、和要查询主机的IP地址,广播发送ARP请求。
    2. 目标IP主机收到请求后,将请求主机的IP、MAC地址缓存在自己的ARP缓存中,并单播给请求主机,自己的MAC地址。

用于局域网中,

  • RARP:反向地址解析协议。设备开机时无IP地址,发送RARP请求,路由器将会给其分配IP地址。

4.2、在浏览器中输入url地址后显示主页的过程?

  1. 根据域名,解析得到服务器IP;
  2. 使用TCP与服务器建立连接;
  3. 客户端向服务端发送请求;
  4. 服务端接收请求返回响应;
  5. 短连接则关闭TCP连接,长连接则保持连接;
  6. 客户端浏览器解析返回的响应数据;
  7. 浏览器渲染布局;

4.3、为什么服务器会缓存这一项功能?如何实现的?

缓存常位于内存中,读取速度更快,并且在地理位置上一般也比源服务器更近。 实现:

  • 缓存在本地浏览器中;
  • 缓存在代理服务器中;

4.5、端口有效范围是多少到多少?’

0~65525

五、攻击

5.1、SQL注入攻击了解吗?

指攻击者在http请求中注入了恶意的SQL代码,访问数据库时,恶意的SQL语句被一起构造,从而造成数据泄漏等问题。 可以使用有效性检验、限制字符串长度、过滤SQL中特殊字符等方法去解决。

5.2、DDos 攻击了解吗?

分布式拒绝服务攻击。指使用多个客户端向同一个服务发送大量非法请求,从而让服务器压力过大,无法处理正常用户的请求。

5.3、SYN攻击是什么?

短时间伪造大量不存在的IP地址向服务端请求连接,服务端响应并一直等待客户端回复,由于客户端IP不存在,导致服务端不断重发确认包直至超时,这些伪造的SYN包长时间占用未连接队列,导致正常包被丢弃,从而引起网络瘫痪。