TCP的三次握手建立连接,四次挥手断开连接

三葉Leaves Author

TCP 三次握手(Three-Way Handshake)—— 建立连接

三次握手的目的是在客户端服务器之间建立可靠的连接,并同步双方的序列号

概述:

  1. 第一次握手(SYN):
    • 客户端向服务器发送一个 TCP SYN (Synchronize) 报文段,其中:
      • SYN 标志位被设置为 1,表示请求建立连接。
      • 序列号 (seq) 被设置为一个随机值 x,作为客户端的初始序列号 (ISNC)。
      • 其他标志位(如 ACK、FIN 等)都为 0。
    • 客户端进入 SYN-SENT 状态,等待服务器的确认。
  2. 第二次握手(SYN-ACK):
    • 服务器收到客户端的 SYN 报文段后,如果同意建立连接,则会发送一个 TCP SYN-ACK 报文段进行响应,其中:
      • SYN 标志位被设置为 1,表示同意建立连接。
      • ACK 标志位被设置为 1,表示确认收到客户端的 SYN 报文段。
      • 确认号 (ack) 被设置为 x + 1,表示期望接收的下一个字节的序列号。
      • 序列号 (seq) 被设置为一个随机值 y,作为服务器的初始序列号 (ISNS)。
    • 服务器进入 SYN-RECEIVED 状态,等待客户端的确认。
  3. 第三次握手(ACK):
    • 客户端收到服务器的 SYN-ACK 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
      • ACK 标志位被设置为 1,表示确认收到服务器的 SYN-ACK 报文段。
      • 确认号 (ack) 被设置为 y + 1,表示期望接收的下一个字节的序列号。
      • 序列号 (seq) 被设置为 x + 1,因为该报文段不携带数据,所以序列号保持不变。
    • 客户端进入 ESTABLISHED 状态,表示连接已建立。
    • 服务器收到客户端的 ACK 报文段后,也进入 ESTABLISHED 状态,表示连接已建立。

三次握手过程图示

1
2
3
4
5
6
7
8
9
客户端                                    服务器
-------- --------
SYN (seq=x) ------------->

SYN-ACK (seq=y, ack=x+1) <---------

ACK (seq=x+1, ack=y+1) ------------->
ESTABLISHED
ESTABLISHED
sequenceDiagram
    participant Client as 客户端
    participant Server as 服务器
    Client->>Server: SYN (seq=x)
    note left of Client: CLOSED
    note right of Server: LISTEN
    Client->>Client: SYN-SENT
    activate Server
    Server-->>Client: SYN-ACK (seq=y, ack=x+1)
    note right of Server: SYN-RECEIVED
    Client->>Server: ACK (seq=x+1, ack=y+1)
    note left of Client: ESTABLISHED
    note right of Server: ESTABLISHED
    deactivate Server

TCP 四次挥手(Four-Way Handshake)—— 断开连接

四次挥手用于安全地关闭 TCP 连接,确保所有数据都已传输完毕。

概述:

  1. 第一次挥手(FIN):
    • 客户端完成数据传输后,会发送一个 TCP FIN (Finish) 报文段,请求关闭连接,其中:
      • FIN 标志位被设置为 1,表示请求关闭连接。
      • 序列号 (seq) 被设置为 u,通常等于客户端最后发送的数据的序列号加 1。
    • 客户端进入 FIN-WAIT-1 状态,等待服务器的确认。
  2. 第二次挥手(ACK):
    • 服务器收到客户端的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
      • ACK 标志位被设置为 1,表示确认收到客户端的 FIN 报文段。
      • 确认号 (ack) 被设置为 u + 1。
      • 序列号 (seq) 被设置为 v,通常等于服务器最后发送的数据的序列号加 1。
    • 服务器进入 CLOSE-WAIT 状态,表示服务器已经收到客户端的关闭请求,但服务器可能还有数据要发送。
  3. 第三次挥手(FIN):
    • 服务器完成数据传输后,会发送一个 TCP FIN 报文段,请求关闭连接,其中:
      • FIN 标志位被设置为 1,表示请求关闭连接。
      • 序列号 (seq) 被设置为 w,等于 v + 1(如果在 CLOSE-WAIT 期间服务器没有发送数据)。
    • 服务器进入 LAST-ACK 状态,等待客户端的确认。
  4. 第四次挥手(ACK):
    • 客户端收到服务器的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
      • ACK 标志位被设置为 1,表示确认收到服务器的 FIN 报文段。
      • 确认号 (ack) 被设置为 w + 1。
      • 序列号 (seq) 被设置为 u + 1。
    • 客户端进入 TIME-WAIT 状态,等待 2MSL(Maximum Segment Lifetime)时间后,关闭连接。
    • 服务器收到客户端的 ACK 报文段后,关闭连接。

四次挥手过程图示

1
2
3
4
5
6
7
8
9
客户端                                    服务器
-------- --------
FIN (seq=u) ------------->
ACK (seq=v, ack=u+1) <-------------
CLOSE-WAIT
FIN (seq=w, ack=u+1) <-------------
ACK (seq=u+1, ack=w+1) ------------->
TIME-WAIT CLOSED
CLOSED
sequenceDiagram
    participant Client as 客户端
    participant Server as 服务器
    Client->>Server: FIN (seq=u)
    note left of Client: ESTABLISHED
    note right of Server: ESTABLISHED
    Client->>Client: FIN-WAIT-1
    activate Server
    Server-->>Client: ACK (seq=v, ack=u+1)
    note right of Server: CLOSE-WAIT
    Server->>Client: FIN (seq=w, ack=u+1)
    note right of Server: LAST-ACK
    Client->>Server: ACK (seq=u+1, ack=w+1)
    note left of Client: TIME-WAIT
    Client->>Client: TIME-WAIT (2MSL)
    note left of Client: CLOSED
    note right of Server: CLOSED
    deactivate Server

关键控制位和序号/确认号的变化总结

  • SYN (Synchronize): 用于发起连接,同步序列号。
  • ACK (Acknowledgment): 用于确认收到报文段。
  • FIN (Finish): 用于请求关闭连接。
  • seq (Sequence Number): 序列号,用于标识 TCP 数据流中的字节序号,确保数据按序到达。
  • ack (Acknowledgment Number): 确认号,用于确认已收到的数据,其值为期望接收的下一个字节的序列号。
  • 标题: TCP的三次握手建立连接,四次挥手断开连接
  • 作者: 三葉Leaves
  • 创建于 : 2024-12-26 00:00:00
  • 更新于 : 2025-01-05 18:48:33
  • 链接: https://kiss1314.top/3f0510e757e4/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论