[LTE] SACK消息(Selective ACK)

TCP通信時,如果發送序列中間某個數據包丟失,TCP會通過重傳最後確認的包開始的後續包,這樣原先已經正確傳輸的包也可能重複發送,急劇降低TCP性能。爲改善這種情況,發展出SACK(Selective Acknowledgment, 選擇性確認)技術,使TCP只重新發送丟失的包,不用發送後續所有的包,而且提供相應機制使接收方能告訴發送方哪些數據丟失,哪些數據重發了,哪些數據已經提前收到等

SACK的產生
SACK通常都是由TCP接收方產生的,在TCP握手時如果接收到對方的SACK允許選項同時自己也支持SACK的話,在接收異常時就可以發送SACK包通知發送方對中間有丟包或延遲時的SAC。如果TCP接收方接收到非期待序列號的數據塊時,如果該塊的序列號小於期待的序列號,說明是網絡複製或重發的包,可以丟棄;如果收到的數據塊序列號大於期待的序列號,說明中間包被丟棄或延遲,此時可以發送SACK通知發送方出現了網絡丟包。
爲反映接收方的接收緩存和網絡傳輸情況,SACK中的第一個塊必須描述是那個數據塊激發此SACK選項的,接收方應該儘可能地在SACK選項部分中填寫儘可能多的塊信息,即使空間有限不能全部寫完,SACK選項中要報告最近接收的不連續數據塊,讓發送方能瞭解當前網絡傳輸情況的最新信息

對重發包的SACK
RFC2883中對SACK進行了擴展,在SACK中描述的是收到的數據段,這些數據段可以是正常的,也可能是重複發送的,SACK字段具有描述重複發送的數據段的能力,在第一塊SACK數據中描述重複接收的不連續數據塊的序列號參數,其他SACK數據則描述其他正常接收到的不連續數據,因此第一塊SACK描述的序列號會比後面的SACK描述的序列號大;而在接收到不完整的數據段的情況下,SACK範圍甚至可能小於當前的ACK值。通過這種方法,發送方可以更仔細判斷出當前網絡的傳輸情況,可以發現數據段被網絡複製、錯誤重傳、ACK丟失引起的重傳、重傳超時等異常的網絡狀況

發送方對於SACK的響應
TCP發送方都應該維護一個未確認的重發送數據隊列,數據未被確認前是不能釋放的,這個從重發送隊列中的每個數據塊都有一個標誌位“SACKed”標識是否該塊被SACK過,對於已經被SACK過的塊,在重新發送數據時將被跳過。發送方接收到接收方SACK信息後,根據SACK中數據標誌重發送隊列中相應的數據塊的“SACKed”標誌,但如果接收不到接收方數據,超時後,所有重發送隊列中數據塊的SACKed位都要清除,因爲可能接收方已經出現了異常。

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