国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

TCP 三次握手原理,你真的理解嗎?

開發 開發工具 數據中心
希望通過本文能夠幫大家理解TCP連接過程中的半連接隊列和全連接隊列的概念、原理和作用,更關鍵的是有哪些指標可以明確看到這些問題(工程效率幫助強化對理論的理解)。

[[235390]]

問題描述

場景:JAVA的client和server,使用socket通信。server使用NIO。

1.間歇性得出現client向server建立連接三次握手已經完成,但server的selector沒有響應到這連接。

2.出問題的時間點,會同時有很多連接出現這個問題。

3.selector沒有銷毀重建,一直用的都是一個。

4.程序剛啟動的時候必會出現一些,之后會間歇性出現。

分析問題

正常TCP建連接三次握手過程:

  • 第一步:client 發送 syn 到server 發起握手;
  • 第二步:server 收到 syn后回復syn+ack給client;
  • 第三步:client 收到syn+ack后,回復server一個ack表示收到了server的syn+ack(此時client的56911端口的連接已經是established)。

從問題的描述來看,有點像TCP建連接的時候全連接隊列(accept隊列,后面具體講)滿了,尤其是癥狀2、4. 為了證明是這個原因,馬上通過 netstat -s | egrep "listen" 去看隊列的溢出統計數據:    

反復看了幾次之后發現這個overflowed 一直在增加,那么可以明確的是server上全連接隊列一定溢出了。

接著查看溢出后,OS怎么處理:

tcp_abort_on_overflow 為0表示如果三次握手第三步的時候全連接隊列滿了那么server扔掉client 發過來的ack(在server端認為連接還沒建立起來)

為了證明客戶端應用代碼的異常跟全連接隊列滿有關系,我先把tcp_abort_on_overflow修改成 1,1表示第三步的時候如果全連接隊列滿了,server發送一個reset包給client,表示廢掉這個握手過程和這個連接(本來在server端這個連接就還沒建立起來)。

接著測試,這時在客戶端異常中可以看到很多connection reset by peer的錯誤,到此證明客戶端錯誤是這個原因導致的(邏輯嚴謹、快速證明問題的關鍵點所在)。

于是開發同學翻看java 源代碼發現socket 默認的backlog(這個值控制全連接隊列的大小,后面再詳述)是50,于是改大重新跑,經過12個小時以上的壓測,這個錯誤一次都沒出現了,同時觀察到 overflowed 也不再增加了。

到此問題解決,簡單來說TCP三次握手后有個accept隊列,進到這個隊列才能從Listen變成accept,默認backlog 值是50,很容易就滿了。滿了之后握手第三步的時候server就忽略了client發過來的ack包(隔一段時間server重發握手第二步的syn+ack包給client),如果這個連接一直排不上隊就異常了。

但是不能只是滿足問題的解決,而是要去復盤解決過程,中間涉及到了哪些知識點是我所缺失或者理解不到位的;這個問題除了上面的異常信息表現出來之外,還有沒有更明確地指征來查看和確認這個問題。

深入理解TCP握手過程中建連接的流程和隊列

