Saturday, September 29, 2007

TCP - SACK

TCP選擇性通知 (SACK) 選項的延伸
SACK 定義於 RFC 2018 (英文) 中,它可以讓接收端指出多達四個不連續區塊的接收資料。RFC 2883 負責定義 SACK TCP 選項中的欄位的額外使用,藉此通知您有重複的封包。此舉可讓傳送含有 SACK 選項的 TCP 區段者,判斷它何時在不必要的情況下重新傳輸一個區段,並且調整其行為,以免未來再有重新傳輸的舉動出現。重新傳輸的次數愈少,整體輸送量愈佳。

因工作需求,現在再研究如何在TCP Stack裡面加入此SACK的功能...

SACK應用實例

發送方 接收方 接收方發送的ACK 送的資料 收的資料 (包括SACK) SACK累加接收的数据

5000-5499 (該包遺失)
5500-5999 5500-5999 5000, SACK=5500-6000
6000-6499 6000-6499 5000, SACK=5500-6500
6500-6999 6500-6999 5000, SACK=5500-7000
7000-7499 7000-7499 5000, SACK=5500-7500

数据包丢失,ACK丢失

3000-3499 3000-3499 3500 (ACK包丢失)
3500-3999 3500-3999 4000 (ACK包丢失)
4000-4499 (该包丢失)
4500-4999 4500-4999 4000, SACK=4500-5000 (ACK包丢失)
3000-3499 3000-3499 4000, SACK=3000-3500, 4500-5000
---------此为D-SACK

数据段丢失和延迟

500-999 500-999 1000
1000-1499 (延迟)
1500-1999 (该包丢失)
2000-2499 2000-2499 1000, SACK=2000-2500
1000-2000 1000-1499 1500, SACK=2000-2500
1000-2000 2500, SACK=1000-1500
---------此为D-SACK

5.4 数据段丢失且延迟

     500-999 500-999 1000
1000-1499 (延迟)
1500-1999 (该包丢失)
2000-2499 (延迟)
2500-2999 (该包丢失)
3000-3499 3000-3499 1000, SACK=3000-3500
1000-2499 1000-1499 1500, SACK=3000-3500
2000-2499 1500, SACK=2000-2500, 3000-3500
1000-2499 2500, SACK=1000-1500, 3000-3500
---------此为部分D-SACK