背景
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
主机此时的内核时间ta1
b
向a
回复报文时,timestamp
中存放的就是b
主机此时的时间tb1
,timestamp echo
的值为从s1
报文解析出来的时间ta1
a
收到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
头部中时间戳的作用。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。