没有合适的资源?快使用搜索试试~ 我知道了~
TCP首部的TimeStamp时间戳选项
需积分: 1 0 下载量 76 浏览量
2024-09-19
15:42:53
上传
评论
收藏 1.44MB DOCX 举报
温馨提示
TCP首部的TimeStamp时间戳选项TCP首部的TimeStamp时间戳选项
资源推荐
资源详情
资源评论
TCP 首部的 TimeStamp 时间戳选项 转载
TCP 应该是以太网协议族中被应用最为广泛的协议之中的一个,这里就聊一聊 TCP 协
议中的 TimeStamp 选项。这个选项是由 RFC 1323 引入的,该 C 建议提交于 1992
年。到今天已经足足有 20 个年头。只是相信大部分程序员对这个建议还是相当陌生。
要理解为啥须要用 TimeStamp 选项。还须要从 TCP 协议的几个基本设计说起。
TCP 协议的几个设计初衷。以及引发的问题:
1. 协议规定收端不须要响应每个收到的数据报文,仅仅须要收到 N 个报文后,向发端回复一
个 ack 报文就可以。
这种规定是为了提高通讯的效率,可是也引入了几个问题:
A. 发端发出报文后,究竟多久可
以收到 ack 是不确定的。
B. 万一 ack 报文丢失了。推断须要重发的 timeout 时间也非常难确定。
2. TCP 报文中,标示 Sequence 号的地址长度为 32 位。
这就限制了发端最多一次发送 2^30 长度的数据。就必须等待 ack 信号。为啥呢?在这个链
接里有一些具体的讨论。
然而对于超快速以太网(1000M 以至于 10G),这样会影响 TCP 连接的转发效率。
为解决上面提到的问题,TimeStamp 选项主要有两个用途:
1. 測量 TCP 连接两端通讯的延迟(Round Trip Time Measurement)
有了 RTTM 机制。TCP 的两端能够非常 easy 的推断出线路上报文的延迟情况。从而制定出
一个优化的发包间隔和报文 TimeOut 时间,从而攻克了第一个问题。
2. 处理 Sequence 号反转的问题(Protect Against Wrapped Sequence Numbers)。
TCP 收端收到一个数据报文后,会先比較本次收到报文的 TimeStamp 和上次收到报文的
TimeStamp。假设本次的比較新,那么能够直接推断本次收到的报文是新的报文,不须要进行
复杂的 Sequence Number Window Scale 计算。从而攻克了第二个问题。
然而,RFC1323 建议还存在一些隐患。
建议中定义 TimeStamp 添加的间隔能够使 1ms-1s。假设设备依照 1ms 的速度添加
TimeStamp。那么仅仅要一个 TCP 连接连续 24.8 天(1ms*2^31)没有通讯,再发送报文,
收端比較本次报文和上次报文 TimeStamp 的动作就会出错。(问题 1)
(注:TCP 协议中并未定义 KeepAlive。假设应用层代码不定义超时机制。TCP 连接就永远不
会中断。所以连续 24.8 天不通讯的情况是却有可能发生的。)
引用 Linux 相关代码:((s32)(tp->rx_opt.rcv_tsval - tp->rx_opt.ts_recent) < 0)
比方 tp->rx_opt.rcv_tsval = 0x80000020, tp->rx_opt.ts_recent = 0x10
((s32)(tp->rx_opt.rcv_tsval - tp->rx_opt.ts_recent) = (s32)0x80000010,是一个负数,必
定小于 0。
假设解决这个问题 1 呢?
已知依照 RFC1323 的规定。依照最快 TimeStamp 添加的速度,也须要 24.8 天 TImeStamp
才有可能发生反转。
假设((s32)(tp->rx_opt.rcv_tsval - tp->rx_opt.ts_recent) < 0)推断成立,还能够再用本地收
到报文的本地 TimeStamp 减去上一次收到报文的本地 TimeStamp。假设时间大于 24.8 天,
那么就是 TimeStamp 发生了反转;否则就不是反转的情况。这样做是不是就万无一失了呢?
不一定。
别忘了本地 TimeStamp 的计数器也是个 32 位,也可能会翻转的。(问题 2)
举个极端的样例:如果 TCP 两端设备的 TimeStamp 添加间隔不一致,A 为 1ms。B 为
10ms。
TCP 连接连续 248 天没有通讯;这个时候 B 向 A 发送了一个数据报文。
此时 B 发送给 A 的 TCP 报文中的 TimeStamp,正好发生了翻转。然而因为 A 的计数器是每
1ms 加一的,248 天时间。A 的计数器已经归零过 5 次了。这时候再用本地 TimeStamp 做推
断还是错的。
比較保险的做法是:
假设 TCP 连接的速度不那么快(2^32/s),本地 TimeStamp 用最大间隔时间 1S。从而规避
了(问题 2)。
假设 TCP 连接速度很快,1S 的 TimeStamp 间隔就有些不合时宜了,能够选小一级,如
100ms。假设这时候还会发生连续 24800 天(为啥是 24800 天呢)不通讯的情况,除了骂娘
以外。我也没办法了。
速读原著_cwl_java 的博客-CSDN 博客
速读原著
-TCP/IP(
时间戳选项
)
TCP/IP 详解 卷 1:协议 学习笔记 第二
十四章 TCP 的未来和性能_tcp 扩大因
子-CSDN 博客
速读原著-TCP/IP(时间戳选项)-腾讯云
开发者社区-腾讯云 (tencent.com)
第 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 中的时间戳应
剩余21页未读,继续阅读
资源评论
xiongmaokuaile
- 粉丝: 4
- 资源: 50
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功