admin管理员组

文章数量:1446753

三次握手和四次挥手的理解

代码语言:java复制
首先,三次握手。目的是建立可靠的连接,确保双方都能发送和接收数据。三次握手的步骤是:客户端发送SYN,服务器响应SYN-ACK,客户端再发送ACK。这里的关键是序列号的交换和确认,防止已失效的连接请求到达服务器,导致资源浪费。第二次握手传回SYN是为了告知客户端服务器的初始序列号,这样双方才能同步。

然后是四次挥手。关闭连接时,由于TCP是全双工的,每个方向都需要单独关闭。服务器收到FIN后可能还有数据要发送,所以不能立即关闭,导致需要四次挥手。为什么不能合并ACK和FIN,因为服务器可能需要处理剩余数据。

另外,TIME_WAIT状态的原因。客户端等待2MSL是为了确保最后的ACK到达,并让旧连接的报文消失,避免混淆。这也是四次挥手中重要的部分。

一、三次握手:TCP连接的建立过程

三次握手是TCP协议建立可靠连接的核心机制,确保双方具备双向通信能力并同步初始序列号(ISN)。具体过程如下:

  1. 第一次握手(SYN):客户端发送带有SYN标志的报文,携带随机生成的初始序列号(如seq=x),进入SYN-SENT状态,表示请求建立连接
  2. 第二次握手(SYN+ACK):服务器收到SYN后,返回SYN和ACK标志的报文,携带自己的初始序列号(如seq=y),并确认客户端的序列号(ack=x+1),进入SYN-RCVD状态
  3. 第三次握手(ACK):客户端确认服务器的序列号(ack=y+1),发送ACK报文,双方进入ESTABLISHED状态,连接正式建立

必要性

  • 防止历史连接干扰:若客户端发送的旧SYN因网络延迟到达服务器,三次握手可确保服务器仅响应最新的SYN请求,避免资源浪费
  • 同步初始序列号:初始序列号用于数据包的顺序控制,双方通过三次握手交换并确认序列号,确保后续数据传输有序

二、四次挥手:TCP连接的关闭过程

四次挥手用于安全终止全双工通信,确保双方数据发送完毕且无残留报文。具体过程如下:

  1. 第一次挥手(FIN):主动关闭方(如客户端)发送FIN报文,进入FIN-WAIT-1状态,表示不再发送数据
  2. 第二次挥手(ACK):被动关闭方(如服务器)返回ACK报文确认FIN,进入CLOSE-WAIT状态,此时仍可发送剩余数据
  3. 第三次挥手(FIN):被动关闭方数据发送完毕后发送FIN报文,进入LAST-ACK状态,请求关闭反向连接
  4. 第四次挥手(ACK):主动关闭方发送ACK确认,进入TIME-WAIT状态,等待2MSL(报文最大生存时间)后关闭;被动关闭方收到ACK后立即关闭

必要性

  • 全双工关闭:TCP允许双向独立关闭,四次挥手确保双方各自完成数据发送与确认
  • 处理延迟报文TIME-WAIT状态等待2MSL,防止旧连接的残留报文干扰新连接,同时确保最后的ACK被接收

三、关键问题解析

  1. 为什么握手是三次,挥手是四次?
    • 握手时,服务器可将SYN和ACK合并为一次响应;而挥手时,被动关闭方可能需处理剩余数据,ACK和FIN无法合并,需分开发送
  2. TIME-WAIT状态的意义
    • 确保ACK到达被动关闭方,若丢失则被动方重传FIN,主动方重新响应
    • 等待旧报文在网络中消失,避免与新连接混淆
  3. 握手与挥手的异常处理
    • 若握手过程中报文丢失,发送方会超时重传(如客户端重传SYN)
    • 挥手时若ACK丢失,被动关闭方会重传FIN,主动方需重新确认

四、总结对比

阶段

目的

核心动作

状态变化

三次握手

建立双向通信,同步序列号

SYN、SYN+ACK、ACK

SYN-SENT → SYN-RCVD → ESTABLISHED

四次挥手

安全终止连接,处理残留数据

FIN → ACK → FIN → ACK

FIN-WAIT → CLOSE-WAIT → LAST-ACK

通过三次握手和四次挥手,TCP协议实现了连接的可靠建立与释放,解决了网络延迟、丢包和重复报文等问题,是保障互联网数据传输稳定的基石

三次握手和四次挥手的生活化比喻

1. 三次握手:打电话的确认过程

场景:你(客户端)想给朋友(服务器)打电话,确保双方都能正常通话。

步骤

  1. 第一次握手(SYN):你拨通电话,说:“喂,能听到吗?”(发送SYN,请求连接)。
  2. 第二次握手(SYN+ACK):朋友听到后,回答:“能听到,你能听到我吗?”(发送SYN+ACK,确认你的请求并请求反向连接)。
  3. 第三次握手(ACK):你回答:“能听到!”(发送ACK,确认对方的请求),双方开始正常通话(连接建立)。

核心:通过三次确认,确保双方都能正常沟通,避免因网络问题导致一方无法通话。

2. 四次挥手:挂电话的告别过程

场景:通话结束后,双方需要确认对方没有其他话要说,才能安全挂断电话。

步骤

  1. 第一次挥手(FIN):你说:“我没其他事了,先挂了。”(发送FIN,请求关闭连接)。
  2. 第二次挥手(ACK):朋友回答:“好的,我知道了。”(发送ACK,确认你的请求),此时朋友可能还有话要说,继续通话。
  3. 第三次挥手(FIN):朋友说完后,说:“我也说完了,挂了吧。”(发送FIN,请求关闭反向连接)。
  4. 第四次挥手(ACK):你回答:“好的,再见!”(发送ACK,确认对方的请求),双方挂断电话(连接关闭)。

核心:通过四次确认,确保双方都没有未说完的话,避免一方提前挂断导致信息丢失。

总结

阶段

生活比喻

核心动作

三次握手

打电话确认双方能正常通话

拨号 → 确认 → 开始通话

四次挥手

挂电话确认双方没有未说完的话

说再见 → 确认 → 对方说再见 → 确认挂断

通过这个比喻,可以直观理解三次握手和四次挥手的作用:确保通信的可靠性和完整性,就像打电话时需要确认双方都能听到,挂电话时要确认双方都没有未说完的话

本文标签: 三次握手和四次挥手的理解