天天看点

【不失业计划】计算机网络常见面试10题整理

计算机网络面试10题

    • 1、请详细介绍下TCP的三次握手机制,为什么要三次握手?
    • 2、简单介绍下HTTP协议中缓存的处理流程?
    • 3、在地址栏键入URL后,网络世界发生么什么?
    • 4、使用HTTP长连接有哪些优点?
    • 5、CLOSE_WAIT状态产生的原因?
    • 6、介绍下多播是怎样实现的?
    • 7、服务器的最大并发连接数是多少?
    • 8、TCP和UDP协议该如何选择?
    • 9、TLS/SSL协议是如何保障信息安全的?
    • 10、HTTP2协议有哪些优点?

本文整理源自bilibili极客时间

视频地址:10 道大厂面试必考的计算机网络问题

部分内容来自hherima优秀博客: HTTPS协议详解(二):TLS/SSL工作原理

1、请详细介绍下TCP的三次握手机制,为什么要三次握手?

解答思路:先说明TCP链接的特点:可靠性、双工,再解释为什么需要握手,最后解释为什么是三次而不是两次和四次。

答:

首先,TCP连接具有可靠性,当TCP发送一个段之后,会启动一个定时,等待目的端确认接受到这个报文段,如果不能及时地收到一个确认,将会重发这个报文段。同时TCP还具有双工通信的特点,即客户端和服务器可以同时发消息,所以在TCP中服务器是可以发请求的;

因此在TCP的连接前需要知道对方的序列号,而获取(同步)序列号的方式就是通过握手,来确定消息的传输双方,通过握手还能同步传输双方的MSS、滑动窗口等信息;

第一次握手,客户端会将自己的初始序号(seq=x)建立连接请求(SYN=1,ACK=0)发送给服务端,之后进入SYN-SENT状态;第二次握手,服务端在收到连接请求报文段之后,如果同意,则会发送一个应答包含同意连接请求(SYN=1,ACK=1)服务端初始序号(seq=y)和希望下一个数据报开始字节的序号(ack=x+1),服务端进入SYN-RCVD状态;第三次握手,客户端收到服务端的连接同意应答后,需要向服务端发送一个确定报文包含确认收到(ACK=1)和发送序号(seq=x+1)以及希望下一个数据报开始字节的序号(ack=y+1)之后进入ESTABLISHED状态,服务端收到该消息也进入ESTABLISHED状态,双方开始通信。

为什么不是四次?四次可能是在服务端发送时将确认请求和自身初始序号发送给客户端时分两次发送或最后服务端发送给客户端确认收到相应,但是不管是那种情况,在三次发送数据的基础上就已经可以建立好连接了,四次会造成资源浪费。

为什么不是两次?(这里的两次指的是客户端不发送最后一次握手)TCP有一个很重要的特性是可靠数据传输,所以在规定时间内没有收到另一端的确认就会重传该请求,若只有两次握手,TCP在发送连接请求时遇到了网络阻塞的情况,没有立即收到确认消息就会重新发送一次连接请求,此时的第二次请求被服务端接收并完成了连接,知道使用完成关闭,此时第一次连接的请求发送到服务端,只有两次握手的话服务端收到该连接请求回复之后会立即进入ESTABLISHED状态,等待数据传输,但是此时客户端早就进入了CLOSED状态不会再相应服务端,会造成服务端一直等待,连接资源浪费。

2、简单介绍下HTTP协议中缓存的处理流程?

解答思路:回答缓存的应用流程是什么? 然后说明一下与缓存相关的HTTP头部有哪些?

答:

在HTTP协议中缓存的应用流程为:

​ 1、当浏览器发起请求,会先查询

Cache-Control

判断内容是否过期,未过期则直接读取浏览器端的缓存信息,不发送HTTP请求,若过期进入第2步;

​ 2、此时浏览器缓存过期,判断上次返回头文件中是否含有

Etag

信息,如果有则带上

If-None-Match

字段信息发送请求给服务器,服务端判断

Etag

未修改则返回304,如果修改则返回200,否则进入第3步;

​ 3、此时上次返回的头文件中没有

Etag

信息,此时判断上次返回头文件中是否含有

Last-Modifed

信息,有则带上

If-Modified-Since

字段信息发送请求,服务端判断

Last-Modified

