tcp SACK選擇確認位

2021-09-02 16:22:35 字數 1629 閱讀 8984

考慮乙個場景,tcp發動端連續傳送了4個包1-200,201-300,301-400,401-500. 接收端接收了1-200, 201-300,401-500。由於301-400沒有收到,所以接收端只能傳送乙個ack 301給傳送端,以確認1-300都收到,而401-500無法給傳送端確認。這時傳送端不知道301-400和401-500這兩個包是否到達接收端。

處理這種情況有兩種可能的方式:

僅重傳超時片段:這是一種更加保守的方式,僅重傳超時的片段,希望其他片段都能夠成功接收。但因為傳送端沒法確認200後到底有多少片段沒被接收,情況就比較複雜。如果該片段之後的其他片段實際上接收到了,這一方式是最佳的。如果沒接收到,就無法正常執行,這時後面的每乙個片段需要單獨計時並重傳。

重傳所有片段:這是一種更激進或者說更悲觀的方式。無論何時乙個片段超時了,不僅重傳該片段,還有所有其他尚未確認的片段(301-400和401-500都會重傳)。這一方式確保了任何時間都有乙個等待確認的停頓時間,在所有未確認片段丟失的情況下,會重新整理全部未確認片段,以使對端裝置多一次接收機會。這種方式的問題在於可能這些重傳是不必要的。如果第乙個片段丟失而後面其他片段都接收到了,也得重傳所有片段。

由於tcp不知道其他片段是否接收到,所以它也無法確認哪種方法更好,但只能選擇一種方式

tcpdump抓包時,在sync協商階段可以看到乙個「sackok」的字段。

10:37:02.939789 ip 10.138.226.167.17198 > 10.139.252.110.9360: flags s, seq 986305541, win 14600, options mss 1460,nop,nop,sackok, length 0

這個位叫做選擇確認(selective acknowledgment, sack)。

它就用來處理上面的問題,即在tcp確認機制中,無法有效處理非連續tcp片段的問題。

但前提是連線的兩方裝置必須同時支援這一功能,通過連線時使用的syn片段來協商是否允許sack(即抓包中顯示的sackok)。這一過程完成之後,任一裝置都可以在常規tcp片段中使用sack選項。這一選項包含乙個關於已接收但未確認片段資料sequence number範圍的列表,如果某個片段已被選擇確認過,則該片段中的sack位元位置為1。該方式使用激進方式的改進版本,乙個片段重傳之後,之後所有片段也會重傳,除非sack位元位為1

例如,在示例中4個片段的情況下,當接收端發回ack為301(1-200,201-300)的確認資訊,其中包含乙個sack選項指明:「已接收到位元組401至500,但尚未確認」。如果片段4在片段1和2之後到達,上述資訊也可以通過乙個單獨的ack確認片段來完成。伺服器確認片段4的位元組範圍,並為片段4開啟sack位。當片段3重傳時,伺服器看到片段4的sack位為1,就不會對其重傳。

在片段3重傳之後,片段4的sack位被清除。這是為了防止客戶端出於某種原因改變片段4已接收的想法。客戶端應當傳送確認號為501或更高的確認資訊,正式確認片段3和4接收到。如果這一情況沒有發生,伺服器必須接收到片段4的另一條選擇確認資訊才能將它的sack位開啟,否則,在片段3重傳時或計時器超時的情況下會對其自動重傳。

css 正確認識和使用選擇器

css中選擇器分為很多個 我們該如何正確使用呢?首先,我們要了解css中都有哪些選擇器 標籤選擇器 class選擇器 id選擇器 子代選擇器 後代選擇器 交集選擇器 並集選擇器.我們在寫 中該如何正確使用這些選擇器呢?1.標籤選擇器 這是乙個很簡單的選擇器 給大家寫個列子 這段 中 div 就是屬於...

ubuntu 到底是選擇32位還是64位?

2011 06 03 15 16 31 標籤 ubuntu linux 休閒cpu職場 翻譯人員 drivel mailto drivel at gmail dot com 校正人員 murodoch 貢獻人員 適用版本 全部 不過清往下看,可以解開您心中更多的困惑。哪個更好?那些軟體已經不是重要的...

32位和64位系統的區別及如何選擇

32 位作業系統表示 32 位 cpu 對記憶體定址的能力 64 位作業系統表示 64 位 cpu 對記憶體定址的能力 32 位的作業系統安裝在 32 位 cpu 處理器和 64 位 cpu 處理器上 64 位作業系統只能安裝 64 位 cpu 處理器上 32 位作業系統對記憶體定址不能超過 4gb...