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 进行通信时所 ...
随机推荐
- 【转】Spring Framework灰度发布
今天简单介绍下SpringFramework微服务中几种服务发布策略以及实现方式.我接触过的有蓝绿.滚筒和灰度发布. 蓝绿发布: 简单说就像美帝选总统投票一样,非蓝即绿一刀切,这个其实也是传统软件架构 ...
- Kiss MySQL goodbye for development and say hello to HSQLDB
The days of using MySQL, DB2, PostgreSQL etc for development is over.. I don’t know why any program ...
- Java如何查找系统的代理设置?
在Java编程中,如何查找系统的代理设置? 以下示例显示如何使用HttpURLConnection类的systemSetting()方法和getResponse()方法的put方法在系统上查找代理设置 ...
- Java如何将每个单词的第一个字符转为大写?
在Java编程中,如何将每个单词的第一个字符转为大写? 以下示例演示如何使用toUpperCase(),appendTail()方法将字符串中每个单词的第一个字母转换为大写字母. package co ...
- CentOS安装python-pip
在使用Python时,需要导入一些第三方工具包,一般情况下,鼓励使用pip来安装管理这些第三方的包,这里我们来看一下如何在CentOS 6.4上安装Python-pip. 第一步,下载python ...
- QT QQuickView嵌入到QT MDI中
在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...
- 【algorithm】 二分查找算法
二分查找算法:<维基百科> 在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)[1].对数搜索(英语:logari ...
- [Node.js] 09 - Connect with Database
简介两个数据库: Node.js 连接 MySQL Node.js 连接 MongoDB Node.js 连接 MySql 导入已有数据库: unsw@unsw-UX303UB$ mysql -u r ...
- 【代码审计】XYHCMS V3.5任意文件删除漏洞分析
0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...
- [Cubieboard] 镜像资源汇总
Linaro Server 14.04 (SDCard) 下载:cb2-lubuntu-server-tsd-tfcard-v2.0.img.gz 内核:GNU/Linux 3.4.79 armv7l ...