1.Timestamps 選項的組成部分
時間戳選項占10個字節= kind(1字節) + length(1字節) + info (8字節),其中kind=8,length=10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)兩個值組成,各4個字節的長度。
2. Timestamps 選項工作原理
以一次抓包為例:
- 發送方發送數據時,將一個發送時間戳 1590508660 放在發送方時間戳TSval中
- 接收方收到數據包以后,將收到的時間戳 1590508660 原封不動的返回給發送方,放在TSecr字段中,同時把自己的時間戳 1499872733 放在TSval中
3. Timestamps 選項的作用
時間戳選項主要的功能有兩個:
3.1 用來計算往返時間RTT。
發送方在發送報文段時把當前時鐘的時間值放入時間戳字段,接收方在確認該報文段時把時間戳字段值復制到時間戳回送回答字段。因此,發送方在收到確認報文后,可以準確計算出RTT。時間戳是一個單調增長的值,接收方只需要回顯收到的內容,因此是不需要關注時間戳的單元是什么,也不需要連接雙發的時鐘同步。
例如:主機a向主機b發送一個報文s1,在發送時將內核時刻ta1記錄到報文s1的選項字段時間戳timestamp區域;主機b接收到報文s1后,從s1的時間戳timestamp區域將ta1取出來,復制到應答報文s2的時間戳timestampecho區域。如此一來,主機a收到s2時,此時的內核時刻是ta2,那么RTT = ta2 - ta1。這在一定程度上就能反映網絡的擁堵情況了。
為什么需要用Timestamps計算RTT
TCP 在發送一個包時,會記錄這個包的發送的時間 t1,用收到這個包的確認包時 t2 減去 t1 就可以得到這次的 RTT。這里有一個問題,如果發出的包出現重傳,計算就變得復雜起來。無法得知收到的確認 ACK 是對第一次包還是重傳包的的確認。
3.2 PAWS:防止回繞的序號。
我們知道序列號只有32位,而每增加2^32個序列號后就會重復使用原來用過的序列號。假設我們有一條高速網絡,通信的主機雙方有足夠大的帶寬用來快速的傳輸數據。例如1Gb/s(TCP 的窗口經過窗口縮放可以最高到 1GB(2^30))的速率發送報文段,則不到35秒鐘數據字節的序列號就會重復。這樣對TCP傳輸帶來混亂的情況。這種情況之出現在高速鏈路上。而采用時間戳選項,可以很容易的分辨出相同序列號的數據報,哪個是最近發送,哪個是以前發送的。
4. Timestamps 選項在三次握手中造成的RST
三次握手中的第二步,如果服務端回復 SYN+ACK 包中的 TSecr 不等于握手第一步客戶端發送 SYN 包中的 TSval,客戶端在對 SYN+ACK 回復 RST。示例包如下所示。
5.使用Timestamps 選項的注意事項
- Timestamps是雙向的,必須雙方都開啟才有效
- Timestamps也會溢出回繞
- timestamps 值是一個單調遞增的值,但是兩端 timestamps 值增加的間隔也可能步調不一致