背景
TCP/IP协议是当前网络时代的基础,所有的网络产品,或者是开发语言、开发框架都是基于tcp/ip协议的,所以说,学好tcp/ip对个人以后从事互联网行业会有巨大的帮助。
但是这是一个基础理论课程,就像操作系统这门课一样,学完之后可能不会对你产生太大的影响,不会让你立马拥有能够投入工作中的技能。但正是因为这是一个基础理论课,所有的互联网技术都是基于它的。所以如果你了解tcp/ip协议,将会对你未来发展或者在工作中排查问题产生积极的作用。
时间戳
格式
TimeStamp是tcp报文头部的一个可选项,一共占用10个字节,格式如下:
| kind(1字节) | length(1字节) | info(8字节) |
|---|
其中info字段又分为下面2个部分
| timestamp(4字节) | timestamp echo(4字节) |
|---|
tcp的时间戳主要解决了2个问题
- 计算往返时延
RTT - 防止序列号回绕问题
计算往返时延
比如现在a向b发送一个报文s1,b向a回复ACK报文s2,那么:
a向b发送报文时,timestamp中存放的时间戳就是a主机此时的内核时间ta1b向a回复报文时,timestamp中存放的就是b主机此时的时间tb1,timestamp echo的值为从s1报文解析出来的时间ta1a收到b回复的s2报文之后,此时a主机的内核时间为ta2,而在s2报文的timestamp echo存放的是ta1
最终:RTT = ta2 - ta1
上面的RTT是从a主机计算出来,但是此时如果a主机再回复一个报文给b主机,那么在b主机一端便可以得到一个tb2 - tb1的值,也能计算出RTT
防止序列号回绕
如果出现了序列号相同的包,那应该怎么办呢?
虽然说序列号seq number占用了32位,可以表达的范围为0~2^32-1,这能用的完吗?但是你别忘了初始化序列号是不一定的,而且如果C-S发送数据的时间够长,那肯定是可以用完的。此时序列号便会出现回绕。
利用timestamp可以很好的解决此问题。因为每次发包时都会将内核的时间记录在报文内部,那么2个包的序列号即使相同,时间戳也不可能相同,这样就可以区分了。
总结
这是tcp/ip系列的第七篇,主要详细介绍了tcp头部中时间戳的作用。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。
643

被折叠的 条评论
为什么被折叠?



