Networking
tcpdump:為什麼 ack 號大於 sack 號?
我
tcpdump
用來排查網路問題,發現有一條記錄,ack number大於sack number:為什麼確認號大於麻袋號?
這與RFC 2883中描述的 Duplicate Selective Acknowledgment 兼容,它將 DSACK 添加到RFC 2018中描述的 SACK 機制中。
這是 RFC 中的一個範例:
由於失去了幾個 ACK 數據包,數據發送方重新發送數據包 3000-3499,數據接收方隨後接收到序列號為 3000-3499 的重複段。接收方發送一個確認,其中累積確認欄位設置為 4000,第一個D-SACK 塊指定序列號 3000-3500。
Transmitted Received ACK Sent Segment Segment (Including SACK Blocks) 3000-3499 3000-3499 3500 (ACK dropped) 3500-3999 3500-3999 4000 (ACK dropped) 3000-3499 3000-3499 4000, SACK=3000-3500 ---------
第 5 節描述瞭如何辨識 DSACK:
為了讓發送方檢查確認的第一個 (D)SACK 塊是否確實確認了重複數據,發送方應將第一個 SACK 塊中的序列空間與同一數據包中攜帶的累積 ACK 進行比較。 如果 SACK 序列空間小於此累積 ACK,則表明由 SACK 塊標識的段已被接收器多次接收。
所以在這種情況下 ACK > SACK。僅當從接收方到發送方的數據包(即 ACK)失去時才會發生這種情況,然後該數據包隨後觸發了來自發送方的(無用的)數據重新發送,該數據甚至隨後通過 DSACK 從接收方報告回發送方。此資訊可能用於某些擁塞算法。我不知道這是否與您的擷取兼容,但這是需要檢查的。
例如,在 Linux 上,DSACK 可能預設處於活動狀態:
# sysctl -ar 'net\.ipv4\.tcp_d?sack' net.ipv4.tcp_dsack = 1 net.ipv4.tcp_sack = 1