# 5.4 TCP可靠传输 ## 一、TCP可靠传输概述 ### 1.1 什么是可靠传输 **可靠传输**: - 保证数据无差错、无丢失、无重复、按序到达 - TCP通过一系列机制实现可靠传输 ### 1.2 TCP可靠传输的机制 - **序号机制**:为每个字节编号 - **确认机制**:累积确认 - **重传机制**:超时重传、快速重传 - **校验和**:检测数据错误 - **流量控制**:防止接收方溢出 - **拥塞控制**:防止网络过载 --- ## 二、序号机制 ### 2.1 字节编号 **序号(Sequence Number)**: - TCP把传输的数据看作字节流 - 为每个字节编号 - 报文段的序号是该报文段第一个字节的编号 **初始序号**: - 连接建立时随机选择 - 防止历史连接干扰 ### 2.2 序号空间 **32位序号**: - 序号范围:0 ~ 2³²-1 - 可以循环使用 - 序号回绕问题(PAWS解决) ### 2.3 序号的作用 - **排序**:接收方按序号排序 - **去重**:识别重复的数据 - **确认**:确认号表示期望收到的下一个序号 --- ## 三、确认机制 ### 3.1 累积确认 **累积确认(Cumulative Acknowledgment)**: - 确认号表示期望收到的下一个字节的序号 - 表示该序号之前的所有数据都已正确接收 **例子**: - 收到字节1-1000,发送ACK=1001 - 收到字节1001-2000,发送ACK=2001 - 收到字节3001-4000,发送ACK=2001(表示2001-3000未收到) ### 3.2 延迟确认 **延迟确认(Delayed ACK)**: - 不立即发送确认 - 等待一段时间(通常200ms) - 如果有数据要发送,捎带确认 **优点**: - 减少ACK数量 - 提高效率 **缺点**: - 增加延迟 ### 3.3 快速确认 **快速确认**: - 收到失序数据时立即发送重复ACK - 用于触发快速重传 --- ## 四、重传机制 ### 4.1 超时重传 **超时时间(RTO)**: - Retransmission TimeOut - 根据RTT动态计算 **RTO计算**: ``` RTTₛ = (1-α) × RTTₛ + α × RTT样本 (平滑RTT) RTTd = (1-β) × RTTd + β × |RTTₛ - RTT样本| (RTT偏差) RTO = RTTₛ + 4 × RTTd ``` **超时处理**: - 超时后重传该报文段 - RTO加倍(指数退避) - 重传后如果收到ACK,恢复正常 ### 4.2 快速重传 **快速重传(Fast Retransmit)**: - 收到3个重复ACK,立即重传 - 不需要等待超时 **过程**: 1. 发送方发送报文段1、2、3、4、5 2. 报文段2丢失 3. 接收方收到1、3、4、5 4. 接收方对1发送重复ACK(ACK=2) 5. 收到3个重复ACK后,发送方重传2 **优点**: - 减少重传延迟 - 提高效率 ### 4.3 选择性重传 **选择性重传(Selective Repeat)**: - 只重传丢失的报文段 - 需要接收方支持SACK **SACK(Selective Acknowledgment)**: - TCP选项 - 告诉发送方已收到的不连续的数据块 - 发送方只重传丢失的数据 --- ## 五、校验和 ### 5.1 TCP校验和 **作用**: - 检测TCP首部和数据的错误 **计算**: - 包括伪首部、TCP首部、数据 - 伪首部包括源IP、目的IP、协议、TCP长度 **检验**: - 接收方重新计算校验和 - 如果不匹配,丢弃该报文段 --- ## 六、TCP可靠传输的工作过程 ### 6.1 发送方 1. **发送数据**: - 将数据分成报文段 - 每个报文段有序号 2. **启动定时器**: - 为每个报文段启动定时器 - 设置RTO 3. **收到ACK**: - 如果ACK确认了新数据,滑动窗口 - 如果收到重复ACK,计数 - 如果收到3个重复ACK,快速重传 4. **超时处理**: - 重传该报文段 - RTO加倍 ### 6.2 接收方 1. **接收数据**: - 检查校验和 - 如果错误,丢弃 2. **按序到达**: - 交付给应用层 - 发送ACK 3. **失序到达**: - 缓存(如果支持SACK) - 发送重复ACK 4. **重复到达**: - 丢弃 - 发送ACK --- ## 七、TCP可靠传输的示例 ### 7.1 正常传输 ``` 发送方 接收方 | | |-------- SEQ=1 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=2 -------->| | | |<-------- ACK=3 --------| | | ``` ### 7.2 超时重传 ``` 发送方 接收方 | | |-------- SEQ=1 -------->| | | |-------- SEQ=2 -------->| | (丢失) | | | |<-------- ACK=2 --------| | | |-------- SEQ=3 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=4 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=2 -------->| (超时重传) | | |<-------- ACK=5 --------| | | ``` ### 7.3 快速重传 ``` 发送方 接收方 | | |-------- SEQ=1 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=2 -------->| | (丢失) | | | |-------- SEQ=3 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=4 -------->| | | |<-------- ACK=2 --------| | | |-------- SEQ=5 -------->| | | |<-------- ACK=2 --------| (第3个重复ACK) | | |-------- SEQ=2 -------->| (快速重传) | | |<-------- ACK=6 --------| | | ``` --- ## 八、考研重点 1. **TCP可靠传输的机制**: - 序号机制 - 确认机制 - 重传机制 - 校验和 2. **序号机制**: - 字节编号 - 序号空间 - 序号的作用 3. **确认机制**: - 累积确认 - 延迟确认 - 快速确认 4. **重传机制**: - 超时重传:RTO计算 - 快速重传:3个重复ACK - 选择性重传:SACK 5. **校验和**: - 作用 - 计算 6. **TCP可靠传输的工作过程** 7. **TCP可靠传输的示例** --- *下一节:5.5 TCP流量控制*