三次握手,四次挥手

三次握手和四次挥手是 TCP 协议中用于建立连接和断开连接的核心机制,TCP 是面向连接、可靠的传输层协议,这两个机制保障了连接的有序建立与关闭。
一、 三次握手(TCP 连接建立)
目的是同步通信双方的序列号和确认号,并交换 TCP 窗口大小等参数,确保双方都具备收发数据的能力。参与方:客户端(主动发起连接)和服务端(被动监听连接)
具体过程
1.第一次握手(SYN)客户端向服务端发送 SYN 报文,报文主要包含:
标志位:SYN=1(表示请求建立连接)
初始序列号:seq=x
此时客户端进入 SYN_SENT 状态,等待服务端确认。
2.第二次握手(SYN + ACK)服务端收到 SYN 报文后,确认可以建立连接,向客户端发送 SYN+ACK 报文,包含:
标志位:SYN=1,ACK=1
确认号:ack=x+1(确认客户端的序列号)
服务端初始序列号:seq=y
此时服务端进入 SYN_RCVD 状态。
3.第三次握手(ACK)客户端收到 SYN+ACK 报文后,向服务端发送 ACK 报文,包含:
标志位:ACK=1
确认号:ack=y+1(确认服务端的序列号)
序列号:seq=x+1
发送完成后,客户端进入 ESTABLISHED 状态;服务端收到该报文后,也进入 ESTABLISHED 状态。
至此,TCP 连接建立完成,双方可以开始传输数据。
为什么需要三次握手?
核心是防止失效的连接请求报文段被服务端接收,导致资源浪费。如果只进行两次握手,服务端发送 SYN+ACK 后就认为连接建立,但如果客户端的 SYN 报文是延迟的失效报文,客户端不会理会服务端的 SYN+ACK,服务端会一直等待客户端的 ACK,造成资源占用。
二、 四次挥手(TCP 连接关闭)
TCP 是全双工通信,双方都需要独立关闭自己的发送通道,因此需要四次交互。参与方:主动关闭方和被动关闭方(客户端和服务端都可以作为主动关闭方)
具体过程
1.第一次挥手(FIN)主动关闭方向被动关闭方发送 FIN 报文,请求关闭连接,包含:
标志位:FIN=1,ACK=1
序列号:seq=u
主动关闭方进入 FIN_WAIT_1 状态,此时主动关闭方不再发送数据,但仍可接收数据。
2.第二次挥手(ACK)被动关闭方收到 FIN 报文后,发送 ACK 报文确认,包含:
标志位:ACK=1
确认号:ack=u+1
序列号:seq=v
被动关闭方进入 CLOSE_WAIT 状态;主动关闭方收到 ACK 后,进入 FIN_WAIT_2 状态,等待被动关闭方的 FIN 报文。
此时,主动关闭方的发送通道已关闭,但被动关闭方仍可发送数据。
3.第三次挥手(FIN)被动关闭方完成数据发送后,向主动关闭方发送 FIN 报文,请求关闭自己的发送通道,包含:
标志位:FIN=1,ACK=1
序列号:seq=w
确认号:ack=u+1
被动关闭方进入 LAST_ACK 状态,等待主动关闭方的确认。
4.第四次挥手(ACK)主动关闭方收到 FIN 报文后,发送 ACK 报文确认,包含:
标志位:ACK=1
确认号:ack=w+1
序列号:seq=u+1
主动关闭方进入 TIME_WAIT 状态(等待 2MSL 时间后才会进入 CLOSED 状态);被动关闭方收到 ACK 后,直接进入 CLOSED 状态。
当主动关闭方等待 2MSL 超时后,连接彻底关闭。
为什么需要四次挥手?
因为 TCP 是全双工模式,关闭连接时,双方的发送通道需要独立关闭。被动关闭方收到 FIN 后,可能还有数据要发送,不能立即关闭自己的发送通道,因此需要先回复 ACK 确认 “我知道你要关闭了”,等数据发送完后,再发送 FIN 关闭自己的通道。
关于 TIME_WAIT 状态
2MSL:MSL 是报文最大生存时间,2MSL 是主动关闭方等待的时间。
作用:确保被动关闭方收到最后的 ACK 报文;防止延迟的报文段出现在新的连接中。

posted @ 2025-12-30 08:21  四叶草z  阅读(4)  评论(0)    收藏  举报