TCP是如何保证可靠性的

TCP可靠性可以总结为 6 个方面:

1. 数据分片与序列号
TCP将应用层的数据流分割成适合网络传输的报文段(Segment),每个报文段包含一个序列号(Sequence Number),标识该段数据在整体数据流中的位置。

  • 乱序重组: 即使数据包通过不同路径到达,接收方也能根据序列号重新排序。
  • 去重: 通过序列号识别并丢弃重复的数据包。
  • 重排: 接收方按序号重组数据后,按顺序交给应用层。
1
2
3
4
5
6
7
8
示例:

发送方发送数据 "Hello",初始序列号为100,每个字符占1字节:

报文1:Seq=100, Data="H"
报文2:Seq=101, Data="e"
...
接收方返回确认号(ACK=105),表示期望下一个字节是105。

2. 确认应答(ACK)机制
接收方每收到一个报文段,会返回一个确认报文(ACK),其中包含期望接收的下一个字节的序列号。

  • 确保发送方知道哪些数据已被正确接收。
  • 发送方仅需重传未被确认的数据段。
1
2
3
示例:

若接收方收到 Seq=100 的数据,会返回 ACK=101,表示“已收到100,期待101”。

3. 超时重传 见《报文重传》。

4. 滑动窗口

  • 流量控制 接收方通过TCP头部的**窗口字段(Window Size)**告知发送方当前可接收的数据量(接收窗口 rwnd)。
    发送方根据 rwnd 动态调整发送速率,避免接收方缓冲区溢出。

  • 拥塞控制 根据一定的算法控制发送速率。
    发送方根据网络状态动态调整发送窗口(拥塞窗口 cwnd),避免网络过载。
    实际发送窗口大小为 min(rwnd, cwnd)。

5. 校验和

  • 数据完整性校验:TCP头部和数据部分均包含校验和,接收方通过校验和验证数据是否在传输中损坏。
  • 丢弃损坏数据:若校验失败,接收方丢弃该报文段,并等待发送方重传。

6. 连接管理 也就是三次握手与四次挥手。

comments powered by Disqus