TCP之Nagle演算法 延遲ACK

2021-09-02 23:59:49 字數 1191 閱讀 3083

1. nagle演算法:

是為了減少廣域網的小分組數目,從而減小網路擁塞的出現;

該演算法要求乙個tcp連線上最多只能有乙個未被確認的未完成的小分組,在該分組ack到達之前不能傳送其他的小分組,tcp需要收集這些少量的分組,並在ack到來時以乙個分組的方式傳送出去;其中小分組的定義是小於mss的任何分組;

該演算法的優越之處在於它是自適應的,確認到達的越快,資料也就發哦送的越快;而在希望減少微小分組數目的低速廣域網上,則會傳送更少的分組;

2. 延遲ack:

如果tcp對每個資料報都傳送乙個ack確認,那麼只是乙個單獨的資料報為了傳送乙個ack代價比較高,所以tcp會延遲一段時間,如果這段時間內有資料傳送到對端,則捎帶傳送ack,如果在延遲ack定時器觸發時候,發現ack尚未傳送,則立即單獨傳送;

延遲ack好處:

(1) 避免糊塗視窗綜合症;

(2) 傳送資料的時候將ack捎帶傳送,不必單獨傳送ack;

(3) 如果延遲時間內有多個資料段到達,那麼允許協議棧傳送乙個ack確認多個報文段;

3. 當nagle遇上延遲ack:

試想如下典型操作,寫-寫-讀,即通過多個寫小片資料向對端傳送單個邏輯的操作,兩次寫資料長度小於mss,當第一次寫資料到達對端後,對端延遲ack,不傳送ack,而本端因為要傳送的資料長度小於mss,所以nagle演算法起作用,資料並不會立即傳送,而是等待對端傳送的第一次資料確認ack;這樣的情況下,需要等待對端超時傳送ack,然後本段才能傳送第二次寫的資料,從而造成延遲;

4. 關閉nagle演算法:

使用tcp套接字選項tcp_nodelay可以關閉套接字選項;

如下場景考慮關閉nagle演算法:

(1) 對端不向本端傳送資料,並且對延時比較敏感的操作;這種操作沒法捎帶ack;

(2) 如上寫-寫-讀操作;對於此種情況,優先使用其他方式,而不是關閉nagle演算法:

--使用writev,而不是兩次呼叫write,單個writev呼叫會使tcp輸出一次而不是兩次,只產生乙個tcp分節,這是首選方法;

--把兩次寫操作的資料複製到單個緩衝區,然後對緩衝區呼叫一次write;

--關閉nagle演算法,呼叫write兩次;有損於網路,通常不考慮;

5. 禁止nagle和開啟nagle演算法傳送資料與確認示意圖:

Nagle演算法和延遲ACK

nagle演算法 是為了減少廣域網上的小分組的數目,從而減少網路擁塞的出現。該演算法要求乙個tcp連線上最多只能有乙個未被確認的未完成的小分組,在該分組ack到達之前不能傳送其他的小分組,tcp需要收集這些少量的分組,並在ack到來時以乙個分組的方式傳送出去,其中小分組的定義是小於mss的任何分組。...

延遲確認和Nagle演算法

前篇文章介紹了三次握手和四次揮手,了解了tcp是如何建立和斷開連線的,文末還提到了抓包揮手時的乙個 異常 現象,當時無法解釋,特地查了資料,知道了資料傳輸中的延遲確認策略。何謂延遲確認策略?正是這個策略,讓圖中缺少了一次斷開連線的包,仔細看可以發現4405和4287之間時間也是差了200ms左右,為...

TCP IP延遲確認和Nagle演算法

延遲確認 接收端收到資料之後,並不立即傳送ack確認收到資料,而是延遲傳送ack,等待一段時間,以期望和沿該方向傳送的資料一起傳送。nagle演算法 盡可能傳送大塊資料,避免使網路中充斥小分組,從而減少傳送包的個數來增加網路的利用率。nagle演算法要求在任意時刻,最多有乙個未被確認的分組,在收到確...