三次握手(建立连接)
目的: 确保客户端和服务器双方都能正常发送和接收数据。
第一次握手(SYN): 客户端发送 SYN=1 报文,并携带初始序列号 seq=x,表示请求建立连接。
- 作用:客户端告诉服务器,“我想和你通信,我的初始序号是x”。
第二次握手(SYN+ACK): 服务器收到 SYN 后,回复 SYN=1 和 ACK=1,携带自己的初始序列号 seq=y,以及对客户端序号的确认号 ack=x+1。
- 作用:服务器回应,“我同意连接,我的初始序号是y,已收到你的序号x”。
第三次握手(ACK): 客户端收到服务器的 SYN+ACK 后,发送 ACK=1,确认号 ack=y+1。
- 作用:客户端确认,“已收到你的回应,可以开始通信了”。
趣味图解:
为什么需要三次握手?
- 防止历史连接的干扰:若旧的
SYN报文因网络延迟到达服务器,三次握手可确保客户端能及时拒绝无效请求。 - 同步初始序列号:双方确认彼此的初始序号,保证后续数据传输的有序性。
- 避免资源浪费:若只有两次握手,服务器可能因未收到客户端的确认而一直等待,导致资源耗尽。
四次挥手(终止连接)
目的: 确保双方数据已传输完毕,安全关闭连接。
第一次挥手(FIN): 主动关闭方(如客户端)发送 FIN=1 报文,携带序列号 seq=u。
- 作用:客户端告诉服务器,“我没有数据要发了,准备关闭连接”。
第二次挥手(ACK): 服务器收到 FIN 后,回复 ACK=1,确认号 ack=u+1。
- 作用:服务器回应,“收到你的关闭请求,但我可能还有数据要发”。
第三次挥手(FIN): 服务器发送自己的 FIN=1 报文,携带序列号 seq=w。
- 作用:服务器告诉客户端,“我的数据发完了,准备关闭连接”。
第四次挥手(ACK): 客户端收到服务器的 FIN 后,回复 ACK=1,确认号 ack=w+1。
- 作用:客户端确认,“收到你的关闭请求,连接可以关闭了”。
趣味图解:
为什么需要四次挥手?
-
全双工通信:TCP 连接是双向的,双方需独立关闭各自的通道。
- 客户端关闭发送通道后(第一次挥手),服务器可能仍需发送剩余数据(第二次挥手)。
- 服务器发完数据后关闭自己的发送通道(第三次挥手),客户端最终确认(第四次挥手)。
-
确保数据完整性:防止一方突然关闭导致另一方数据丢失。