解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的 (4)

这个时间戳是一个相对时间戳而不是我们通常理解的绝对时间戳(自1970年1月1日的那种形式),而且你不能把它当做时间来用,在RFC1323中也提到对报文的接收者来讲时间戳可以看做另外一种高阶序列号。

这里就会有一个问题,2个时间戳,一个是自己的,一个是对端的,到底用哪个时间戳来进行比较来确定是否丢弃报文呢?答案是TSval,也就是发送端的时间戳。这样很容易理解,作为主动断开的一方要丢弃的是对端传递过来的重复报文,显然需要用对端的时间戳来判断不可能用自己的时间戳。而且从上图可以看到自己的时间戳和对端的时间戳明显有很大差距,也就是说这个时间戳是通信双方自己生成的。这个时间戳就放在TCP报文的options选项中,如下图:

解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

可以看到它是options,既然是选项那么就不是必须的,所以这也就是为什么当开启reuse和recycle的时候要求开启这个,因为不开启则无法识别重复的IP分组。

简单原理就是:保存该socket上一次报文的TSval时间戳,如果该socket的4元组被重复利用或者快速回收,那么假如收到了之前连接重复的报文,则比较该报文的时间戳是不是比保存的TSval小,如果小则丢弃。我这里只是简单来说基于时间戳的机制来放置重复报文,整个的PAWS还有其他的原则,具体请查看。

另外,由于时间戳也是通过一串数字来表示且TCP头的时间戳长度也是32位(每个都是4byes),所以它也会出现循环,时间跳动频率就决定了翻转周期,那这个频率是多少呢,RFC1312中规定建议在1ms到1s之间,这个时间间隔不同系统可能不一样,不过这里内核选项和用户选项的区别:

内核选项,在Linux中cat /boot/config-$(uname -r) | grep -w "CONFIG_HZ"查看,

解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

Jiffies是从计算机启动到现在总共发生多少节拍数,节拍数叫做Tick,Tick是HZ的倒数,如果上所示HZ是1000,每秒发生1000次中断,也就是1毫秒发生一次中断,对应Tick是1ms,也就是每1毫秒Jiffies就加1。当重启电脑的时候Jiffies重置。

用户选项,由于用户空间程序不能直接访问,所以内核还提供了一个USER_HZ来让用户空间程序使用,固定为100,百分之一秒,也就是10毫秒。如何查看呢?getconf CLK_TCK命令:

解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

我们从网卡上看也是这个值cat /proc/sys/net/ipv4/neigh/ens33/locktime

解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxpsy.html