TCP 的可靠性如何保证?为什么挥手要比握手多一次?如果不多一次会出现什么问题?

1 个回答

  • 周一仙
    在漆黑的夜里,你需要一道光照亮夜行的路,我燃烧了我自己,但也造就了你我不能相拥。
    ## 一、TCP 的可靠性如何保证 TCP 是面向连接的、可靠的传输协议,它的可靠性主要依赖以下机制: ### 1. **三次握手建立连接** * 确保**双方都能收发数据**,并且交换初始序列号(ISN),为数据传输做准备。 ### 2. **序列号(Sequence Number)** * 每个字节的数据都有唯一的序列号,接收端可以按序重组数据,保证数据**不丢、不乱序**。 ### 3. **确认应答(ACK)** * 接收方收到数据后会返回一个确认号(下一字节的序号),确认已正确接收。 * 若超时未收到 ACK,会**重传**。 ### 4. **重传机制** * **超时重传**(RTO):发送方在定时器到期未收到 ACK 时重发数据。 * **快速重传**:收到多个重复 ACK 时,立即重传对应数据段。 ### 5. **流量控制** * **滑动窗口机制**:接收方通过窗口大小告诉发送方自己还能接收多少数据,避免**发送方太快、接收方来不及处理**。 ### 6. **拥塞控制** * 慢启动、拥塞避免、快速重传、快速恢复等算法,避免网络拥塞导致的丢包。 ### 7. **数据校验** * 每个 TCP 段包含一个 16 位校验和(Checksum),保证数据未损坏(包括 TCP 头和数据部分)。 ## 二、为什么挥手(断开连接)要比握手多一次? ### **1. 三次握手回顾** 建立连接时,客户端和服务端通过 **SYN → SYN+ACK → ACK** 三步,就能确认**双方都能收发数据**。 ### **2. 四次挥手的原因** TCP 连接是**全双工**的,两端的数据传输是独立的关闭过程: 1. **第一次挥手**:主动关闭方发送 `FIN`,表示“我不再发数据了”。 2. **第二次挥手**:被动关闭方回复 `ACK`,表示“我收到了你的关闭请求”。 3. **第三次挥手**:被动关闭方数据发送完毕后,发送 `FIN` 表示“我也不再发数据了”。 4. **第四次挥手**:主动关闭方发送 `ACK` 确认,连接正式断开。 > 关键原因: > **接收方在收到 FIN 时,可能还有未发送完的数据**,不能立刻发送 FIN 关闭自己到对方的通道,所以 ACK 和 FIN 需要分开发。 ## 三、如果不多一次会出现什么问题? 如果挥手只用三次(把 **第二次挥手的 ACK 和第三次挥手的 FIN 合并**): * 在收到对方的 `FIN` 时,你必须**立即发送自己的 FIN**,这意味着你假设自己**已经没有数据要发**。 * 但现实中可能还有数据在发送缓冲区中没发完,这些数据就会被直接丢弃 → **数据丢失**。 * 这样会破坏 TCP 的**可靠性**承诺。 > 四次挥手是为了保证**双方的数据都能完整发送到对方**,才安全关闭连接。 ## 四、总结对比表 | 阶段 | 三次握手 | 四次挥手 | | ------- | ---------- | ----------------------------- | | 功能 | 建立连接 | 断开连接 | | 原因 | 双方只需确认收发能力 | 双方数据通道独立关闭 | | 额外一次的原因 | 不需要 | 被动关闭方可能还有数据未发完,ACK 和 FIN 不能合并 | | 如果少一次 | — | 可能导致未发送完的数据直接丢失 |
    发布于 2025-08-12 03:41 •IP属地 上海
    举报
    评论
    收藏