TCP交換數據流——Nagle算法簡單記錄

Nagle算法:

     該算法提出的目的是想解決網絡中大量的小的TCP數據包造成網絡擁塞的問題,舉個例子,當客戶端要發送一個字節的TCP數據包到服務器時,我們實際上產生了41字節長的分組:包括20字節的IP首部,20字節的TCP首部以及1個字節的數據。這被稱爲微小分組。這種情況下,有效傳輸通道的利用率只有1/40 

      Nagle算法要求一個TCP連接上最多只能有一個未被確認的未完成的小分組,也就是說,當A想要向B很多報文時,A不能一次性發完,必須要等待B發送第一個分組的確認,A收到該確認之後才能發第二個分組。

 

Nagle算法用僞代碼的形式可以表示如下:


<span style="font-size:14px;">if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if</span>


參考資料:http://blog.csdn.net/louiswang2009/article/details/7772346

 

       在有些情況下,我們需要關閉Nagle算法,例如:對時延要求較高的鼠標移動響應、窗口程序、X窗口系統服務器等。Socket API用戶可以使用TCP_NODELAY選項來關閉Nagle算法。

       在TCP/IP詳解中,個人認爲P205的例子翻譯可能有些問題,與圖19-8不符,開啓Nagle算法會產生2秒的延時的問題,可能會產生數據的丟失,由此引發TCP的超時和重傳。如P207所述,“當進行多字節的按鍵輸入時,默認使用Nagle算法會引起額外的延時”。


經受時延確認算法:

        

  簡單的說,就是在上圖中,如果服務器回覆客戶的數據報23的時間間隔小於200ms,那麼它們將被合併成一個報文進行發送。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章