透過 TCP 傳送的鍵盤輸入流量,每個封包只攜帶極小的酬載:單次按鍵會變成一個只有數十位元組的區段,外頭再包上 40 位元組的標頭。在慢速鏈路上,這會讓網路充斥幾乎不帶資料的封包,也就是 Nagle 所稱的小封包症或愚蠢視窗症。

直覺的解法有兩種:立即送出(浪費頻寬),或等到緩衝滿一個完整區段再送(增加延遲)。Nagle 的規則介於兩者之間:保留一個小區段尚未確認,其餘的批次排在它的確認之後。

這種批次處理很自然,因為 TCP 本來就會等待該確認;演算法只是把它變成規則,而非偶然,互動式應用程式因此能以一小部分的封包數量換得低延遲。

送出一個小封包,其餘批次處理直到收到 ACK

一位元組封包的大部分位元組都浪費在標頭上。

批次排在 ACK 之後,不會增加新的固定等待。

它減少了封包數量,又不必承受完整區段緩衝帶來的延遲。

要修正浪費,可允許一個小單位,其餘批次排在其確認之後,並以你原本就在做的等待來界定成本上限。

Nagle 演算法在 RFC 1122 中被列為重要的 TCP 要求,幾乎所有 TCP 協定堆疊都實作了它,也成為以少許延遲換取負載大幅下降的經典範例。

追溯依據

參考來源

  1. RFC 896: Congestion Control in IP/TCP Internetworks IETF · rfc-editor.org
  2. RFC 1122: Requirements for Internet Hosts - Communication Layers IETF · rfc-editor.org