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首部的TimeStamp时间戳选项 转载的更多相关文章
- TCP/IP具体解释--TCP首部的TimeStamp时间戳选项
TCP应该是以太网协议族中被应用最为广泛的协议之中的一个,这里就聊一聊TCP协议中的TimeStamp选项.这个选项是由RFC 1323引入的,该C建议提交于1992年.到今天已经足足有20个年头.只 ...
- TCP/IP详解--TCP首部选项中时间戳选项
一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算. 二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...
- TCP时间戳选项Timestamp
时间戳选项发送方在每个报文段中放置一个时间戳值.接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT(我们必须说“每一个收到的ACK”而不是“每一个收到的报文段”,是因为TCP通常 ...
- TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。
from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...
- TCP 之 TCP首部
TCP首部图 TCP首部说明 源端口,目的端口 用于寻找发送端和接收端应用进程.(源IP,源端口,目的IP,目的端口) 四元组确定唯一一个TCP连接:(IP,端口)也称为一个插口(socket): 序 ...
- TCP 首部格式
<图解TCP/IP> 6.7 TCP的首部格式 TCP中没有表示包长度和数据长度的字段.可由IP层获知TCP的包长由TCP的包长可知数据的长度. 源端口号:表示发送端端口号,字段长16位 ...
- TCP首部解析
TCP首部: TCP数据被封装在一个IP数据报中,如下: TCP首部数据格式: 16位源都口号,16为目的端口号用于寻找发送端和接收端的应用进程,加上IP首部的源端IP及终端IP,唯一的确认一个TCP ...
- Oracle 日期类型timestamp(时间戳)和date类型使用
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差
问题描述 在Spring Boot项目中,使用@RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式 ,如下所示: 解决方案 ...
随机推荐
- CentOS7/RHEL6下,如何查看目录与子目录大小
原文:CentOS7/RHEL6下,如何查看目录与子目录大小 通过强大的[du]命令,可以帮助我们快捷的查看目录的大小,非常实用. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du ...
- SOLID Principles
Intention: more understandable, easier to maintain and easier to extend.(通过良好的设计使得代码easy and simple, ...
- Java Web 深入分析(9) Session 和 Cookie
前言: session 和cookie都是为了保持服务器和客户端之间交互状态.如果一天的PV有几亿,而一个cookie占200个字节但是也会占用很多带宽?所以大访问量就引用session,但是几百台服 ...
- javascript--BOM(browser object model)五大对象
浏览器对象模型: 作用:访问.控制.修改浏览器,与浏览器进行交互(打开新的窗口.回退历史记录.获取url) BOM与的DOM区别:JS通过BOM与浏览器进行交互.BOM的window对象包含了docu ...
- sql语句查询结果中添加自增列
SELECT Row_Number() over ( order by getdate() ) as init , * FROM 表名
- Flutter——AspectRatio组件
AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由宽度和比率决定的,类似于 Bo ...
- Linux命令——shutdown、halt、poweroff、reboot、cal、date
shutdown shutdown在关机的时候会通知所有用户 shutdown –r now 现在重启 shutdown now 现在关机 shutdown +5 过5分钟关机 shutdown –c ...
- 论文笔记:Deformable ConvNets v2: More Deformable, Better Results
概要 MSRA在目标检测方向Beyond Regular Grid的方向上越走越远,又一篇大作推出,相比前作DCN v1在COCO上直接涨了超过5个点,简直不要太疯狂.文章的主要内容可大致归纳如下: ...
- jmeter——参数化、关联、断言
1.jmeter——参数化 三种方式: ${变量名} 1.1用户定义的变量 比如注册,登录都得用到手机号码,那就把手机号码自定义为变量 1)添加一个线程组--注册.登录HTTP请求--察看结果树--用 ...
- 《JavaScript DOM编程艺术》(第二版)学习笔记(一)
这本书去年就买了但一直没看,闲暇的时候看了下,发现里面写的内容还真是不错,所以决定一边在博客上记录些学习的笔记,以便以后观看及查找方便. js文件最好的做法是放在< body>标签里,这样 ...