在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

請問TCP擁塞控制對數據延遲有何影響?

馬哥Linux運維 ? 來源:博客園 ? 2024-01-19 09:44 ? 次閱讀

今天分享一篇文章,是關于 TCP 擁塞控制對數據延遲產生的影響的。作者在服務延遲變高之后進行抓包分析,結果發現時間花在了 TCP 本身的機制上面:客戶端并不是將請求一股腦發送給服務端,而是只發送了一部分,等到接收到服務端的 ACK,然后繼續再發送,這就造成了額外的 RTT,這個額外的 RTT 是由 TCP 的擁塞控制導致的

這是上周在項目上遇到的一個問題,在內網把問題用英文分析了一遍,覺得挺有用的,所以在博客上打算再寫一次。

問題是這樣的:我們在當前的環境中,網絡延遲 <1ms,服務的延遲是 2ms,現在要遷移到一個新的環境,新的環境網絡自身延遲(來回的延遲,RTT,本文中談到延遲都指的是 RTT 延遲)是 100ms,那么請問,服務的延遲應該是多少?

我們的預期是 102ms 左右,但是現實中,發現實際的延遲漲了不止 100ms,P99 到了 300ms 左右。

從日志中,發現有請求的延遲的確很高,但是模式就是 200ms, 300ms 甚至 400ms 左右,看起來是多花了幾個 RTT。

接下來就根據日志去抓包,最后發現,時間花在了 TCP 本身的機制上面,這些高延遲的請求都發生在 TCP 創建連接之后。

首先是 TCP 創建連接的時間,TCP 創建連接需要三次握手,需要額外增加一個 RTT。為什么不是兩個 RTT?因為過程是這樣的:

+0       A -> B SYN 
+0.5RTT  B -> A SYN+ACK 
+1RTT    A -> B ACK 
+1RTT    A -> B Data

即第三個包,在 A 發給 B 之后,A 就繼續發送下面的數據了,所以可以認為這第三個包不會占用額外的時間。

這樣的話,延遲會額外增加一個 RTT,加上本身數據傳輸的一個 RTT,那么,我們能觀察到的最高的 RTT 應該是 2 個 RTT,即 200ms,那么為什么會看到 400ms 的請求呢?

從抓包分析看,我發現在建立 TCP 連接之后,客戶端并不是將請求一股腦發送給服務端,而是只發送了一部分,等到接收到服務端的 ACK,然后繼續在發送,這就造成了額外的 RTT。看到這里我恍然大悟,原來是 cwnd 造成的。

cwnd 如何分析,之前的博文中也提到過。簡單來說,這是 TCP 層面的一個機制,為了避免網絡賽車,在建立 TCP 連接之后,發送端并不知道這個網絡到底能承受多大的流量,所以發送端會發送一部分數據,如果 OK,滿滿加大發送數據的量。這就是 TCP 的慢啟動。

那么慢啟動從多少開始呢?

Linux 中默認是 10.

/usr/src/linux/include/net/tcp.h:
/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
#define TCP_INIT_CWND          10

也就是說,在小于 cwnd=10 * MSS=1448bytes = 14480bytes 數據的情況下,我們可以用 2 RTT 發送完畢數據。即 1 個 RTT 用于建立 TCP 連接,1個 RTT 用于發送數據。

下面這個抓包可以證明這一點,我在 100ms 的環境中,從一端發送了正好 14480 的數據,恰好是用了 200ms:

3e9e68f6-b5fa-11ee-8b88-92fbcf53809c.png

100ms 用于建立連接,100ms 用于發送數據

如果發送的數據小于 14480 bytes(大約是 14K),那么用的時間應該是一樣的。

但是,如果多了即使 1 byte,延遲也會增加一個 RTT,即需要 300ms。下面是發送 14481 bytes 的抓包情況:

3ebb4d72-b5fa-11ee-8b88-92fbcf53809c.png

多出來一個 100ms 用于傳輸這個額外的 byte

慢啟動,顧名思義,只發生在啟動階段,如果第一波發出去的數據都能收到確認,那么證明網絡的容量足夠,可以一次性發送更多的數據,這時 cwnd 就會繼續增大了(取決于具體擁塞控制的算法)。

這就是額外的延遲的來源了。回到我們的案例,這個用戶的請求大約是 30K,響應也大約是 30K,而 cwnd 是雙向的,即兩端分別進行慢啟動,所以,請求發送過來 +1 RTT,響應 +1 RTT,TCP 建立連接 +1 RTT,加上本身數據傳輸就有 1 RTT,總共 4RTT,就解釋的通了。

解決辦法也很簡單,兩個問題都可以使用 TCP 長連接來解決。

PS:其實,到這里讀者應該發現,這個服務本身的延遲,在這種情況下,也是 4個 RTT,只不過網絡環境 A 的延遲很小,在 1ms 左右,這樣服務自己處理請求的延遲要遠大于網絡的延遲,1 個 RTT 和 4 個 RTT 從監控上幾乎看不出區別。

