2012-03-13 56 views
2

以下是對Nagle算法的兩個簡單描述。針對Nagle算法的描述正確嗎?

版本1:等待對端發送任何部分分組

2版前確認先前發送的分組:等待對等體確認發送任何部分分組

之前先前發送 局部

第1版是什麼,我從谷歌搜索信息瞭解的結果,如Wiki(Nagle's algorithm)TCP_CORK: More than you ever wanted to know

2版是什麼,我從Linux內核實現Nagle算法

static inline int tcp_nagle_check(const struct tcp_sock *tp, 
           const struct sk_buff *skb, 
           unsigned mss_now, int nonagle) 
{ 
    return (skb->len < mss_now && 
      ((nonagle & TCP_NAGLE_CORK) || 
      (!nonagle && tp->packets_out && tcp_minshall_check(tp)))); 
} 

功能tcp_minshall_check()檢查所有已發送小的數據包是否獲得確認的理解的結果。

所以我的問題是:

  1. 其描述是正確的?
  2. 如果兩者都是正確的,那麼Linux的修改有什麼優勢?
+0

無論是正確的,有沒有這樣的事,作爲一個「局部包「在TCP中。 – Alnitak 2012-03-13 14:56:45

+0

我猜「部分數據包」是指長度小於MSS的數據包。爲什麼它不在TCP中存在? – sliter 2012-03-13 15:06:14

+1

,因爲TCP是一個面向流的協議,底層的_segmentation_應該是應用層不可見的。每個TCP數據包被定義完成(除非它已經遭受IP層_fragmentation_)。 – Alnitak 2012-03-13 15:08:39

回答

1

這兩者之間的唯一區別就在於,(2)即使存在未分割的分段,如果這些分段是全尺寸,也會立即發送一個分段。即如果它最近只發送全尺寸的部分,其中一些仍然「空中」。

這是一件好事,因爲這種情況並不表示使用小包的聊天連接。這種情況在數據批量傳輸結束時經常發生。除非文件傳輸的大小能夠完全由TCP段的大小整除,以便最後一段填充一個段(這不太可能發生),否則數據段將具有不完整的段作爲其最後一部分。

僅僅因爲它較小而延遲發送最後一批批量轉移沒有任何意義。

規則1將通過在發送最後一塊之前使發送者執行無意義的延遲來減慢幾乎所有的HTTP傳輸。

(你確定這是真正的規則?注意尼古拉ňFetissov的評論請務必仔細閱讀真正的RFC,而不是二手的來源。)