2024最新网络编程 面试题解析
三次握手和四次挥手
三次握手
三次握手是TCP/IP协议中用于建立可靠连接的过程。具体步骤如下:
-
第一次握手:客户端发送一个带有SYN标志的TCP报文段给服务器,请求建立连接,并进入SYN_SENT状态。
-
第二次握手:服务器接收到SYN报文段后,若同意连接,则回应一个带有SYN和ACK标志的报文段给客户端,确认已收到客户端的连接请求,同时也向客户端请求连接,服务器进入SYN_RECEIVED状态。
-
第三次握手:客户端收到服务器的SYN+ACK报文后,发送一个带有ACK标志的报文段作为确认,至此,客户端和服务器都已确认对方的收发能力,双方建立起一条TCP连接,客户端进入ESTABLISHED状态,随后服务器收到ACK后也进入ESTABLISHED状态。
三次握手是为了确保在不可靠信道上能够可靠地建立连接,防止已失效的连接请求报文突然又传送到服务器而产生错误。
四次挥手
四次挥手是TCP/IP协议中用于断开连接的过程,原因在于TCP连接是全双工的,因此每个方向上的数据传输都需要单独关闭。步骤如下:
-
第一次挥手:主动关闭连接的一方(通常为客户端)发送一个带有FIN标志的报文段,表明该方向的数据传输已完成,进入FIN_WAIT_1状态。
-
第二次挥手:服务器接收到FIN报文后,发送一个带有ACK标志的报文段,确认收到了关闭请求,但服务器可能还有数据未发送完,因此继续保持连接,客户端进入FIN_WAIT_2状态。
-
第三次挥手:当服务器完成数据发送任务后,也发送一个带有FIN标志的报文段给客户端,请求关闭连接,服务器进入LAST_ACK状态。
-
第四次挥手:客户端收到服务器的FIN报文后,发送一个ACK报文段作为回应,确认已收到服务器的关闭请求。然后客户端进入TIME_WAIT状态等待一段时间确保服务器收到最后一个ACK,而服务器收到这个ACK后关闭连接。最后,客户端在等待一段时间(通常是2MSL)后,确定没有残留的报文段到达时,也会关闭连接。
之所以需要四次挥手是因为在全双工通信中,每一方都有自己的数据传输通道,关闭连接必须分别在两个方向上进行确认。
TCP粘包/拆包
TCP粘包是指在一个TCP连接中,发送方连续发送的多个数据包可能会合并成一个较大的数据包发送出去,而在接收方看来,本来应该分开的数据包被当作一个大的数据块接收了。
TCP拆包则是相反的现象,即发送方发送的一个大包可能会被TCP协议在传输过程中分割成多个较小的数据包。
TCP粘包/拆包的解决办法
解决TCP粘包/拆包问题主要依靠应用层协议的设计:
-
定长消息:每个消息固定长度,不足部分补空格或其他字符。
-
消息边界:在每条消息的末尾附加特定的分隔符,接收方通过分隔符来区分不同的消息。
-
消息头包含长度字段:在消息前增加一个表示消息长度的字段,接收方可以根据这个长度字段来区分不同的消息。
-
协议设计采用面向消息的思路:在应用层设计合适的消息结构,比如添加消息ID、消息长度、消息体等内容,通过解析这些元数据来正确组装和拆分消息。
从浏览器中输入URL到页面加载发生的过程
-
域名解析:浏览器查找域名对应的IP地址,首先检查本地缓存,如果没有则通过DNS服务器递归查询。
-
建立TCP连接:浏览器使用获得的IP地址与服务器建立TCP连接,这涉及三次握手过程。
-
发送HTTP请求:浏览器构建HTTP请求报文(GET或POST),通过建立好的TCP连接发送给服务器。
-
服务器处理请求:服务器接收到请求后解析请求报文,调用相应的后台程序进行处理。
-
服务器返回响应:服务器完成请求处理后,封装HTTP响应报文并通过TCP连接发送给浏览器。
-
浏览器解析渲染页面:浏览器接收响应报文,开始解析HTML内容,并下载CSS、JavaScript和其他资源,按照HTML标准渲染页面。
-
连接关闭:数据传输完成后,TCP连接经过四次挥手关闭,也可以选择保持长连接以复用。
长连接和短连接
-
长连接:在网络通信中,长连接是指在完成一次数据交换后,连接仍然保持打开状态,后续的多次请求都可以沿用同一个连接,无需每次通信都重新建立连接。例如,HTTP Keep-Alive、WebSocket、TCP长连接等。
-
短连接:短连接则是指每次通信完毕后都会关闭连接,下次通信时需要重新建立连接。典型的例子是HTTP 1.0默认的非Keep-Alive模式,每次请求和响应结束后TCP连接都会被关闭。相较于长连接,短连接减少了闲置连接占用的系统资源,但频繁建立和关闭连接的开销较大。