TCP 是如何保证数据传输的可靠性的?
1. 建立可靠连接:三次握手
SYN:客户端发送同步序列号(SYN=1, seq=x)。
SYN-ACK:服务端确认并同步自己的序列号(SYN=1, ACK=1, seq=y, ack=x+1)。
ACK:客户端再确认(ACK=1, seq=x+1, ack=y+1)。
作用:同步初始序列号、确认双方收发能力、防止历史连接初始化。
2. 数据按序到达:序列号与确认应答
序列号(Sequence Number):每个字节都有编号,保证按序重组。
确认号(Acknowledgment Number):期望收到的下一个字节序号。
累积确认:ACK 表示该序号之前的所有数据已正确接收。
3. 丢包重传:超时重传 + 快速重传
超时重传(RTO):发送端为每个报文段维护定时器,超时未收到 ACK 即重传。
- RTO 基于 RTT 动态计算(Jacobson/Karels 算法)。
快速重传:连续收到 3 个重复 ACK 立即重传丢失段,无需等待超时。
4. 流量控制:滑动窗口
接收窗口(rwnd):接收方通过 TCP 首部 Window 字段告知可接收缓冲区大小。
发送窗口:发送方根据 rwnd 与拥塞窗口 cwnd 的最小值决定可发送数据量,防止接收端溢出。
5. 拥塞控制:防止网络过载
慢启动(Slow Start):cwnd 指数增长,直到阈值 ssthresh。
拥塞避免(Congestion Avoidance):cwnd 线性增长。
快重传 + 快恢复:发生 3 个重复 ACK 时,ssthresh = cwnd/2,cwnd = ssthresh + 3 MSS,进入快恢复。
超时重传:RTO 超时,ssthresh = cwnd/2,cwnd = 1 MSS,重新慢启动。
6. 数据完整性:校验和
- 发送端计算首部+数据的 16 位反码和,接收端验证;若不一致则丢弃并要求重传。
7. 连接优雅关闭:四次挥手
FIN:主动方发送结束标志。
ACK:被动方确认。
FIN:被动方数据发送完毕后再发 FIN。
ACK:主动方确认,进入 TIME_WAIT(2MSL)确保最后一个 ACK 到达。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Min的博客!
评论