三次握手和四次挥手的理解
代码语言:java复制首先,三次握手。目的是建立可靠的连接,确保双方都能发送和接收数据。三次握手的步骤是:客户端发送SYN,服务器响应SYN-ACK,客户端再发送ACK。这里的关键是序列号的交换和确认,防止已失效的连接请求到达服务器,导致资源浪费。第二次握手传回SYN是为了告知客户端服务器的初始序列号,这样双方才能同步。
然后是四次挥手。关闭连接时,由于TCP是全双工的,每个方向都需要单独关闭。服务器收到FIN后可能还有数据要发送,所以不能立即关闭,导致需要四次挥手。为什么不能合并ACK和FIN,因为服务器可能需要处理剩余数据。
另外,TIME_WAIT状态的原因。客户端等待2MSL是为了确保最后的ACK到达,并让旧连接的报文消失,避免混淆。这也是四次挥手中重要的部分。
一、三次握手:TCP连接的建立过程
三次握手是TCP协议建立可靠连接的核心机制,确保双方具备双向通信能力并同步初始序列号(ISN)。具体过程如下:
- 第一次握手(SYN):客户端发送带有SYN标志的报文,携带随机生成的初始序列号(如seq=x),进入
SYN-SENT
状态,表示请求建立连接 - 第二次握手(SYN+ACK):服务器收到SYN后,返回SYN和ACK标志的报文,携带自己的初始序列号(如seq=y),并确认客户端的序列号(ack=x+1),进入
SYN-RCVD
状态 - 第三次握手(ACK):客户端确认服务器的序列号(ack=y+1),发送ACK报文,双方进入
ESTABLISHED
状态,连接正式建立
必要性:
- 防止历史连接干扰:若客户端发送的旧SYN因网络延迟到达服务器,三次握手可确保服务器仅响应最新的SYN请求,避免资源浪费
- 同步初始序列号:初始序列号用于数据包的顺序控制,双方通过三次握手交换并确认序列号,确保后续数据传输有序
二、四次挥手:TCP连接的关闭过程
四次挥手用于安全终止全双工通信,确保双方数据发送完毕且无残留报文。具体过程如下:
- 第一次挥手(FIN):主动关闭方(如客户端)发送FIN报文,进入
FIN-WAIT-1
状态,表示不再发送数据 - 第二次挥手(ACK):被动关闭方(如服务器)返回ACK报文确认FIN,进入
CLOSE-WAIT
状态,此时仍可发送剩余数据 - 第三次挥手(FIN):被动关闭方数据发送完毕后发送FIN报文,进入
LAST-ACK
状态,请求关闭反向连接 - 第四次挥手(ACK):主动关闭方发送ACK确认,进入
TIME-WAIT
状态,等待2MSL(报文最大生存时间)后关闭;被动关闭方收到ACK后立即关闭
必要性:
- 全双工关闭:TCP允许双向独立关闭,四次挥手确保双方各自完成数据发送与确认
- 处理延迟报文:
TIME-WAIT
状态等待2MSL,防止旧连接的残留报文干扰新连接,同时确保最后的ACK被接收
三、关键问题解析
- 为什么握手是三次,挥手是四次?
- 握手时,服务器可将SYN和ACK合并为一次响应;而挥手时,被动关闭方可能需处理剩余数据,ACK和FIN无法合并,需分开发送
- TIME-WAIT状态的意义:
- 确保ACK到达被动关闭方,若丢失则被动方重传FIN,主动方重新响应
- 等待旧报文在网络中消失,避免与新连接混淆
- 握手与挥手的异常处理:
- 若握手过程中报文丢失,发送方会超时重传(如客户端重传SYN)
- 挥手时若ACK丢失,被动关闭方会重传FIN,主动方需重新确认
四、总结对比
阶段 | 目的 | 核心动作 | 状态变化 |
---|---|---|---|
三次握手 | 建立双向通信,同步序列号 | SYN、SYN+ACK、ACK | SYN-SENT → SYN-RCVD → ESTABLISHED |
四次挥手 | 安全终止连接,处理残留数据 | FIN → ACK → FIN → ACK | FIN-WAIT → CLOSE-WAIT → LAST-ACK |
通过三次握手和四次挥手,TCP协议实现了连接的可靠建立与释放,解决了网络延迟、丢包和重复报文等问题,是保障互联网数据传输稳定的基石
三次握手和四次挥手的生活化比喻
1. 三次握手:打电话的确认过程
场景:你(客户端)想给朋友(服务器)打电话,确保双方都能正常通话。
步骤:
- 第一次握手(SYN):你拨通电话,说:“喂,能听到吗?”(发送SYN,请求连接)。
- 第二次握手(SYN+ACK):朋友听到后,回答:“能听到,你能听到我吗?”(发送SYN+ACK,确认你的请求并请求反向连接)。
- 第三次握手(ACK):你回答:“能听到!”(发送ACK,确认对方的请求),双方开始正常通话(连接建立)。
核心:通过三次确认,确保双方都能正常沟通,避免因网络问题导致一方无法通话。
2. 四次挥手:挂电话的告别过程
场景:通话结束后,双方需要确认对方没有其他话要说,才能安全挂断电话。
步骤:
- 第一次挥手(FIN):你说:“我没其他事了,先挂了。”(发送FIN,请求关闭连接)。
- 第二次挥手(ACK):朋友回答:“好的,我知道了。”(发送ACK,确认你的请求),此时朋友可能还有话要说,继续通话。
- 第三次挥手(FIN):朋友说完后,说:“我也说完了,挂了吧。”(发送FIN,请求关闭反向连接)。
- 第四次挥手(ACK):你回答:“好的,再见!”(发送ACK,确认对方的请求),双方挂断电话(连接关闭)。
核心:通过四次确认,确保双方都没有未说完的话,避免一方提前挂断导致信息丢失。
总结
阶段 | 生活比喻 | 核心动作 |
---|---|---|
三次握手 | 打电话确认双方能正常通话 | 拨号 → 确认 → 开始通话 |
四次挥手 | 挂电话确认双方没有未说完的话 | 说再见 → 确认 → 对方说再见 → 确认挂断 |
通过这个比喻,可以直观理解三次握手和四次挥手的作用:确保通信的可靠性和完整性,就像打电话时需要确认双方都能听到,挂电话时要确认双方都没有未说完的话