失效则返回200, 有效则返回304,否则进入第4步;

​ 4、此时

Etag

Last-Modified

都不存在,则直接向服务器请求内容。

在缓存的应用流程中,涉及到的HTTP头部包含:

Expires(过期时间) 属性是HTTP控制缓存的基本手段

Cache-Control响应头信息,让网站的发布者可以更全面的控制他们的内容 (包含max-age、max-stale、min-fresh等)

ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据

last-modified 最近修改

参考图片流程

【不失业计划】计算机网络常见面试10题整理

3、在地址栏键入URL后,网络世界发生么什么?

解答思路:这个题主要从三个方面进行思考:缓存、http请求编码、网络分层的报文传输。

答:

在地址栏键入URL后,会发生如下事件:

  • 找到该域名的IP地址

    首先我们要访问 DNS 服务器获得网站对应的 IP 地址(这时我们需要把 DNS 报文封装到一个 UDP 报文中,进而封装到网络层的数据包中,填上源 IP,目的 DNS 服务器 IP 地址。接着封装链路层,填上网卡 MAC 地址和网关路由器 MAC 地址。接下来这个 DNS 请求报文就会经网关路由器发送给 DNS 服务器);紧接着我们通过各种缓存(浏览器缓存、系统缓存、路由器缓存等)进行查找;假设 DNS 服务器缓存有该网站的 IP 地址,(如果没有缓存会进一步向更高级的DNS服务器索要IP地址)。之后 DNS 服务器会返回该域名的 IP 地址。

  • 建立连接

    拿到目标网址的IP地址后可以与该网址服务器建立TCP连接,三次握手,建立好连接之后可以开始进行数据交互。

  • 浏览器给web服务器发送一个http请求

    在请求中定义了请求类型、要读取的URL、http版本、和他希望接收到什么类型等信息。

  • 服务器处理浏览器请求并做出响应,发回一个HTML响应
  • 传输完毕连接断开(涉及到四次挥手),并在浏览器显示HTML页面。

4、使用HTTP长连接有哪些优点?

解答思路:本题实际考(TCP连接),先解释HTTP中长连接和短链接如何区分(什么是长连接),然后解释使用长连接的优点有哪些?最后可以说明一下长连接也有哪些缺点?

答:

首先,长连接实际是指TCP连接的长连接,即客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。短链接即指每进行一次数据传输就要建立一次tcp连接。在http1.1前默认使用短链接,http1.1之后换成了长连接,会在响应头的Connection字段后换成keep-alive字段。

使用长连接最明显的优点就是减少了TCP连接的次数,即握手次数,因而减少了tcp请求次数,减少减少网络拥塞和后续的响应时间。其次他减少了慢启动的影响,在tcp的拥塞控制中,慢启动会导致每次TCP接收窗口收到确认时都会增长(慢启动大概理解为拥塞控制下建立一次连接传输速率慢慢变大,如果只建立一次tcp连接,则只受一次影响,短链接会受很多次)。最后因为不需要经常的建立及关闭连接,可以减少cpu和内存的使用。

当然长连接也是有一些缺点的,因为tcp连接是字符流传输,所以在长连接下也会变成串行连接,出现对头阻塞的情况。还可能会损害服务器的整体性能,如apache的长连接时间的长短,直接影响到服务器的并发数。

5、CLOSE_WAIT状态产生的原因?

解答思路:实际考察TCP四次挥手,先解释在TCP中主动端和被动端,再解释TCP四次挥手什么时候出现CLOSE_WAIT,最后解释为什么出现CLOSE_WAIT以及半打开状态

答:

首先在TCP连接中,不论是客户端还是服务端都可以主动关闭TCP连接,因此称主动关闭连接的一端叫主动端,另一端叫被动端。在TCP断开连接的时候会经历四次挥手:

第一次挥手:A(主动端)认为数据发送完毕,向B(被动端)发送连接释放请求,携带报文头数据为FIN=1(连接释放请求),seq=u(u-1是A向B发送的最后一个字节的序号),此时A进入FIN-WAIT-1状态;

第二次挥手:B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1(应答),seq=v(v-1是B向A发送的最后一个字节的序号),ack=u+1(表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节)。第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据;

第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态;

第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。

