**:
nagle演算法是針對網路上存在的微小分組可能會在廣域網上造成擁塞而設計的。該演算法要求乙個tcp連線上最多只能有乙個未被確認的未完成的小分組,在該分組確認到達之前不能傳送其他的小分組。同時,tcp收集這些少量的分組,並在確認到來時以乙個分組發出去。它的設計規則如下:
(1)如果包長度達到最大報文長度(mss,maximum segment size),則允許傳送;
(2)如果該包含有fin,則允許傳送;
(3)設定了tcp_nodelay選項,則允許傳送;
(4)未設定tcp_cork選項時,若所有發出去的小資料報(包長度小於mss)均被確認,則允許傳送;
(5)上述條件都未滿足,但發生了超時(一般為200ms),則立即傳送。
與nagle演算法相對應的tcp確認延遲機制(tcp delayed acknowledge)設計的作用是接收到資料後延遲ack的傳送(40ms),使得tcp協議棧有機會合併多個ack以提高效能。
由於有nagle演算法,如果傳送端啟用了nagle演算法,接收端啟用了tcp delayed acknowledge。當傳送端發起兩次寫一次讀的時候,第一次寫,由於tcp沒有等待ack,直接發出去了,而第二次寫的時候,第一次寫的ack還沒有接收到,從而等待;而接收端有delayed acknowledge機制,會等待40ms以提供合併多個ack的機會。nagle演算法的使用在一些實時性要求比較高的場合,會引起一些問題。比如專案中設計的ui滑鼠遠端控制遠端的機器時,發現遠端的滑鼠操作很卡頓,這是因為滑鼠訊息的傳送端由於nagle演算法的預設開啟,是有延遲的,對相應的socket設定為tcp_nodelay即可關閉nagle演算法:
setsockopt(fd,ipproto_tcp,tcp_nodelay,(char*)&flag,sizeof(flag));
TCP IP延遲確認和Nagle演算法
延遲確認 接收端收到資料之後,並不立即傳送ack確認收到資料,而是延遲傳送ack,等待一段時間,以期望和沿該方向傳送的資料一起傳送。nagle演算法 盡可能傳送大塊資料,避免使網路中充斥小分組,從而減少傳送包的個數來增加網路的利用率。nagle演算法要求在任意時刻,最多有乙個未被確認的分組,在收到確...
delay ack與nagle演算法
tcp在處理互動資料流時會採用delay ack與nagle演算法 在接收到資料時,並不立刻傳送ack,而將ack的傳送推遲到下一次與該方向要傳送的資料一起傳送或是達到最大時延 大多數為200ms 可以通過tcp quickack選項設定 該演算法要求乙個tcp連線上最多只能有乙個未被確認的未完成的...
TCP之Nagle演算法 延遲ACK
1.nagle演算法 是為了減少廣域網的小分組數目,從而減小網路擁塞的出現 該演算法要求乙個tcp連線上最多只能有乙個未被確認的未完成的小分組,在該分組ack到達之前不能傳送其他的小分組,tcp需要收集這些少量的分組,並在ack到來時以乙個分組的方式傳送出去 其中小分組的定義是小於mss的任何分組 ...