前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >速读原著-TCP/IP(时间戳选项)

速读原著-TCP/IP(时间戳选项)

作者头像
cwl_java
发布2020-03-13 09:38:30
1K0
发布2020-03-13 09:38:30
举报
文章被收录于专栏:cwl_Javacwl_Java

第24章 TCP的未来和性能

24.5 时间戳选项

时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的 A C K计算RT T(我们必须说“每一个收到的 A C K”而不是“每一个报文段”,是因为T C P通常用一个A C K来确认多个报文段)。我们提到过目前许多实现为每一个窗口只计算一个 RT T,对于包含8个报文段的窗口而言这是正确的。然而,较大的窗口大小则需要进行更好的RT T计算。

RFC 1323的3 . 1节给出了需要为较大窗口进行更好的 RT T计算的信号处理的理由。通常RT T通过对一个数据信号(包含数据的报文段)以较低的频率(每个窗口一次)进行采样来进行计算,这就将别名引入了被估计的RT T中。当每个窗口中有8个报文段时,采样速率为数据率的1 / 8,这还是可以忍受的。但是如果每个窗口中有1 0 0个报文段时,采样速率则为数据速率的1 / 1 0 0,这将导致被估计的RT T不精确,从而引起不必要的重传。如果一个报文段被丢失,则会使情况变得更糟。

图1 8 - 2 0显示了时间戳选项的格式。发送方在第 1个字段中放置一个32 bit的值,接收方在应答字段中回显这个数值。包含这个选项的 T C P首部长度将从正常的2 0字节增加为3 2字节。

时间戳是一个单调递增的值。由于接收方只需要回显收到的内容,因此不需要关注时间戳单元是什么。这个选项不需要在两个主机之间进行任何形式的时钟同步。 RFC 1323推荐在1毫秒和1秒之间将时间戳的值加1。

4.4BSD在启动时将时间戳始终设置为0,然后每隔500 ms将时间戳时钟加1。在图2 4 - 7中,如果观察在报文段1和报文段11的时间戳,它们之间的差(8 9个单元)对应于每个单元500 ms的规定,因为实际时间差为44.4秒。

在连接建立阶段,对这个选项的规定与前一节讲的窗口扩大选项类似。主动发起连接的一方在它的S Y N中指定选项。只有在它从另一方的 S Y N中收到了这个选项之后,该选项才会在以后的报文段中进行设置。

我们已经看到接收方 T C P不需要对每个包含数据的报文段进行确认,许多实现每两个报文段发送一个A C K。如果接收方发送一个确认了两个报文段的 A C K,那么哪一个收到的时间戳应当放入回显应答字段中来发回去呢?为了减少任一端所维持的状态数量,对于每个连接只保持一个时间戳的数值。选择何时

更新这个数值的算法非常简单:

  1. TCP跟踪下一个A C K中将要发送的时间戳的值(一个名为 t s re c e n t的变量)以及最后发送的A C K中的确认序号(一个名为l a s t a c k的变量)。这个序号就是接收方期望的序号。
  2. 当一个包含有字节号 l a s t a c k的报文段到达时,则该报文段中的时间戳被保存在 t s re c e n t中。
  3. 无论何时发送一个时间戳选项, t s re c e n t就作为时间戳回显应答字段被发送,而序号字段被保存在l a s t a c k中。

这个算法能够处理下面两种情况:

  1. 如果A C K被接收方迟延,则作为回显值的时间戳值应该对应于最早被确认的报文段。例如,如果两个包含 1 ~ 1 0 2 4和1 0 2 5 ~ 2 0 4 8字节的报文段到达,每一个都带有一个时间戳选项,接收方产生一个ACK 2049来对它们进行确认。此时, A C K中的时间戳应该是包含字节 1 ~ 1 0 2 4的第1个报文段中的时间戳。这种处理是正确的,因为发送方在进行重传超时时间的计算时,必须将迟延的A C K也考虑在内。
  2. 如果一个收到的报文段虽然在窗口范围内但同时又是失序,这就表明前面的报文段已经丢失。当那个丢失的报文段到达时,它的时间戳(而不是失序的报文段的时间戳)将被回显。例如,假定有3个各包含1 0 2 4字节数据的报文段,按如下顺序接收:包含字节 1 ~ 1 0 2 4的报文段1,包含字节2 0 4 9 ~ 4 0 7 2的报文段3和包含字节1 0 2 5 ~ 2 0 4 8的报文段2。返回的A C K应该是带有报文段1的时间戳的ACK 1025(一个正常的所期望的对数据的 A C K)、带有报文段1的时间戳的ACK 1025(一个重复的、响应位于窗口内但却是失序的报文段的 A C K),然后是带有报文段2的时间戳的ACK 3073(不是报文段3中的较后的时间戳)。这与当报文段丢失时的对RT T估计过高具有同样的效果,但这比估计过低要好些。而且,如果最后的 A C K含有来自报文段3的时间戳,它可以包括重复的 A C K返回和报文段2被重传所需要的时间,或者可以包括发送方的报文段 2的重传超时定时器到期的时间。无论在哪一种情况下,回显报文段 3的时间戳将引起发送方的RT T计算出现偏差。

尽管时间戳选项能够更好地计算 RT T,它还为发送方提供了一种方法,以避免接收到旧的报文段,并认为它们是现在的数据的一部分。下一节将对此进行描述。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第24章 TCP的未来和性能
    • 24.5 时间戳选项
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档