三次握手四次挥手原理

TCP三次握手四次挥手原理详解

TCP连接的三次握手四次挥手是建立和释放可靠连接的核心机制,下面通过流程、报文细节、状态变化和常见问题展开说明:


一、三次握手(Connection Establishment)

目的:同步双方的初始序列号(ISN),确认双方收发能力正常。

详细流程:
  1. 第一次握手(SYN=1, seq=x)

    • 客户端发送SYN报文(SYN=1,表示请求建立连接)
    • 随机生成初始序列号seq=x(ISN,避免历史冲突)
    • 客户端状态CLOSEDSYN_SENT
  2. 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

    • 服务端收到SYN后,回复SYN+ACK报文:
      • SYN=1:服务端也发起同步
      • ACK=1:确认客户端的SYN
      • seq=y:服务端的初始序列号
      • ack=x+1:期望下次收到客户端x+1号数据
    • 服务端状态LISTENSYN_RCVD
  3. 第三次握手(ACK=1, seq=x+1, ack=y+1)

    • 客户端确认服务端的SYN
      • ACK=1:确认服务端的SYN
      • seq=x+1(因第一次握手消耗一个序列号)
      • ack=y+1:期望下次收到服务端y+1号数据
    • 状态变化
      • 客户端:SYN_SENTESTABLISHED
      • 服务端收到后:SYN_RCVDESTABLISHED
关键点:
  • 为什么需要三次?
    防止已失效的SYN请求突然到达服务端导致资源浪费(两次无法阻止历史重复报文)。
  • ISN随机生成:避免预测序列号发动攻击。

二、四次挥手(Connection Termination)

目的:双方独立关闭数据通道,确保数据完整传输。

详细流程:
  1. 第一次挥手(FIN=1, seq=u)

    • 主动关闭方(如客户端)发送FIN报文(FIN=1)
    • 携带当前序列号seq=u(等于已发送数据的最后一个字节+1)
    • 客户端状态ESTABLISHEDFIN_WAIT_1
  2. 第二次挥手(ACK=1, ack=u+1)

    • 被动关闭方(如服务端)回复ACK确认:
      • ack=u+1:期望下次收到u+1号数据
    • 服务端状态ESTABLISHEDCLOSE_WAIT
    • 客户端状态:收到后FIN_WAIT_1FIN_WAIT_2
    • 此时客户端→服务端方向连接关闭,但服务端仍可发送数据。
  3. 第三次挥手(FIN=1, seq=v, ack=u+1)

    • 服务端数据发送完毕后,发送FIN报文:
      • seq=v:服务端最终序列号
      • ack=u+1:仍确认客户端的FIN
    • 服务端状态CLOSE_WAITLAST_ACK
  4. 第四次挥手(ACK=1, ack=v+1)

    • 客户端确认服务端的FIN
      • ack=v+1:确认服务端的关闭请求
    • 客户端状态FIN_WAIT_2TIME_WAIT(等待2MSL)→ CLOSED
    • 服务端状态:收到后LAST_ACKCLOSED
关键点:
  • 为什么需要四次?
    TCP是全双工的,必须分别关闭两个方向的数据流。
  • TIME_WAIT状态的作用
    • 确保最后一个ACK能到达服务端(若丢失,服务端会重传FIN
    • 让网络中残留的旧报文失效(等待2MSL,即2倍最大报文生存时间)。

三、常见问题分析

1. 握手时SYN洪泛攻击(SYN Flood)如何防范?
  • 原理:攻击者发送大量SYN但不回复ACK,耗尽服务端资源。
  • 解决方案
    • SYN Cookie技术(不保存半连接状态)
    • 限制SYN并发速率
2. 为什么TIME_WAIT需要2MSL?
  • MSL(Maximum Segment Lifetime):报文最大生存时间(通常30s-2min)
  • 两个目的
    • 确保最后一个ACK能重传到对端
    • 让本连接的所有报文在网络中消失,避免影响新连接
3. 出现大量CLOSE_WAIT状态怎么办?
  • 原因:被动关闭方未调用close()释放连接。
  • 排查:检查应用程序是否漏了关闭Socket或线程阻塞。

四、抓包示例(Wireshark)

  • 三次握手
    #1 [SYN] Seq=0  
    #2 [SYN, ACK] Seq=0, Ack=1  
    #3 [ACK] Seq=1, Ack=1  
    
  • 四次挥手
    #1 [FIN, ACK] Seq=1, Ack=1  
    #2 [ACK] Ack=2  
    #3 [FIN, ACK] Seq=1, Ack=2  
    #4 [ACK] Ack=2  
    

五、协议设计思想

  • 三次握手:最小化资源占用前提下保证可靠性。
  • 四次挥手:优雅关闭全双工通道,兼顾效率与数据完整性。

如果需要进一步分析特定场景(如握手失败、RST报文等),可以继续探讨!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值