一、TCP三次握手(三次交互建立可靠连接)

核心作用:确保通信双方具备双向收发能力,同步初始序列号,防止历史连接干扰。

步骤详解

1. 第一次握手(SYN)

  • 客户端发送带有SYN=1标志位的报文,并携带初始序列号`seq=x`。
  • 目的:告知服务器“我想建立连接”,并同步客户端的起始数据编号。
  • 客户端状态:`SYN_SENT`(等待服务器确认)。
  • 2. 第二次握手(SYN+ACK)

  • 服务器收到SYN报文后,回复SYN=1ACK=1的报文,携带自己的初始序列号`seq=y`,确认号`ack=x+1`。
  • 目的:同意连接请求,并同步服务器的起始数据编号,同时确认已收到客户端请求。
  • 服务器状态:`SYN_RCVD`(等待客户端确认)。
  • 3. 第三次握手(ACK)

  • 客户端发送ACK=1的报文,确认号`ack=y+1`,表示已收到服务器响应。
  • 目的:确认双方通信链路正常,正式建立连接。
  • 双方状态:`ESTABLISHED`(连接已建立,可传输数据)。
  • 为什么必须三次?

  • 两次握手风险:若客户端旧SYN报文延迟到达服务器,可能导致服务器误开无用连接,浪费资源。
  • 三次必要性:通过第三次握手确认双方收发能力和序列号同步,避免“历史连接”干扰。
  • 二、TCP四次挥手(四次交互安全关闭连接)

    核心作用:确保双方数据发送完毕,安全释放连接资源。

    步骤详解

    1. 第一次挥手(FIN)

  • 主动关闭方(如客户端)发送FIN=1的报文,携带序列号`seq=u`。
  • 目的:通知对方“我已发送完数据,请求关闭连接”。
  • 客户端状态:`FIN_WAIT_1`(等待服务器确认)。
  • 2. 第二次挥手(ACK)

  • 被动关闭方(如服务器)回复ACK=1的报文,确认号`ack=u+1`。
  • 目的:确认收到关闭请求,但可能仍有数据未发送完毕。
  • 服务器状态:`CLOSE_WAIT`(等待关闭自身连接)。
  • 3. 第三次挥手(FIN)

  • 被动关闭方发送FIN=1的报文,携带序列号`seq=w`,表示数据已全部发送完毕。
  • 服务器状态:`LAST_ACK`(等待最终确认)。
  • 4. 第四次挥手(ACK)

  • 主动关闭方发送ACK=1的报文,确认号`ack=w+1`。
  • 客户端状态:`TIME_WAIT`(等待2MSL时间,确保对方收到ACK)。
  • 服务器状态:收到ACK后进入`CLOSED`,连接彻底关闭。
  • 为什么需要四次?

  • 全双工特性:TCP支持双向独立传输,双方需分别关闭发送通道。
  • 等待数据发送:被动关闭方可能在收到FIN后仍需发送剩余数据。
  • 三、高频考点与常见问题

    1. 三次握手核心意义

  • 验证双方收发能力、同步序列号、避免资源浪费。
  • 2. 四次挥手状态分析

  • TIME_WAIT:主动关闭方等待2MSL(最长报文生存时间),防止ACK丢失导致服务器重传FIN。
  • CLOSE_WAIT:被动关闭方等待应用层调用`close`,若大量出现可能代码未正确释放资源。
  • 3. 标志位与序列号的作用

  • SYN:同步序列号,发起连接请求。
  • ACK:确认报文有效性,携带确认号。
  • FIN:请求终止连接。
  • 4. 异常场景与排查

  • 大量SYN_RCVD:可能遭遇SYN洪水攻击(服务器未收到第三次ACK)。
  • 大量CLOSE_WAIT:服务器未正确关闭Socket,需检查代码逻辑。
  • 四、记忆技巧与类比

  • 三次握手类比“打电话”
  • 1. 客户端:“喂,听得到吗?”(SYN)

    2. 服务器:“听到了!你能听到我吗?”(SYN+ACK)

    3. 客户端:“能听到,开始聊天吧!”(ACK)

  • 四次挥手类比“辞职流程”
  • 1. 员工:“老板,我要离职”(FIN)

    2. 老板:“同意离职”(ACK)

    3. 老板:“手续已办好,你可以走了”(FIN)

    4. 员工:“收到,再见!”(ACK)

    总结:三次握手与四次挥手是TCP可靠传输的核心机制,需重点掌握其步骤、状态转换及设计原理。高考中可能结合流程图、状态机或实际场景应用题考查,建议通过类比和实际报文分析加深理解!