TCP的Nagle演算法介紹

2021-08-08 01:24:32 字數 1495 閱讀 5695

來自百科:

nagle演算法是以他的發明人john nagle的名字命名的,它用於自動連線許多的小緩衝器訊息;這一過程(稱為nagling)通過減少必須傳送包的個數來增加網路軟體系統的效率。

是一種擁塞控制方法。

發明緣由:

從鍵盤輸入的乙個字元,占用乙個位元組,可能在傳輸上造成41位元組的包,其中包括1位元組的有用資訊和40位元組的首部資料。這種情況轉變成了4000%的消耗,這樣的情況對於輕負載的網路來說還是可以接受的,但是重負載的福特網路就受不了了,它沒有必要在經過節點和閘道器的時候重發,導致包丟失和妨礙傳輸速度。吞吐量可能會妨礙甚至在一定程度上會導致連線失敗。

演算法原理:

nagle的演算法通常會在tcp程式裡新增兩行**,在未確認資料傳送的時候讓傳送器把資料送到

快取裡。任何資料隨後繼續直到得到明顯的資料確認或者直到攢到了一定數量的資料了再發包。

發展和使用:

這種方法在包括網際網路在內的整個網路裡得到了推廣,成為了預設的執行方式,儘管在高互動環境下有些時候是不必要的,例如在客戶/伺服器情形下。在這種情況下,nagling可以通過使用tcp_nodelay 

套接字選項關閉。

演算法規則:

nagle演算法的規則:

(1)如果包長度達到mss,則允許傳送;

(2)如果該包含有fin,則允許傳送;

(3)設定了tcp_nodelay選項,則允許傳送;

(4)未設定tcp_cork選項時,若所有發出去的小資料報(包長度小於mss)均被確認,則允許傳送;

(5)上述條件都未滿足,但發生了超時(一般為200ms),則立即傳送。

nagle演算法與

cork演算法區別:

nagle演算法和cork演算法非常類似,但是它們的著眼點不一樣,nagle演算法主要避免網路因為太多的小包(協議頭的比例非常之大)而擁塞,而cork演算法則是為了提高網路的利用率,使得總體上協議頭占用的比例盡可能的小。如此看來這二者在避免傳送小包上是一致的,在使用者控制的層面上,nagle演算法完全不受使用者socket的控制,你只能簡單的設定tcp_nodelay而禁用它,cork演算法同樣也是通過設定或者清除tcp_cork使能或者禁用之,然而nagle演算法關心的是網路擁塞問題,只要所有的ack回來則發包,而cork演算法卻可以關心內容,在前後資料報傳送間隔很短的前提下(很重要,否則核心會幫你將分散的包發出),即使你是分散傳送多個小資料報,你也可以通過使能cork演算法將這些內容拼接在乙個包內,如果此時用nagle演算法的話,則可能做不到這一點。

其他:

tcp/ip協議中,無論傳送多少資料,總是要在資料前面加上協議頭,同時,對方接收到資料,也需要傳送ack表示確認。為了盡可能的利用網路頻寬,tcp總是希望盡可能的傳送足夠大的資料。(乙個連線會設定mss引數,因此,tcp/ip希望每次都能夠以mss尺寸的資料塊來傳送資料)。nagle演算法就是為了盡可能傳送大塊資料,避免網路中充斥著許多小資料塊。

TCP之Nagle演算法 延遲ACK

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

TCP滑動視窗協議與nagle演算法

tcp協議是乙個全雙工的協議,當a與b建立好連線後,可以互相傳送資料,當a作為傳送方時,存在乙個傳送緩衝區,也就是說傳送的資料會先放置在傳送緩衝區處,而作為接收方的b會有乙個接收緩衝區,接收到的資訊會先儲存在接收緩衝處。傳送視窗,則是傳送緩衝區的一部分。傳送資料時通常是按位元組傳送,下面來看一張圖 ...

TCP粘包, UDP丟包, nagle演算法

一 tcp粘包 1.什麼時候考慮粘包 如果利用tcp每次傳送資料,就與對方建立連線,然後雙方傳送完一段資料後,就關閉連線,這樣就不會出現粘包問題 因為只有一種包結構,類似於http協議,udp不會出現粘包現象 關閉連線主要要雙方都傳送close連線 參考tcp關閉協議 如 a需要傳送一段字串給b,那...