PPS:其實,以上內容,比如 “慢啟動,顧名思義,只發生在啟動階段“,以及 ”兩個問題都可以使用 TCP 長連接來解決“ 的表述是不準確的,詳見我們后面又遇到的一個問題:TCP 長連接 CWND reset 的問題分析。

Initial CWND 如果修改的話也有辦法。

這里的 thread 的討論,有人提出了一種方法:大意是允許讓應用程序通過socket參數來設置 CWND 的初始值:

setsockopt(fd, IPPROTO_TCP, TCP_CWND, &val, sizeof (val))

——然后就被罵了個狗血淋頭。

Stephen Hemminger 說 IETF TCP 的家伙已經覺得 Linux 里面的很多東西會允許不安全的應用了。這么做只會證明他們的想法。這個 patch 需要做很多 researech 才考慮。

如果 misuse,比如,應用將這個值設置的很大,那么假設一種情況:網絡發生擁堵了,這時候應用不知道網絡的情況,如果建立連接的話,還是使用一個很大的initcwnd來啟動,會加劇擁堵,情況會原來越壞,永遠不會自動恢復。

David Miller 的觀點是,應用不可能知道鏈路 (Route) 上的特點:

initcwnd是一個路由鏈路上的特點,不是 by application 決定的;

只有人才可能清楚整個鏈路的質量,所以這個選項只能由人 by route 設置。

所以現在只能 by route 設置。

我實驗了一下,將 cwnd 設置為 40:

3ee1c344-b5fa-11ee-8b88-92fbcf53809c.png

通過 ip route 命令修改

然后在實驗,可以看到這時候,client 發送的時候,可以一次發送更多的數據了。

3f0d0680-b5fa-11ee-8b88-92fbcf53809c.jpg

后記

現在看這個原因,如果懂一點 TCP,很快就明白其中的原理,很簡單。

但是現實情況是,監控上只能看到 latency 升高了,但是看不出具體是哪一些請求造成的,只知道這個信息的話,那可能的原因就很多了。到這里,發現問題之后,一般就進入了扯皮的階段:中間件的用戶拿著監控(而不是具體的請求日志)去找平臺,平臺感覺是網絡問題,將問題丟給網絡團隊,網絡團隊去檢查他們自己的監控,說他們那邊顯示網絡沒有問題(網絡層的延遲當然沒有問題)。

如果要查到具體原因的話,需要:

先從日志中查找到具體的高延遲的請求。監控是用來發現問題的,而不是用來 debug 的;

從日志分析時間到底花在了哪一個階段;

通過抓包,或者其他手段,驗證步驟2 (這個過程略微復雜,因為要從眾多連接和數據包中找到具體一個 TCP 的數據流)

我發現在大公司里面,這個問題往往牽扯了多個團隊,大家在沒有確認問題就出現在某一個團隊負責的范圍內的時候,就沒有人去這么查。

我在排查的時候,還得到一些錯誤信息,比如開發者告訴我 TCP 連接的保持時間是 10min,然后我從日志看,1min 內連續的請求依然會有高延遲的請求,所以就覺得是 TCP 建立連接 overhead 之外的問題。最后抓包才發現明顯的 SYN 階段包,去和開發核對邏輯,才發現所謂的 10min 保持連接,只是在 Server 側一段做的,Client 側不關心這個時間會將 TCP 直接關掉。

幸好抓到的包不會騙人。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209498
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79074
  • RTT
    RTT
    +關注

    關注

    0

    文章

    65

    瀏覽量

    17130

