最近讨论到net.ipv4.tcp_timestamps这个系统配置是否能够开启,RFC文档上说道该值必须为单调递增,否则接受到的包可能会被丢掉
于是查看下tcp协议栈中是根据什么来生成这个timestamps的,是否会受时间改变而改变?
tcp协议栈代码如下:
static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb, struct tcp_out_options *opts, struct tcp_md5sig_key **md5) { //... if (likely(sysctl_tcp_timestamps && *md5 == NULL)) { opts->options |= OPTION_TS; opts->tsval = TCP_SKB_CB(skb)->when; opts->tsecr = tp->rx_opt.ts_recent; size += TCPOLEN_TSTAMP_ALIGNED; } //... }
然后搜索到:
TCP_SKB_CB(skb)->when = tcp_time_stamp;
接着
#define tcp_time_stamp ((__u32)(jiffies))
google得知:
测试环境抓包验证:
1、系统HZ(250)
2、开启timestamps选项后进行抓包
计算1s钟后Tsval理论上应该=1040600478 + 250 = 1040600728
实际抓包如下:
与计算值刚好相符合。
因此,这里可以判断tcp中的timestamps取的就是系统启动滴答声jiffies(若将Tsval/HZ可以看到与系统启动时间是一致的)
结论:
1、tcp_timestamps不受系统墙上时间和RTC时间修改的影响;
2、具体jiffies是否能够被修改(担心会被ntp服务修改),后续接着查询资料。
时间: 2024-10-23 05:21:19