tcp timestamps


最近討論到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得知:

jiffies變量記錄了系統啟動以來,系統定時器已經觸發的次數。內核每秒鍾將jiffies變量增加HZ次。因此,對於HZ值為100的系統,1個jiffy等於10ms,而對於HZ為1000的系統,1個jiffy僅為1ms。 

測試環境抓包驗證:

1、系統HZ(250)

2、開啟timestamps選項后進行抓包

計算1s鍾后Tsval理論上應該=1040600478 + 250 = 1040600728

實際抓包如下:

與計算值剛好相符合。

因此,這里可以判斷tcp中的timestamps取的就是系統啟動滴答聲jiffies(若將Tsval/HZ可以看到與系統啟動時間是一致的)

結論:

1、tcp_timestamps不受系統牆上時間和RTC時間修改的影響;

2、具體jiffies是否能夠被修改(擔心會被ntp服務修改),后續接着查詢資料。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM