Nagle算法

Nagle算法簡介

Nagle算法主要是避免發送小的數據包,要求TCP連接上最多只能有一個未被確認的小分組,在該分組的確認到達之前不能發送其他的小分組。

在默認的情況下,Nagle算法是默認開啟的,Nagle算法比較適用于發送方發送大批量的小數據,并且接收方作出及時回應的場合,這樣可以降低包的傳輸個數。

但是如果你的程序是 write-write-read 模式,在使用了Nagle算法后,第二個 write 就會被推后一個RRT發送而造成一個很長的ack等待,從而產生一個延遲。為了避免這種情況,一般建議在應用層做緩沖,將兩個write合在一起,成為 write-read

代碼分析

我們通過一個例子觀察下Nagle算法的延遲

  • 服務器端代碼:recipes/tpc/nodelay_server.cc
  • 客戶端代碼:recipes/tpc/nodelay.cc

客戶端代碼

// ...... 僅展示出部分代碼if (tcpnodelay){// 設置tcp TCP_NODELAYstream->setTcpNoDelay(true);printf("connected, set TCP_NODELAY\n");}else{stream->setTcpNoDelay(false);printf("connected\n");}for (int n = 0; n < num; ++n){printf("Request no. %d, sending %d bytes\n", n, len);if (buffering){std::vector<char> message(len + sizeof len, 'S');memcpy(message.data(), &len, sizeof len);int nw = stream->sendAll(message.data(), message.size());printf("%.6f sent %d bytes\n", now(), nw);}else{// 先發送頭 在發送數據 驗證Nagel算法stream->sendAll(&len, sizeof len);printf("%.6f sent header\n", now());usleep(1000); // prevent kernel merging TCP segmentsstd::string payload(len, 'S');int nw = stream->sendAll(payload.data(), payload.size());printf("%.6f sent %d bytes\n", now(), nw);}}

上面可以看出,正常下我們開啟Nagel,并發送header和data兩個數據包,我們還可以合并header和data,將其合成一個包發送,此外,我們還可以設置TCP_NODELAY選項。

測試

環境:兩臺橋聯的虛擬機
我們使用ping命令測試一下兩臺機器正常情況下的延遲

wang@localhost tpc]$ ping 192.168.1.104
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data.
64 bytes from 192.168.1.104: icmp_seq=1 ttl=64 time=4.30 ms
64 bytes from 192.168.1.104: icmp_seq=2 ttl=64 time=4.08 ms
64 bytes from 192.168.1.104: icmp_seq=3 ttl=64 time=4.26 ms
64 bytes from 192.168.1.104: icmp_seq=4 ttl=64 time=3.06 ms
64 bytes from 192.168.1.104: icmp_seq=5 ttl=64 time=3.77 ms
^C
--- 192.168.1.104 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4016ms
rtt min/avg/max/mdev = 3.064/3.900/4.307/0.459 ms

大概在4ms左右

開啟Nagle發送兩個數據包
[wang@localhost tpc]$ ./nodelay 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected
Request no. 0, sending 3210 bytes
1715777496.470708 sent header
1715777496.478341 sent 3210 bytes
Sent all 1 requests, receiving responses.
1715777496.483114 received 4 bytes, ack = 3210
total 0.013132 seconds

大概在13ms左右

關閉Nagle發送兩個數據包
[wang@localhost tpc]$ ./nodelay -D 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected, set TCP_NODELAY
Request no. 0, sending 3210 bytes
1715777794.851212 sent header
1715777794.855121 sent 3210 bytes
Sent all 1 requests, receiving responses.
1715777794.856854 received 4 bytes, ack = 3210
total 0.006093 seconds

可以看見,關閉Nagel后,延遲大約6ms左右

開啟Nagel合并發送一個數據包
[wang@localhost tpc]$ ./nodelay -b 192.168.1.104 3210
connecting to 192.168.1.104:3210
connected
Request no. 0, sending 3210 bytes
1715778177.438170 sent 3214 bytes
Sent all 1 requests, receiving responses.
1715778177.441433 received 4 bytes, ack = 3210
total 0.004178 seconds

