TCP的三次握手建立连接,四次挥手断开连接
TCP 三次握手(Three-Way Handshake)—— 建立连接
三次握手的目的是在客户端和服务器之间建立可靠的连接,并同步双方的序列号。
概述:
- 第一次握手(SYN):
- 客户端向服务器发送一个 TCP SYN (Synchronize) 报文段,其中:
- SYN 标志位被设置为 1,表示请求建立连接。
- 序列号 (seq) 被设置为一个随机值 x,作为客户端的初始序列号 (ISNC)。
- 其他标志位(如 ACK、FIN 等)都为 0。
- 客户端进入 SYN-SENT 状态,等待服务器的确认。
- 客户端向服务器发送一个 TCP SYN (Synchronize) 报文段,其中:
- 第二次握手(SYN-ACK):
- 服务器收到客户端的 SYN 报文段后,如果同意建立连接,则会发送一个 TCP SYN-ACK 报文段进行响应,其中:
- SYN 标志位被设置为 1,表示同意建立连接。
- ACK 标志位被设置为 1,表示确认收到客户端的 SYN 报文段。
- 确认号 (ack) 被设置为 x + 1,表示期望接收的下一个字节的序列号。
- 序列号 (seq) 被设置为一个随机值 y,作为服务器的初始序列号 (ISNS)。
- 服务器进入 SYN-RECEIVED 状态,等待客户端的确认。
- 服务器收到客户端的 SYN 报文段后,如果同意建立连接,则会发送一个 TCP SYN-ACK 报文段进行响应,其中:
- 第三次握手(ACK):
- 客户端收到服务器的 SYN-ACK 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
- ACK 标志位被设置为 1,表示确认收到服务器的 SYN-ACK 报文段。
- 确认号 (ack) 被设置为 y + 1,表示期望接收的下一个字节的序列号。
- 序列号 (seq) 被设置为 x + 1,因为该报文段不携带数据,所以序列号保持不变。
- 客户端进入 ESTABLISHED 状态,表示连接已建立。
- 服务器收到客户端的 ACK 报文段后,也进入 ESTABLISHED 状态,表示连接已建立。
- 客户端收到服务器的 SYN-ACK 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
三次握手过程图示
1 | 客户端 服务器 |
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 连接,确保所有数据都已传输完毕。
概述:
- 第一次挥手(FIN):
- 客户端完成数据传输后,会发送一个 TCP FIN (Finish) 报文段,请求关闭连接,其中:
- FIN 标志位被设置为 1,表示请求关闭连接。
- 序列号 (seq) 被设置为 u,通常等于客户端最后发送的数据的序列号加 1。
- 客户端进入 FIN-WAIT-1 状态,等待服务器的确认。
- 客户端完成数据传输后,会发送一个 TCP FIN (Finish) 报文段,请求关闭连接,其中:
- 第二次挥手(ACK):
- 服务器收到客户端的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
- ACK 标志位被设置为 1,表示确认收到客户端的 FIN 报文段。
- 确认号 (ack) 被设置为 u + 1。
- 序列号 (seq) 被设置为 v,通常等于服务器最后发送的数据的序列号加 1。
- 服务器进入 CLOSE-WAIT 状态,表示服务器已经收到客户端的关闭请求,但服务器可能还有数据要发送。
- 服务器收到客户端的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
- 第三次挥手(FIN):
- 服务器完成数据传输后,会发送一个 TCP FIN 报文段,请求关闭连接,其中:
- FIN 标志位被设置为 1,表示请求关闭连接。
- 序列号 (seq) 被设置为 w,等于 v + 1(如果在 CLOSE-WAIT 期间服务器没有发送数据)。
- 服务器进入 LAST-ACK 状态,等待客户端的确认。
- 服务器完成数据传输后,会发送一个 TCP FIN 报文段,请求关闭连接,其中:
- 第四次挥手(ACK):
- 客户端收到服务器的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
- ACK 标志位被设置为 1,表示确认收到服务器的 FIN 报文段。
- 确认号 (ack) 被设置为 w + 1。
- 序列号 (seq) 被设置为 u + 1。
- 客户端进入 TIME-WAIT 状态,等待 2MSL(Maximum Segment Lifetime)时间后,关闭连接。
- 服务器收到客户端的 ACK 报文段后,关闭连接。
- 客户端收到服务器的 FIN 报文段后,会发送一个 TCP ACK 报文段进行确认,其中:
四次挥手过程图示
1 | 客户端 服务器 |
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 进行许可。
评论