最近在學習tcp/ip,在擁塞控制部分出現了nagle算法,網上看了一些資料
http://b.baidu.com/view/2468335.htm
Nagle算法的基本定義是任意時刻,最多只能有一個未被確認的小段。 所謂“小段”,指的是小於MSS尺寸的數據塊,所謂“未被確認”,是指一個數據塊發送出去後,沒有收到對方發送的ACK確認該數據已收到。
Nagle算法的規則(可參考tcp_output.c文件裡tcp_nagle_check函數注釋):
(1)如果包長度達到MSS,則允許發送;
(2)如果該包含有FIN,則允許發送;
(3)設置了TCP_NODELAY選項,則允許發送;
(4)未設置TCP_CORK選項時,若所有發出去的小數據包(包長度小於MSS)均被確認,則允許發送;
(5)上述條件都未滿足,但發生了超時(一般為200ms),則立即發送。
問題:
關於nagle算法的第五點,假設有如下場景
client發送第一個字節package1(200ms超時)後,產生了第一個未確認ack,現假設網絡異常,client遲遲未收到對package1的ack,但同時client這邊產生了第二個字節需要發送,現在client端總共有2字節的待發送數據<mss(1500),經過一段時間後,package1的ack還未到達,但此時tcp緩沖區的2字節已經再次觸發條件5,現在client端會發送新的package嗎?如果發送後,未確認的ack數會變成2嗎(違反nagle算法)?或者是進行了 tcp重新分組後,即使發送了這個兩個字節的package未被確認ack仍然為1(怎麼感覺這就是答案呢)?求大神解答,3Q
這個應該會觸發TCP重傳計時器超時而把第一個和第二個放在同一個包裡重新傳輸吧?