因為只發送一個,延遲跟ping差不多,大概4ms左右

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12963.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sam Blackshear談Move語言的起源

Move編程語言作為Sui生態系統的關鍵組成部分&#xff0c;通過可編程交易區塊等機制支持其獨特的對象數據模型&#xff0c;并支持高效的代碼。五年前&#xff0c;Mysten Labs的聯合創始人兼首席技術官Sam Blackshear創建了Move。他專門設計了Move&#xff0c;用于編寫智能合約&a…

數據庫SQL查詢語句匯總詳解

SQL是一種強大的編程語句&#xff0c;可用于操作和提取數據庫中的數據。如果你對編程語句有所讓步&#xff0c;那么你可能對SQL的力量感到難以置信。本文將帶你深入探索SQL查詢的世界&#xff0c;讓你了解SQL語句的各種查詢方式&#xff0c;并以實例進行詳解。 1. SELECT基礎查…

Iterator底層源碼分析

/** * Iterator用于遍歷Collection下的集合&#xff0c;Collection下的每個集合底層實現不一樣&#xff0c;意味著遍歷邏輯也不一樣&#xff0c; * 所以Java的設計者將Iterator設計成了接口&#xff0c;讓Collection下的每個集合實現Iterator */ public interface Iterator<…

英偉達的GPU(1)

又好久沒更新了,一方面是最近事情有點多,另一方面最近也確實有點懶。 之前我說要把硬件部分補完,要寫Nvidia的GPU,我估計一篇寫不完,所以先寫點。 早先的硬件文章可以參考: 上一篇:解讀神秘的華為昇騰910 (qq.com) 上上一篇Microsoft Maia (qq.com) 上上上篇Google的…

sqli-labs靶場第十四關

目錄 1&#xff1a;分析 找閉合符&#xff1a; 2&#xff1a;開始注入 報錯注入&#xff1a; 注入數據庫名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具體值&#xff1a; 1&#xff1a;分析 經過我們的實驗發現當我們輸入的密碼后面存在雙引號時會報…

【C++】學習筆記——多態_1

文章目錄 十二、繼承8. 繼承和組合 十三、多態1. 多態的概念2. 多態的定義和實現虛函數重寫的兩個特殊情況override 和 ?nal 3. 多態的原理1. 虛函數表 未完待續 十二、繼承 8. 繼承和組合 我們已經知道了什么是繼承&#xff0c;那組合又是什么&#xff1f;下面這種情況就是…

英語學習筆記13——A new dress

A new dress 一件新連衣裙 詞匯 Vocabulary colour / color n. 顏色 v. 上色&#xff0c;涂色  英  美 顏色短語&#xff1a;green hand 新手      black tea 紅茶      white house 白宮      black sheep 害群之馬 英文顏色類詞匯&#xff1a; red 紅色…

鴻蒙開發接口Ability框架:【ApplicationContext】

ApplicationContext ApplicationContext模塊提供開發者應用級別的的上下文的能力&#xff0c;包括提供注冊及取消注冊應用內組件生命周期的監聽接口。 說明&#xff1a; 開發前請熟悉鴻蒙開發指導文檔&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.m…

靜態IP代理:網絡世界的隱秘通道

在數字化時代&#xff0c;網絡安全和隱私保護日益受到重視。靜態IP代理作為一種網絡服務&#xff0c;為用戶提供了一個穩定且可預測的網絡連接方式&#xff0c;同時保護了用戶的在線身份。本文將從五個方面深入探討靜態IP代理的概念、優勢、應用場景、技術實現以及選擇時的考量…

C語言學習【printf函數和scanf函數】

C語言學習【printf函數和scanf函數】 printf()函數和scanf()函數可以讓用戶與程序交流&#xff0c;是輸入/輸出函數 printf()函數 請求printf()函數打印數據的指令要與待打印數據的類型相匹配。例如&#xff0c;打印整數時使用%d&#xff0c;打印字符時使用%c。這些符號被稱…

實戰項目技術點(1)

