TCP/IP具体解释--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天呢)不通讯的情况,除了骂娘以外。我也没办法了。
TCP/IP具体解释--TCP首部的TimeStamp时间戳选项的更多相关文章
- TCP/IP具体解释--TCP/UDP优化设置总结& MTU的相关介绍
首先要看TCP/IP协议,涉及到四层:链路层,网络层.传输层,应用层. 当中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应 ...
- TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口
TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过 ...
- TCP/IP具体解释--TCP/IP可靠的原理 滑动窗体 拥塞窗体
TCP和UDP处在同一层---运输层,可是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个"拨打电话&q ...
- TCP/IP具体解释--TCP的分段和IP的分片
写在前面: 分组能够发生在运输层和网络层.运输层中的TCP会分段,网络层中的IP会分片.IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会 ...
- TCP首部的TimeStamp时间戳选项 转载
TCP应该是以太网协议族中被应用最为广泛的协议之中的一个,这里就聊一聊TCP协议中的TimeStamp选项.这个选项是由RFC 1323引入的,该C建议提交于1992年.到今天已经足足有20个年头.只 ...
- TCP/IP具体解释--三次握手和四次握手 Dos攻击
TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1) ...
- TCP/IP笔记(二)TCP/IP简介
上回,主要介绍了下协议和OSI参考模型,并简单了解下网络构成要素,这回该说说TCP/IP了 互联网与TCP/IP的关系 互联网进行通信时,需要相应的网络协议,TCP/IP原本就是为使用互联网而开发 ...
- TCP/IP 协议图--TCP/IP 基础
1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议.实际生活当中有时也确实就是指这两种协议.然而在很多情况下,它只是利用 IP 进行通信时所 ...
- TCP/IP协议图--TCP/IP基础
1. TCP/IP 的具体含义 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议.实际生活当中有时也确实就是指这两种协议.然而在很多情况下,它只是利用 IP 进行通信时所 ...
随机推荐
- 教程:SpagoBI开源商业智能之XML Template 图表模板
SpagoBI offers a variety of widgets' examples realized with the Highcharts library, that can be divi ...
- (原)关于i++和++i的小程序测试
今天看到一个程序,于是用vs运行了一下,结果出乎我的意料: 代码: ; +(i++))+(+(i++)); i=; +(++i))+(+(++i)); i=; printf("x=%d,y= ...
- Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
I find using the following works quite well for SQL min/max dates after many DB related errors: Date ...
- easyui tree 默认选中第一个元素
系统采用ajax异步调用后端接口做数据呈现,有个场景就是加载的树形菜单默认选中第一行,网上有人分享的解决方案能实现效果(http://aokunsang.iteye.com/blog/1489204) ...
- [Python] 02 - String
字符串 string 一.基本性质 不变性 Immutability 要变就 --> list --> string 二.功能函数 功能函数 S = 'Spam" S.find( ...
- 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- linux 几个命令
tail: tail -20 xxx --查看xxx文件的最后20行 more:分页查看,只能向后,不能向前 less:查看文件,可向前,向后,用的比较多 ll -h|more:当文件较多时,可以通 ...
- 【phpMQTT】phpMQTT详解以及处理使用过程中内存耗死问题
参考文档: https://www.cloudmqtt.com/docs-php.html github下载 : https://github.com/bluerhinos/phpMQTT Cloud ...
- RabbitMQ随笔
不管是官方还是能搜到的文章,使用MQ的基本思路都是这样: static void Main(string[] args) { //通过工厂建立连接 using (IConnection connect ...
- HDU 4725 The Shortest Path in Nya Graph(构图)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...