目录

🍏 TCP 的三次握手与四次挥手

相关问题:

  • 说说为什么需要 TCP 的三次握手与四次挥手?

# 三次握手

TCP 连接的三次握手过程:

  • 第一次握手:客户端给服务器发送一个 SYN 报文,指明客户端的初始化序列号 ISN,此时客户端处于 SYN_SENT 状态;

    作用:客户发送网络包、服务器能够接收。这样服务端可以得出:客户端的发送能力和服务端的接收能力正常。

  • 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,为了确认 客户端的 SYN ,将客户端的 ISN + 1 作为 ACK 的值,此时服务器处于 SYN_RCVD 状态;

    作用:服务端发送包,客户端收到了。这样客户端可以得出:服务端的接收、发送能力,客户端的接收、发送能力正常。不过此时服务端不能确定客户端的接受能力是否正常。

  • 第三次握手: 客户端收到 SYN 报文之后,会发送一个 ACK 报文,值为服务器的 ISN + 1。此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时双方建立起了连接。

    作用:客户端发送包,服务端接收到了。服务端最终得出客户端的接受能力正常。最后客户端和服务端的接收和发送能力都正常。

三次握手后确认双方的接收和发送能力正常,可以正常通信。

  • 为什么不是二次握手。两次握手时,发送端可以确定自己发送的信息对方能够接收,并且确定对方发送的包自己能收到,但是接收端只能确定发送端的发送能力,无法确定自己发的包对方是否后能收到。并且两次握手,客户端可能因为网络阻塞等原因发送多个请求报文,延时到达的请求又会和服务器建立连接,浪费服务器的资源。

# 四次挥手

TCP 连接四次挥手结束连接的过程:

  • 第一次挥手:客户端发送一个 FIN 报文,报文中指定一个序列号,此时客户端处于 FIN_WAIT 的状态,停止发送数据,等待服务端的确认。

  • 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表示服务端已经收到了客户端的报文,此时服务器处于 CLOSE_WAIT 状态。

  • 第三次挥手:服务端也想断开连接,就和客户端的第一次挥手一样,发给客户端一个 FIN,并且在报文中指定一个序列号,此时服务端处于 FIN_WAIT 状态。

  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,并且把服务端的序列号值 + 1 作为 ACK 报文的序列号,此时客户端处于 TIME_WAIT 状态。需要过一段时间以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。服务端收到 ACK 报文之后,就处于关闭连接 CLOSED 状态了。

四次挥手的原因:服务端收到客户端的 FIN 报文之后,并不会立即关闭连接,而是先发送一个 ACK 包告诉客户端收到关闭连接的通知,只有当服务器的所有报文发送完毕之后,才会发送 FIN 报文断开连接,因此需要四次握手。

# 参考

📢 上次更新: 2022/09/02, 10:18:16