(圖片來源:http://www.cnxct.com/something-about-phpfpm-s-backlog/)

如上圖所示,這里有兩個隊列:syns queue(半連接隊列);accept queue(全連接隊列)。

三次握手中,在第一步server收到client的syn后,把這個連接信息放到半連接隊列中,同時回復syn+ack給client(第二步);

第三步的時候server收到client的ack,如果這時全連接隊列沒滿,那么從半連接隊列拿出這個連接的信息放入到全連接隊列中,否則按tcp_abort_on_overflow指示的執行。

這時如果全連接隊列滿了并且tcp_abort_on_overflow是0的話,server過一段時間再次發送syn+ack給client(也就是重新走握手的第二步),如果client超時等待比較短,client就很容易異常了。

在我們的os中retry 第二步的默認次數是2(centos默認是5次):

如果TCP連接隊列溢出,有哪些指標可以看呢?

上述解決過程有點繞,聽起來懵,那么下次再出現類似問題有什么更快更明確的手段來確認這個問題呢?(通過具體的、感性的東西來強化我們對知識點的理解和吸收。)

netstat -s

比如上面看到的 667399 times ,表示全連接隊列溢出的次數,隔幾秒鐘執行下,如果這個數字一直在增加的話肯定全連接隊列偶爾滿了。

ss 命令

上面看到的第二列Send-Q 值是50,表示第三列的listen端口上的全連接隊列最大為50,第一列Recv-Q為全連接隊列當前使用了多少。

全連接隊列的大小取決于:min(backlog, somaxconn) . backlog是在socket創建的時候傳入的,somaxconn是一個os級別的系統參數。

這個時候可以跟我們的代碼建立聯系了,比如Java創建ServerSocket的時候會讓你傳入backlog的值:

(來自JDK幫助文檔:https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html)

半連接隊列的大小取決于:max(64,  /proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的os會有些差異。

我們寫代碼的時候從來沒有想過這個backlog或者說大多時候就沒給他值(那么默認就是50),直接忽視了他,首先這是一個知識點的盲點;其次也許哪天你在哪篇文章中看到了這個參數,當時有點印象,但是過一陣子就忘了,這是知識之間沒有建立連接,不是體系化的。但是如果你跟我一樣首先經歷了這個問題的痛苦,然后在壓力和痛苦的驅動自己去找為什么,同時能夠把為什么從代碼層推理理解到OS層,那么這個知識點你才算是比較好地掌握了,也會成為你的知識體系在TCP或者性能方面成長自我生長的一個有力抓手。

netstat 命令

netstat跟ss命令一樣也能看到Send-Q、Recv-Q這些狀態信息,不過如果這個連接不是Listen狀態的話,Recv-Q就是指收到的數據還在緩存中,還沒被進程讀取,這個值就是還沒被進程讀取的 bytes;而 Send 則是發送隊列中沒有被遠程主機確認的 bytes 數。

netstat -tn 看到的 Recv-Q 跟全連接半連接沒有關系,這里特意拿出來說一下是因為容易跟 ss -lnt 的 Recv-Q 搞混淆,順便建立知識體系,鞏固相關知識點 。  

比如如下netstat -t 看到的Recv-Q有大量數據堆積,那么一般是CPU處理不過來導致的:

上面是通過一些具體的工具、指標來認識全連接隊列(工程效率的手段)。  

實踐驗證一下上面的理解

把java中backlog改成10(越小越容易溢出),繼續跑壓力,這個時候client又開始報異常了,然后在server上通過 ss 命令觀察到:

按照前面的理解,這個時候我們能看到3306這個端口上的服務全連接隊列最大是10,但是現在有11個在隊列中和等待進隊列的,肯定有一個連接進不去隊列要overflow掉,同時也確實能看到overflow的值在不斷地增大。

Tomcat和Nginx中的Accept隊列參數

Tomcat默認短連接,backlog(Tomcat里面的術語是Accept count)Ali-tomcat默認是200, Apache Tomcat默認100。

Nginx默認是511

因為Nginx是多進程模式,所以看到了多個8085,也就是多個進程都監聽同一個端口以盡量避免上下文切換來提升性能   

總結

全連接隊列、半連接隊列溢出這種問題很容易被忽視,但是又很關鍵,特別是對于一些短連接應用(比如Nginx、PHP,當然他們也是支持長連接的)更容易爆發。 一旦溢出,從cpu、線程狀態看起來都比較正常,但是壓力上不去,在client看來rt也比較高(rt=網絡+排隊+真正服務時間),但是從server日志記錄的真正服務時間來看rt又很短。

jdk、netty等一些框架默認backlog比較小,可能有些情況下導致性能上不去。

希望通過本文能夠幫大家理解TCP連接過程中的半連接隊列和全連接隊列的概念、原理和作用,更關鍵的是有哪些指標可以明確看到這些問題(工程效率幫助強化對理論的理解)。

另外每個具體問題都是最好學習的機會,光看書理解肯定是不夠深刻的,請珍惜每個具體問題,碰到后能夠把來龍去脈弄清楚,每個問題都是你對具體知識點通關的好機會。

最后提出相關問題給大家思考

全連接隊列滿了會影響半連接隊列嗎?

netstat -s看到的overflowed和ignored的數值有什么聯系嗎?

如果client走完了TCP握手的第三步,在client看來連接已經建立好了,但是server上的對應連接實際沒有準備好,這個時候如果client發數據給server,server會怎么處理呢?(有同學說會reset,你覺得呢?)

提出這些問題,希望以這個知識點為抓手,讓你的知識體系開始自我生長。

參考文章

http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html

http://www.cnblogs.com/zengkefu/p/5606696.html

http://www.cnxct.com/something-about-phpfpm-s-backlog/

http://jaseywang.me/2014/07/20/tcp-queue-%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/

http://jin-yang.github.io/blog/network-synack-queue.html#

http://blog.chinaunix.net/uid-20662820-id-4154399.html

【本文為51CTO專欄作者“阿里巴巴官方技術”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2019-02-01 09:38:16

2018-10-15 08:06:33

TCP握手原理

2023-10-17 15:44:19

TCP四次揮手

2025-05-29 08:39:24

三次握手四次揮手TCP

2024-10-09 20:54:16

2022-07-07 09:00:17

TCP 連接HTTP 協議

2023-09-07 16:46:54

TCP數據傳遞

2023-03-07 08:38:23

三次握手四次揮手服務端

2023-10-24 15:22:09

TCPUDP

2020-12-08 06:34:16

TCP握手SYN 報文

2022-10-10 07:34:36

TCP三次握手區塊鏈

2024-07-15 08:21:26

TCPC#連接

2025-09-02 01:45:00

TCP通信字節流

2015-10-13 09:42:52

TCP網絡協議

2019-06-12 11:26:37

TCP三次握手四次揮手

2024-01-12 08:23:11

TCPACK服務器

2021-03-08 18:08:08

TCP Connect 協議

2022-07-25 07:07:35

TCP客戶端服務器

2019-12-12 10:36:43

TCPSYNIP

2020-08-27 07:41:28

TCP協議數據
點贊
收藏

51CTO技術棧公眾號

中文字幕欧美激情一区| 亚洲成人自拍偷拍| 日韩精品极品在线观看播放免费视频 | 国产精品对白刺激| 国产精品天天看| 成人性生交大片免费看视频直播| 视频二区欧美毛片免费观看| 国产精品18久久久久久久网站| 日韩精品一区在线| 精品粉嫩aⅴ一区二区三区四区| 在线免费观看你懂的| 亚洲免费观看高清完整版在线观看 | 中文字幕在线亚洲精品| 黄色18在线观看| 69久久99精品久久久久婷婷| 黄色片视频在线观看| 色综合久久久久网| 国产大学生校花援交在线播放| 一本色道久久综合精品竹菊| 久久久久久青草| 国产 日韩 欧美在线| 国产精品中文字幕日韩精品| 国产伦精品一区二区三区高清| 人人狠狠综合久久亚洲婷婷| 国产麻豆成人精品| 亚洲最新免费视频| 精品在线免费视频| 美女少妇精品视频| 欧美动物xxx| 亚洲欧美一区二区三区情侣bbw| 亚洲伊人av| 亚洲欧美韩国综合色| 99热这里只有精品在线播放| 国产欧美一区二区精品忘忧草 | 精品香蕉一区二区三区| av免费不卡| 亚洲区免费影片| 日韩福利影视| 奇米四色中文综合久久| 天天久久综合| 欧美精品欧美精品系列c| 激情久久五月天| 国产男女在线观看| 亚洲精品第1页| 欧洲日本在线| 国产一区二区三区在线视频| 国产经典视频一区| 99视频一区| 亚洲二区三区四区| 国产成人精品aa毛片| 濑亚美莉vs黑人在线观看| 日韩欧美亚洲范冰冰与中字| 超碰中文在线| 韩国精品久久久999| 综合天堂久久久久久久| 黄色一级片网址| 日韩美女视频一区| 视频二区一区| 少妇精品久久久一区二区三区| 国产精品久久久久久网站| 欧美视频在线观看| 欧美少妇一级片| 中文字幕亚洲精品在线观看| 亚洲免费视频一区二区三区| 在线亚洲国产精品网| 久久大胆人体视频| 亚洲欧美成人网| 欧美美女黄色| 在线播放国产一区中文字幕剧情欧美| 超碰精品在线| 久久精品女人的天堂av| 波多野结衣在线播放一区| 久久精品magnetxturnbtih| 成人小视频在线| 在线视频毛片| 最近中文字幕日韩精品 | 亚洲a成v人在线观看| 精品亚洲成av人在线观看| 91中文字幕网| 国产视频亚洲精品| 成人情趣视频网站| 路边理发店露脸熟妇泻火| 亚洲韩国一区二区三区| 成人天堂yy6080亚洲高清| 91视频免费网站| 久久国产电影| 国产精品久久久久久久久久三级| 欧美日韩色图| av动漫免费观看| 婷婷夜色潮精品综合在线| 成人爱爱网址| 成人日韩在线电影| 26uuuu精品一区二区| 18视频免费网址在线观看| 一区二区三区色| av电影在线地址| 热99精品只有里视频精品| 极品尤物av久久免费看| 黄色av网址在线免费观看| 欧美激情精品久久久久久免费印度 | 日韩久久在线| 亚洲www啪成人一区二区麻豆| 精品久久在线| 成人免费看片网站| 欧美日韩午夜剧场| 欧美噜噜久久久xxx| 一区二区电影免费观看| 国产精品久久久久久久久久免费 | 成功精品影院| 操bbb操bbb| 国产美女久久久久| 国产一级片在线| 4438全国成人免费| 暴力调教一区二区三区| caoporn-草棚在线视频最| 国产精品国产精品| 亚洲国产精品久久人人爱蜜臀| 9l亚洲国产成人精品一区二三| 精品视频在线观看一区| 亚洲色图在线观看| 韩国三级中文字幕hd久久精品| 国产99re66在线视频| 奇米影视首页 狠狠色丁香婷婷久久综合| 日韩二区三区四区| 久久视频www| 国产精品爽黄69天堂a| 成人欧美一区二区三区视频网页 | 国产精品国内免费一区二区三区| 网上成人av| 91成人精品网站| 国产精品传媒视频| 最近最新中文字幕在线| 欧美中文在线观看| 国产精品女同一区二区三区| 色老板在线视频| 性金发美女69hd大尺寸| 国产欧美日韩另类一区| 第一区第二区在线| 女人体1963| 国产日韩在线免费| 欧美午夜精品电影| 国产免费成人| 国产极品在线观看| 成年在线观看视频| 久久精品久久久久久国产 免费| 日韩欧美一区二区三区在线视频| 五月天丁香婷| 亚洲在线观看视频网站| 欧美色图在线观看| 日本少妇一区| 日韩av一二三四区| 九九亚洲视频| 视频在线观看你懂的| 99国产高清| 欧美xxx久久| 成人av网站在线| 老牛国内精品亚洲成av人片| 色网视频在线| 中文字幕亚洲无线码a| 久久久国产一区二区三区四区小说| 欧美日韩伦理片| 久久爱av电影| 亚洲精品国产精品久久清纯直播| 国产99亚洲| 在线无限看免费粉色视频| 亚洲人成绝费网站色www| 久久久一区二区| 欧美三级美国一级| 伊人福利在线| www黄色av| 亚洲自拍偷拍色图| 日韩电影大全免费观看2023年上| 91麻豆产精品久久久久久| 精品国产乱码久久久久久1区2匹| 国产网友自拍视频导航网站在线观看| 久久久久久久久91| 婷婷综合五月天| 青椒成人免费视频| 激情亚洲小说| 色就是色亚洲色图| 日本一二三区视频在线| 91国在线精品国内播放| 91超碰这里只有精品国产| 99视频热这里只有精品免费| www欧美激情| 久久精品中文字幕一区二区三区 | 色婷婷久久久久swag精品| 国产精品日韩欧美一区| 精品123区| 美国成人av| 免费看av软件| 亚洲精品免费一区二区三区| 一区二区三区视频免费在线观看| 亚洲精品国产一区二区三区四区在线| 美女视频一区免费观看| 中文字幕一区二区三区中文字幕| 麻豆网站在线| avtt天堂资源网| 亚洲一区二区三区四区五区午夜| 亚洲一区二区三区四区五区中文|