從wireshark抓包看TCP頭部時間戳

2021-10-10 14:14:18 字數 2185 閱讀 5659

不知道大家有沒有注意到,wireshark抓取tcp報文的時候,大部分時候的報文是如下圖所示的,其中帶了seq,win和len欄位,分別對應了報文序列號、滑動視窗和tcp報文長度。

有時候,也會在報文中看到tsval 和 tsecr 這兩個引數,如下圖所示。

那麼這個引數**於**呢?又有什麼作用呢?

時間戳(tcp timestamps option,tsopt)**於tcp報文頭部的option選項。這個選項在 tcp 頭部的位置如下所示。

比如下圖,我們抓包的報文中的時間戳選項在option中。

tcp的時間戳由四部分構成:類別(kind)、長度(length)、傳送方時間戳(ts value)、回顯時間戳(ts echo reply)。時間戳選項類別(kind)的值等於 8,用來與其它型別的選項區分。長度(length)等於 10。兩個時間戳相關的選項都是 4 位元組。

是否使用時間戳選項是在三次握手裡面的 syn 報文裡面確定的。那麼這個時間戳選項有什麼作用嗎?主要有兩個作用:

由於在真實的網路中,各種丟包情況普遍存在,因此有一套超時重傳機制,也就是我們以前說的 tcp中的幾種定時器 《聊聊tcp中的幾個定時器》,那麼超時重傳的時間如何設定呢?

為了動態地設定,tcp引入了rtt(round trip time),也就是乙個資料報從發出去到回來的時間。這樣傳送端就大約知道需要多少的時間,從而可以方便地設定timeout——rto(retransmission timeout),以讓我們的重傳機制更高效。

但是實際上rtt的計算比較複雜,如下圖a所示,發生了重傳,如果按照第一次的報文和ack計算出來的rtt就比較大了,不合理。如圖b所示,重傳後收到了原始報文的ack,這樣計算出來的rtt偏小,也不合理。

因此,在啟用 timestamps 選項以後,因為 ack 包裡包含了 tsval 和 tsecr,這樣無論是正常確認包,還是重傳確認包,都可以通過這兩個值計算出 rtt。關於rto計算演算法,資料也比較多了。比如rfc793中定義的經典演算法是這樣的:

比如目前linux下使用的rto計算演算法為jacobson / karels 演算法:

tcp 的序列號用 32bit 來表示,因此在 2^32 位元組的資料傳輸後序列號就會溢位迴繞。tcp 的視窗經過視窗縮放可以最高到 2^30,也就是1g,在高速網路中,序列號在很短的時間內就會被重複使用。

如果有 timestamps 的存在,核心會維護乙個為每個連線維護乙個 ts_recent 值,記錄最後一次通訊的的 timestamps 值,當收到的資料報中 timestamps 值小於 ts_recent 值,就會丟棄掉這個資料報。等收到的資料報的timestamps 值大於 ts_recent,這個包可以被正常接收。

實際上timestamps 值是乙個單調遞增的值,這個選項不要求兩台主機進行時鐘同步。兩端 timestamps 值增加的間隔也可能步調不一致,比如一條主機以每 1ms 加一的方式遞增,另外一條主機可以以每 200ms 加一的方式遞增。此外,timestamps 是乙個雙向的選項,如果只要有一方不開啟,雙方都將停用。

在linux下可以通過下面方式開啟或關閉timestamp功能。

//0表示關閉,1表示開啟功能

cat /proc/sys/net/ipv4/tcp_timestamps

wireshark 抓包問題

一 the npf driver isn t running 這個錯誤是因為沒有開啟npf服務造成的。npf即網路資料報過濾器 netgroup packet filter,npf 是winpcap的核心部分,它是winpcap完成困難工作的元件。它處理網路上傳輸的資料報,並且對使用者級提供可捕獲 ...

Wireshark抓包練習

姓名 郭瀚鵬 學號 15307130174 專業 資訊保安 dns 查詢分組 首部區域 internet protocol version 4 ipv4 src 源ip dst 目的id header length 首部長度 differentiated services 區分服務 保證qos服務的...

wireshark抓包過濾

抓指定主機icmp包 icmp and ip.host 192.168.168.65 抓指定主機tcp資料報 tcp and ip.host 172.16.10.222 tcp.flags 顯示包含tcp標誌的封包。tcp.flags.syn 0 02 顯示包含tcp syn標誌的封包。1 對源位址...