TCP連線中啟用和禁用TCP NODELAY有什麼影響?

時間 2021-05-11 23:55:21

1樓:feve

簡單說平時我們socket.send(b"a")這個a就是payload有效負載他佔1位元組。

但網路傳輸比如你tcp他肯定加上至少20位元組的ip頭和至少20位元組的tcp頭。你只發個a實際發了41位元組。

這樣太浪費頻寬了。所以他預設開個n演算法,讓你send(a)先把a寫入傳送快取(記憶體),等你多send點東西到快取內有一定大小比如節,再給你加上ip頭tcp頭髮送出去。

簡單結論就是開啟delay就是你payload有一定大小才發出去,關掉delay就是你只發個a只有1位元組也給你加上ip頭tcp頭直接發出去。

2樓:小林coding

TCP_NODELAY 這個引數啟用就是使用 Nagle 演算法,禁用就是不實用 Nagle 演算法,所以先要明白Nagle 演算法作用。

Nagle 演算法做了一些策略來避免過多的小資料報文傳送,這可提高傳輸效率。

Nagle 演算法的策略:

沒有已傳送未確認報文時,立刻傳送資料。

存在未確認報文時,直到「沒有已傳送未確認報文」或「資料長度達到 MSS 大小」時,再傳送資料。

只要沒滿足上面條件中的一條,傳送方一直在囤積資料,直到滿足上面的傳送條件。

上圖右側啟用了 Nagle 演算法,它的傳送資料的過程:

一開始由於沒有已傳送未確認的報文,所以就立刻發了 H 字元;

接著,在還沒收到對 H 字元的確認報文時,傳送方就一直在囤積資料,直到收到了確認報文後,此時沒有已傳送未確認的報文,於是就把囤積後的 ELL 字元一起發給了接收方;

待收到對 ELL 字元的確認報文後,於是把最後乙個 O 字元傳送了出去

可以看出,Nagle 演算法一定會有乙個小報文,也就是在最開始的時候。

Nagle 演算法預設是開啟的,如果對於一些需要小資料報互動的場景的程式,比如 telnet 或 ssh 這樣的互動性比較強的程式,則需要關閉 Nagle 演算法。

可以在 Socket 設定 TCP_NODELAY 選項來關閉這個演算法(關閉 Nagle 演算法沒有全域性引數,需要根據每個應用自己的特點來關閉)。

3樓:「已登出」

網路環境不好,比如公網,開啟nodelay會讓客戶端覺得更流暢,內網環境server間呼叫,網路不是問題的情況下,強調效能,關閉nodelay好一些,畢竟減少了發包的數量

4樓:doubi

首先你要知道什麼是nagle演算法。

nagle演算法:如果有未確認的小包,那麼下乙個包會快取下來(在快取過程中這個包的大小會累積變大),快取的包被傳送直到上乙個包得到確認或者快取的包的大小達到最大值。可見nagle是阻止網路中產生太多小包,它只允許網路中存在乙個小包

nagle演算法預設是啟用的。

禁用nagle有兩種方式:

1--tcp_nodelay

啟用tcp_nodelay的作用,就是上乙個小包沒有確認,當前包也不用快取而是直接傳送。

2--tcp_cork

啟用tcp_cork,那麼網路中乙個小包也沒有。傳送的都是最大包。所有包傳送的時候,都會被累積,直到包的大小達到最大才會被傳送。

TCP短連線和長連線的區別

公尺夏 畢業酒喝多了,班長站在桌上高喊 20年後,我們要做到秒薪一塊錢!某同學2015年成立某單車,占股14.63 目前估值300億,個人身價43億。已完成任務。用時13年。 Tball 剛畢業的時候,其實不是很懂自己要做什麼,想考乙個教師編制,第一年沒考上,後來也在為這個做準備,心裡卻明白自己還是...

tcp中兩台裝置在同時建立連線時,為什麼需兩次傳送自己的SYN?

靈劍 這個應該不是重傳,而是一種特殊的狀態時序,一般建立連線時分主動被動兩種情況,這是第三種,即允許兩個埠同時發起連線,兩邊都是主動。從時間序列上說,兩邊發出SYN前都沒有收到對方的SYN,這種情況下兩邊都做三次握手,進入連線完成序列。實際情況下應該不太可能出現這種情況,因為一般會選擇自動分配的源埠...

在以TCP為連線方式的伺服器中,為什麼在服務端設計當中需要考慮心跳?

唐正超 1,tcp鏈結非正常斷斷開,tcp協議本身並不能立刻感知,最常見的就是你網線掉了,過會你自己重新插上,哎,還能用!2,tcp本身就有keepalive的機制,但是tcp本身的keepalive是在核心檢測的,這就有一些問題,例如你的電腦cpu占用滿了,程式卡死,但是tcp的keepalive...