CLOSE-WAIT状态会在第二次挥手出现,说明此时被动端还没有发FIN给主动端,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。 此时称为半打开状态即TCP两端只有一端还可以传输数据。

实际上处于CLOSE-WAIT状态的时间是非常短的,调试过程中看到了该状态则说明了程序出现了bug。

6、介绍下多播是怎样实现的?

解答思路:先解释什么是多播,介绍使用多播有什么好处

答:

多播目前主要在局域网中使用的,广域网中使用还比较少。单播指的是一对一的(例如TCP,UDP也支持),多播是一对多的,分为广播和组播。多播数据报使用间接地址来编址,将分组从一个或多个发送方交付给一组接收方。使用多播对发送端比较友好,带宽消耗会更小。(这部分视频老师说的感觉没有答到问题上,自己找的这部分资料也比较少,答的不全面)

7、服务器的最大并发连接数是多少?

解答思路:先解释并发连接是受什么来决定的?在回答具体的最大并发连接数,以及如何扩大该连接数(延伸方面可以再回答怎么实现高并发以及LInux下的高并发优化)

答:

首先并发连接是由TCP连接的四元组来决定的,即源IP地址、目标IP地址、源端口、目标端口,我们知道在一个客户端最大的连接数量是65535(2^16-1,2字节,16比特,端口0预留不用),但是作为服务器肯定不仅仅只有这么多,服务端tcp连接4元组中只有源IP,源端口是可变的,因此最大tcp连接为源ip数×源端口数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是服务端端单机最大tcp连接数约为2的48次方。但是在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在Linux下可以采用AIO来消除磁盘I/O阻塞瓶颈。

8、TCP和UDP协议该如何选择?

解答思路:两者对比分别分析其优点,再根据实际情况进行选择。

答:

首先分析UDP的优点:它可以实现一对多的连接,是面向无连接的,发送数据前不需要建立连接,运行速度较快效率较高,报文简单,没有拥塞控制(无队头阻塞),网络出现拥塞不会使原主机发送速率降低,实时性更好;

再分析TCP的优点:TCP是一对一、面向连接的,基于字符流传输的,可以传输任意长度消息;提供可靠交付,无差错,不丢失,不重复,并按序到达;采用全双工通信,双方在任何时候都可以发送和接受数据,且通信双方都设有发送缓存和接受缓存,用来临时存放双向通信的数据;还有流量控制和拥塞控制。

常见的 TCP应用有:FTP、SSH、Telnet、SMTP、HTTP;

常见的UDP应用有:流媒体、实时游戏、直播、物联网、QQ 文件传输、QQ语音、QQ视频等

9、TLS/SSL协议是如何保障信息安全的?

解答思路:解释PKI证书体系、密钥交换协议、对称加密算法 (这部分在本人的理解范围之外了,引用其他优秀博客解释说明)

答:

TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

这部分内容详情见 HTTPS协议详解(二):TLS/SSL工作原理 作者:hherima

10、HTTP2协议有哪些优点?

解答思路:先说明HTTP1.0/1.1有哪些缺点,解释在HTTP2中如何解决的:多路复用、消息推送、HPACK编码、Stream优先级

答:

首先HTTP2是在HTTP1.x版本上的改良。

1、多路复用。HTTP1.x版本长连接不支持多路复用,是一次请求-响应,建立一个连接,用完关闭,每一个请求都要建立一个连接,在2.0可以多个请求可同时在一个连接上并行执行;

2、二进制分帧。1.x解析基于文本,在2.0中基于二进制,解析错误少,更高效;

3、服务端推送。此外在2.0之后支持服务端推送(一种在客户端请求之前发送数据的机制,服务器可以对客户端的一个请求发送多个响应。服务端推送让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义);

4、首部压缩。HTTP/1.1并不支持 HTTP 首部压缩,在 HTTP/2 使用了专门为首部压缩而设计的 HPACK 算法。

5、Stream优先级。在HTTP2.0中Stream可以根据依赖关系和权重设置优先级。先级高的stream会被server优先处理和返回给客户端,stream还可以依赖其它的sub streams。

优先级在有些场景下很有用,假想用户在用你的app浏览商品的时候,快速的滑动到了商品列表的底部,但前面的请求先发出,如果不把后面的请求优先级设高,用户当前浏览的图片要到最后才能下载完成,显然体验没有设置优先级好

继续阅读