1、什么是REST&#xff1f; REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表述性狀態轉換&#xff0c;它是一種軟件架構風格。傳統URL風格如下&#xff1a; http://localhost:8080/user/getById?id1 GET&#xff1a;查詢id為1的用戶 http://loc…

網絡常識一:常用工具

作為后端開發&#xff0c;特別是網絡游戲后端開發&#xff0c;經常需要處理各種現網問題&#xff0c;其中有不少是網絡相關的。 下面列舉的工具主要是在 linux 下的&#xff0c;診斷線上服務器問題的時候&#xff0c;往往是分秒必爭&#xff0c;所以這些工具都要用得很熟練&am…

程序在銀河麒麟系統下實現開機自啟及創建桌面快捷方式

目錄 1. 機器環境說明 2. 程序開機自啟動設置 2.桌面快捷方式設置 3. 附加說明 1. 機器環境說明 機器安裝的銀河麒麟操作系統屬性如下&#xff1a; 2. 程序開機自啟動設置 第1步&#xff1a;編寫一個腳本,用于自動化啟動&#xff0c;為便于后文描述&#xff0c;該腳本名稱…

干貨教程【軟件篇】| 免費實現游戲加速自由

需要這個游戲加速軟件的小伙伴可以關注一下文章底部公眾號&#xff0c;回復關鍵詞【zdjs】即可獲取。 該軟件可以實現免費的游戲加速&#xff0c;實測延遲低體驗好&#xff01; 建議看到后趕緊保存下來防止丟失&#xff01; 下面講一下該軟件安裝流程~ 通過鏈接可以得到下面…

2.go語言初始(二)

本篇博客涉及到go 的基礎數據類型、 go 語言中的運算符、轉義字符、格式化輸出、字符串操作 go 語言中的運算符 在 go 語言中&#xff0c;基本數據類型主要包括以下幾類&#xff1a;整數類型、浮點數類型、復數類型、布爾類型、字符串類型、字節類型&#xff08;byte&#xf…

Linux進程控制——Linux進程程序替換

前言&#xff1a;Linux進程控制包含了進程終止&#xff0c;進程等待&#xff0c;進程程序替換。走到現在我們也只剩下進程程序替換沒介紹了&#xff0c;那么讓我們來看看進程程序替換到底是什么&#xff01; 本篇主要內容&#xff1a; 替換原理 替換函數 實現簡易shell 我們所創…

【sql】sql中with as 介紹與使用jsqlparser解析sql

文章目錄 一. 定義二. 用法三. 解析 一. 定義 with A as (select * from class) 也就是將重復用到的大批量 的SQL語句&#xff0c;放到with as 中&#xff0c;加一個別名&#xff0c;在后面用到的時候就可以直接用。對于大批量的SQL數據&#xff0c;起到優化的作用。 with子句…

Broad Learning System (BLS) 寬度學習系統

寬度學習&#xff08;Broad Learning System, BLS&#xff09;是一種有效的神經網絡學習框架&#xff0c;旨在通過擴展網絡的寬度而不是深度來提高學習能力和效率。與傳統的深度學習相比&#xff0c;寬度學習通過堆疊多層特征節點和增強節點來構建網絡&#xff0c;從而避免了深…

oracle 臨時表

oracle 臨時表 conn scott/tiger --會話內保留行 drop table tmp1; CREATE GLOBAL TEMPORARY TABLE tmp1 ON COMMIT PRESERVE ROWS AS SELECT * FROM emp;SELECT TABLESPACE_NAME,CURRENT_USERS FROM V$SORT_SEGMENT;SELECT * FROM TMP1; INSERT INTO TMP1 SELECT * FROM…

Maven依賴管理項目構建

Maven依賴管理項目構建工具 目錄 文章目錄 Maven依賴管理項目構建工具目錄一、Maven簡介1、為什么學習Maven1.1、Maven是一個依賴管理工具1.2、Maven是一個構建工具1.3、結論 2. Maven介紹3. Maven軟件工作原理模型圖&#xff08;了解&#xff09; 二、Maven安裝和配置1. Mave…