wireshark中帶有SLE和SRE的SACK包詳解

一、名詞解釋

SLE: Sequence Left Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp數據的左邊界。
SRE: Sequence Right Edge of already acknowledged data when Selective Acknowledgments are used. 即已收到tcp數據的右邊界。


二、 使用場景


SACK在數據丟包需要重傳時起作用。比如,服務器已發送的數據爲1~34454個包,但是,客戶端只收到了“1~22774,28614~34454”這些序列的包,也就是說“22775~28613”這些包已經丟了。這個時候,客戶端會向服務器請求發送回饋包,說我收到了seq爲22774的包,同時也亂序收到了"SLE爲28614,SRE爲34454"的包。那麼,服務器就知道,接着從seq=22775的包開始發送,發送到seq=28613的包的時候,就不用在發送seq=28614的包了,因爲客戶端已經收到了。
如果ACK中不帶SLE和SRE會怎樣呢?那服務器就會重發從"22775"開始之後的所有的包,包括其實客戶端已經收到的"28614~34454"序號的包,那就浪費網絡帶寬了,不是麼。


三、多個亂序段的情況
    實際情況中較少見,因爲這代表着隔三差五就有丟包,丟包率應該很大。
    就我們使用的有線鏈路而言,丟包率不足0.1%,無線鏈路大約在5%左右。【注 1】
    在RFC2018中詳述了SACK包格式。
    有多個數據塊亂序的情況下,SLE和SRE也可以有多組,但因爲頭部字節限制,最多爲4組。


sack選項
   選項類型: 5
   選項長度: 可變,但整個TCP選項長度不超過40字節,實際最多不超過4組邊界值。
                         +--------+--------+
                         | Kind=5 | Length |
       +--------+--------+--------+--------+
       |      Left Edge of 1st Block       |
       +--------+--------+--------+--------+
       |      Right Edge of 1st Block      |
       +--------+--------+--------+--------+
       |                                   |
       /            . . .                  /
       |                                   |
       +--------+--------+--------+--------+
       |      Left Edge of nth Block       |
       +--------+--------+--------+--------+
       |      Right Edge of nth Block      |

       +--------+--------+--------+--------+

圖2是1組邊界的抓包截圖


注:

【1】無線鏈路的丟包率不確定,也有20%的情況


參考:

https://ask.wireshark.org/questions/1389/what-are-sre-and-sle?sort=votes

http://blog.chinaunix.net/uid-28387257-id-3624060.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章