tcp timestamps

最近討論到net.ipv4.tcp_timestamps這個系統配置是否可以開啓,RFC文檔上說道該值必須爲單調遞增,不然接受到的包可能會被丟掉tcp

因而查看下tcp協議棧中是根據什麼來生成這個timestamps的,是否會受時間改變而改變?測試

tcp協議棧代碼以下:google

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;
        }  
        //...
}

而後搜索到:spa

TCP_SKB_CB(skb)->when = tcp_time_stamp;

接着htm

#define tcp_time_stamp ((__u32)(jiffies))

google得知:blog

jiffies變量記錄了系統啓動以來,系統定時器已經觸發的次數。內核每秒鐘將jiffies變量增長HZ次。所以,對於HZ值爲100的系統,1個jiffy等於10ms,而對於HZ爲1000的系統,1個jiffy僅爲1ms。 ip

測試環境抓包驗證:md5

一、系統HZ(250)文檔

二、開啓timestamps選項後進行抓包get

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

實際抓包以下:

與計算值恰好相符合。

所以,這裏能夠判斷tcp中的timestamps取的就是系統啓動滴答聲jiffies(若將Tsval/HZ能夠看到與系統啓動時間是一致的)

結論:

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

二、具體jiffies是否可以被修改(擔憂會被ntp服務修改),後續接着查詢資料。

相關文章
相關標籤/搜索