原文標題:TCP 擁塞控制對數據延遲的影響

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    TCP協議擁塞控制的滑動窗口協議解析

    TCP協議作為一個可靠的面向流的傳輸協議,其可靠性和流量控制由滑動窗口協議保證,而擁塞控制則由控制窗口結合一系列的
    的頭像 發表于 10-08 17:04 ?2931次閱讀
    <b class='flag-5'>TCP</b>協議<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b>的滑動窗口協議解析

    TCP BBR擁塞控制算法深度解析

    我一向覺得TCP擁塞控制算法太過復雜,而復雜的東西基本上就是用來裝逼的垃圾,直到遇到了bbr。
    發表于 11-06 09:26 ?2757次閱讀
    <b class='flag-5'>TCP</b> BBR<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b>算法深度解析

    TCP協議技術之擁塞控制算法

    擁塞控制是在網絡層和傳輸層進行的功能。在網絡層,擁塞控制可以通過路由算法來控制數據包在網絡中的傳
    的頭像 發表于 02-03 17:06 ?2224次閱讀
    <b class='flag-5'>TCP</b>協議技術之<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b>算法

    無刷電機的極對數與轉速關系?

    無刷電機的極對數與轉速關系?無刷電機的極對數與扭矩關系?
    發表于 07-20 06:36

    MANET網絡TCP擁塞控制識別序列與恢復

    針對MANET 擁塞控制假象與真正的擁塞所需要的區分問題,提出非擁塞控制的3 種類型以及4 類引起包錯誤的類型。采用普適算法與識別序列,給出
    發表于 03-29 10:49 ?18次下載

    Linux中傳輸控制協議的擁塞控制分析

    TCP(transport control protocol)的性能在很大程度上取決于其所使用的擁塞控制算法。傳統的TCP在實現多種擁塞
    發表于 06-17 07:43 ?21次下載

    高速網絡中TCP擁塞控制算法的研究

    針對TCP 在高速網絡中的缺陷,提出了改進的BIC TCP 擁塞控制算法。優化算法通過監控鏈路緩存的變化,調整探索可用帶寬過程中的擁塞窗口增
    發表于 09-17 10:18 ?15次下載

    TCP端到端等效噪聲模型及擁塞控制方法研究

    TCP端到端等效噪聲模型及擁塞控制方法研究:針對傳統TCP擁塞控制協議在有線/無線混合網絡中存在
    發表于 10-20 17:49 ?7次下載

    TCP擁塞控制算法的組合策略研究

    隨著互聯網規模的增長,擁塞已經成為一個重要的研究熱點。介紹了TCP 擁塞控制的四種基本算法。TCP 擁塞
    發表于 12-25 15:14 ?20次下載

    TCP擁塞控制算法的改進

    效率對TCP/IP協議棧的效率和實時性重要影響,進而影響著整個系統的性能。嵌入式網絡協議棧是為了支持外部Ethernet設備的聯網而出現的。傳統的TCP/IP協議在保證數據傳輸的可靠
    發表于 02-08 16:29 ?0次下載

    基于數據投遞概率的擁塞控制機制

    針對DTN網絡數據編碼分發過程中數據擁塞造成投遞性能下降的問題,提出了一種基于主題數據投遞概率的節點擁塞
    發表于 02-27 14:55 ?0次下載

    詳談數據通信的擁塞現象和擁塞控制

    數據通信在現代生活中不可或缺,對于數據通信,計算機專業的學生多多少少有所了解。在往期文章中,小編也曾對數據通信有所介紹。為增進大家對數據通信的認識,本文將
    發表于 07-23 10:47 ?1839次閱讀
    詳談<b class='flag-5'>數據</b>通信的<b class='flag-5'>擁塞</b>現象和<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b>

    防止網絡擁塞現象的TCP擁塞控制算法

    為了防止網絡的擁塞現象,TCP提出了一系列的擁塞控制機制。最初由V.Jacobson在1988年的論文中提出的TCP
    的頭像 發表于 10-29 14:54 ?2486次閱讀

    如何用eBPF寫TCP擁塞控制算法?

    是兩個痛點: 內核越來越策略化。 內核接口不穩定。 分別簡單說一下。 所謂內核策略化就是說越來越多的?靈巧的算法?,?小tricks?等靈活多變的代碼進入內核,舉例來講,包括但不限于以下這些: TCP擁塞控制算法。 TC排隊規則
    的頭像 發表于 12-26 09:44 ?1671次閱讀

    TCP協議中的擁塞控制機制與網絡穩定性

    TCP協議中的擁塞控制機制與網絡穩定性的深度探討 隨著互聯網的快速發展,網絡流量呈現爆炸式增長,網絡擁塞問題逐漸凸顯。為了維護網絡的穩定運行,TCP
    的頭像 發表于 04-19 16:42 ?430次閱讀
    主站蜘蛛池模板: 色综合综合色| 午夜在线视频网站| 一区二区网站| 日韩成人在线影院| 一区免费视频| 日本黄色影片在线观看| 97午夜| 2020年亚洲天天爽天天噜| 中日韩在线视频| 四虎在线观看一区二区| 国产农村妇女毛片精品久久| 精品乱人伦一区二区三区| 扒开末成年粉嫩的小缝强文| 色综合视频在线| 国模大尺度人体一区| 九九草在线观看| 亚洲视频在线一区二区三区| 亚洲欧洲日韩综合| 萌白酱一线天粉嫩喷水在线观看| 成年男人永久免费看片| 欧美系列在线| 在线播放一区二区三区| 欧美视频区| 免费一级毛片不卡在线播放| 狠狠乱| 国产美女免费观看| chinesevideo普通话对白| 天天拍天天射| 寡妇一级a毛片免费播放| 免费国产综合视频在线看| 在线黄色免费观看| 成人丁香婷婷| 超级乱淫小黄文小说| 在线人成精品免费视频| 国产在线一卡| 欧美在线性| 欧美军同video69视频| 国内精品久久久久久久久野战 | 爽好舒服快小柔小说| 色综合激情网| 色天天天天综合男人的天堂|