TCP在超时重传机制中,并不强制要求发送完全相同的报文段。相反,TCP允许进行数据分组重组,发送更大的报文段以提升性能,前提是该报文段的大小不超过接收方声明的MSS(最大报文段大小)。

TCP之所以能够进行数据分组重组,是因为它使用字节序号而非报文段序号来标识和确认要发送的数据。

实例分析

以下实验展示了TCP数据分组重组的过程:

  1. 使用sock程序连接到丢弃服务器,并输入一行文本"hello there"。
  2. 断开以太网连接,并输入第二行文本"line number 2"。
  3. 在第二行文本重传之前,重新连接以太网连接,并输入第三行文本"and 3"。

预期结果:下一次重传将包含第二行和第三行文本的数据。

实验结果:

使用tcpdump工具抓取网络数据包,观察到以下结果:

  • 第一、二行显示第一行文本"hello there"发送成功及其确认。
  • 断开网线后,输入的第二行文本"line number 2"(14字节)在第三行发送,并在第四、五行进行重传。
  • 在第六行重传之前,输入第三行文本"and 3"(6字节),观察到此次重传包含了20字节数据,即第二行和第三行文本的组合。
  • 第九行接收到确认信息,确认了这20字节的数据。

总结

  • 详细探讨了TCP超时与重传机制,并通过丢失连接建立SYN的例子,阐述了指数退避机制在重传和超时中的应用。
  • TCP通过计算往返时间,维护平滑的RTT估计器和均值偏差估计器,用于计算下一次重传时间。
  • 一些TCP实现仅在每个窗口测量一次RTT。Karn算法则可以在不测量RTT的情况下,解决分组丢失时的重传二义性问题。