面試官問大量的TIME_WAIT 狀態 TCP連接對業務有什麼影響怎麼處理

2020-12-15 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

幾個方面:

問題描述:什麼現象?什麼影響?問題分析解決方案底層原理1.問題描述

模擬高並發的場景,會出現批量的

TIME_WAIT

的 TCP 連接:

短時間後,所有的

TIME_WAIT

全都消失,被回收,埠包括服務,均正常。

即,在高並發的場景下,

TIME_WAIT

連接存在,屬於正常現象。

線上場景中,持續的高並發場景

一部分 TIME_WAIT 連接被回收,但新的 TIME_WAIT 連接產生;一些極端情況下,會出現大量TIME_WAIT 連接。Think:

上述大量的 TIME_WAIT狀態 TCP 連接,有什麼業務上的影響嗎?

Nginx 作為反向代理時,大量的短連結,可能導致 Nginx 上的 TCP 連接處於

time_wait

狀態:

每一個 time_wait 狀態,都會佔用一個「本地埠」,上限為 65535(16 bit,2 Byte);當大量的連接處於 time_wait 時,新建立 TCP 連接會出錯,address already in use : connect 異常統計 TCP 連接的狀態:

1. `// 統計:各種連接的數量`2. `$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'`3. `ESTABLISHED 1154`4. `TIME_WAIT 1645`

Tips:

TCP 本地埠數量,上限為 65535(6.5w),這是因為 TCP 頭部使用 16 bit,存儲「埠號」,因此約束上限為 65535

2.問題分析

大量的

TIME_WAIT

狀態 TCP 連接存在,其本質原因是什麼?

大量的短連接存在特別是 HTTP 請求中,如果 connection 頭部取值被設置為 close 時,基本都由「服務端」發起主動關閉連接而,TCP 四次揮手關閉連接機制中,為了保證 ACK 重發丟棄延遲數據,設置 time_wait 為 2 倍的 MSL(報文最大存活時間)TIME_WAIT 狀態:

TCP 連接中,主動關閉連接的一方出現的狀態;(收到 FIN 命令,進入 TIME_WAIT 狀態,並返回 ACK 命令)保持 2 個 MSL 時間,即,4 分鐘;(MSL 為 2 分鐘)3.解決辦法

解決上述

time_wait

狀態大量存在,導致新連接創建失敗的問題,一般解決辦法:

1、客戶端,HTTP 請求的頭部,connection 設置為 keep-alive,保持存活一段時間:現在的瀏覽器,一般都這麼進行了 2、伺服器端

允許 time_wait 狀態的 socket 被重用縮減 time_wait 時間,設置為 1 MSL(即,2 mins)更多細節,參考:

https://www.cnblogs.com/yjf512/p/5327886.html結論:幾個核心要點

1、 time_wait 狀態的影響

TCP 連接中,「主動發起關閉連接」的一端,會進入 time_wait 狀態time_wait 狀態,默認會持續 2 MSL(報文的最大生存時間),一般是 2x2 minstime_wait 狀態下,TCP 連接佔用的埠,無法被再次使用TCP 埠數量,上限是 6.5w(65535,16 bit)大量 time_wait 狀態存在,會導致新建 TCP 連接會出錯,address already in use : connect 異常2、 現實場景

伺服器端,一般設置:不允許「主動關閉連接」但 HTTP 請求中,http 頭部 connection 參數,可能設置為 close,則,服務端處理完請求會主動關閉 TCP 連接現在瀏覽器中, HTTP 請求 connection 參數,一般都設置為 keep-aliveNginx 反向代理場景中,可能出現大量短連結,伺服器端,可能存在3、 解決辦法:伺服器端

允許 time_wait 狀態的 socket 被重用縮減 time_wait 時間,設置為 1 MSL(即,2 mins)4.附錄

幾個方面:

TCP 連接狀態的查詢MSL 時間TCP 三次握手和四次握手附錄 A:查詢 TCP 連接狀態

Mac 下,查詢 TCP 連接狀態的具體命令:

1. `// Mac 下,查詢 TCP 連接狀態`2. `$ netstat -nat |grep TIME_WAIT`3. ``4. `// Mac 下,查詢 TCP 連接狀態,其中 -E 表示 grep 或的匹配邏輯`5. `$ netstat -nat | grep -E "TIME_WAIT|Local Address"`6. `Proto Recv-Q Send-Q Local Address Foreign Address (state)`7. `tcp4 0 0 127.0.0.1.1080 127.0.0.1.59061 TIME_WAIT`8. ``9. `// 統計:各種連接的數量`10. `$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'`11. `ESTABLISHED 1154`12. `TIME_WAIT 1645`

附錄 B:MSL 時間

MSL,Maximum Segment Lifetime,「報文最大生存時間」,

任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。(IP 報文)TCP報文 (segment)是ip數據報(datagram)的數據部分。Tips:

RFC 793中規定MSL為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

2MSL,TCP 的

TIME_WAIT

狀態,也稱為2MSL等待狀態

當TCP的一端發起主動關閉(收到 FIN 請求),在發出最後一個ACK 響應後,即第3次握 手完成後,發送了第四次握手的ACK包後,就進入了TIME_WAIT狀態。必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最後一個 ACK包對方沒收到,那麼對方在超時後將重發第三次握手的FIN包,主動關閉端接到重發的FIN包後,可以再發一個ACK應答包。在 TIME_WAIT 狀態時,兩端的埠不能使用,要等到2MSL時間結束,才可繼續使用。(IP 層)當連接處於2MSL等待階段時,任何遲到的報文段都將被丟棄。不過在實際應用中,可以通過設置 「SO_REUSEADDR選項」,達到不必等待2MSL時間結束,即可使用被佔用的埠。

附錄 C:TCP 三次握手和四次握手

詳細細節,參考:

TCP的三次握手與四次揮手(詳解+動圖)具體示意圖:

三次握手建立連接過程四次揮手釋放連接過程

幾個核心疑問:

1、time_wait 是「伺服器端」的狀態?or 「客戶端」的狀態?

RE:time_wait 是「主動關閉 TCP 連接」一方的狀態,可能是「客服端」的,也可能是「伺服器端」的一般情況下,都是「客戶端」所處的狀態;「伺服器端」一般設置「不主動關閉連接」2、伺服器在對外服務時,是「客戶端」發起的斷開連接?還是「伺服器」發起的斷開連接?

正常情況下,都是「客戶端」發起的斷開連接「伺服器」一般設置為「不主動關閉連接」,伺服器通常執行「被動關閉」但 HTTP 請求中,http 頭部 connection 參數,可能設置為 close,則,服務端處理完請求會主動關閉 TCP 連接關於 Apache httpd 伺服器的關聯配置,參考:https://elf8848.iteye.com/blog/1739571

關於 HTTP 請求中,設置的主動關閉 TCP 連接的機制:TIME_WAIT的是主動斷開方才會出現的,所以主動斷開方是服務端?

答案是是的。在HTTP1.1協議中,有個 Connection 頭,Connection有兩個值,close和keep-alive,這個頭就相當於客戶端告訴服務端,服務端你執行完成請求之後,是關閉連接還是保持連接,保持連接就意味著在保持連接期間,只能由客戶端主動斷開連接。還有一個keep-alive的頭,設置的值就代表了服務端保持連接保持多久。HTTP默認的Connection值為close,那麼就意味著關閉請求的一方幾乎都會是由服務端這邊發起的。那麼這個服務端產生TIME_WAIT過多的情況就很正常了。雖然HTTP默認Connection值為close,但是,現在的瀏覽器發送請求的時候一般都會設置Connection為keep-alive了。所以,也有人說,現在沒有必要通過調整參數來使TIME_WAIT降低了。關於 time_wait

1、TCP 連接建立後,「主動關閉連接」的一端,收到對方的 FIN 請求後,發送 ACK 響應,會處於 time_wait 狀態;

2、time_wait 狀態,存在的

必要性

可靠的實現 TCP 全雙工連接的終止:四次揮手關閉 TCP 連接過程中,最後的 ACK 是由「主動關閉連接」的一端發出的,如果這個 ACK 丟失,則,對方會重發 FIN 請求,因此,在「主動關閉連接」的一段,需要維護一個 time_wait 狀態,處理對方重發的 FIN 請求;處理延遲到達的報文:由於路由器可能抖動,TCP 報文會延遲到達,為了避免「延遲到達的 TCP 報文」被誤認為是「新 TCP 連接」的數據,則,需要在允許新創建 TCP 連接之前,保持一個不可用的狀態,等待所有延遲報文的消失,一般設置為 2 倍的 MSL(報文的最大生存時間),解決「延遲達到的 TCP 報文」問題;

相關焦點

  • 面試官:Java多線程中調用wait() 和 sleep()方法有什麼不同
    前言:面試中被問到這個問題。我:①、sleep和wait的實現不一樣,②、對待鎖的處理不一樣。面試官:那麼你具體說說。而wait方法是Object的方法,他是用於線程之間的通信(注意是線程之間的通信,也就是說他是個中間人),該方法會使當前擁有該對象鎖的線程等待,直到其他線程調用了notify、notifyAll或者wait超時才會「甦醒」。這裡舉個wait例子,看他是否真會卡在那,如圖:
  • 35 張圖解被問千百遍的 TCP 三次握手和四次揮手面試題
    大家這時就奇怪了問:「 UDP 也是基於 IP 層的呀,那 UDP 的數據長度也可以通過這個公式計算呀? 為何還要有「包長度」呢?」這麼一問,確實感覺 UDP 「包長度」是冗餘的。避免 SVN 攻擊方式一其中一種解決方式是通過修改 Linux 內核參數,控制隊列大小和當隊列滿時應做什麼處理。當網卡接收數據包的速度大於內核處理的速度時,會有一個隊列保存這些數據包。
  • 面試官不講武德,對Java初級程序猿死命摩擦Http協議
    會發生什麼,當然是展示出網頁啊,大腦飛速旋轉,脖子快斷的時候,終於想到面試官可能想要問什麼了)我:英俊瀟灑的面試官,你好!首先瀏覽器會去訪問DNS伺服器,查詢到域名對應的ip地址是多少,然後瀏覽器再去訪問這個ip地址;如果還要往底層在說的話,就會涉及到tcp/ip的分層,我還是來畫張圖吧。
  • 關於關閉一個還有沒發送數據完的TCP連接思考
    背景 有一次,光神 在群問了個問題: 當 close 一個 TCP 連接時,如果還有沒發送完的數據在緩衝區中,內核會怎麼處理? 關閉一個 TCP 連接可以使用 close() 系統調用,我們來分析一下當調用 close() 關閉一個 TCP 連接時會發生什麼事情。
  • TCP協議面試靈魂10問,建議收藏
    TCP 作為傳輸層的協議,是一個軟體工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。001.所謂的連接,指的是客戶端和伺服器的連接,在雙方互相通信之前,TCP 需要三次握手建立連接,而 UDP 沒有相應建立連接的過程。可靠性。TCP 花了非常多的功夫保證連接的可靠,這個可靠性體現在哪些方面呢?一個是有狀態,另一個是可控制。TCP 會精準記錄哪些數據發送了,哪些數據被對方接收了,哪些沒有被接收到,而且保證數據包按序到達,不允許半點差錯。這是有狀態。
  • 近兩萬字 TCP 硬核知識,教你吊打面試官!
    Linux 下怎麼打開 TCP Fast Open 功能呢?但是線程池處理不了那麼多一直不斷的連接了。所以當服務端出現大量 TIME_WAIT 時,系統資源被佔滿時,會導致處理不過來新的連接;另外,Linux 提供了 tcp_max_tw_buckets 參數,當 TIME_WAIT 的連接數量超過該參數時,新關閉的連接就不再經歷 TIME_WAIT 而直接關閉:當伺服器的並發連接增多時,相應地,同時處於 TIME_WAIT 狀態的連接數量也會變多,此時就應當調大
  • 總結的23 個 TCP高頻面試問題
    所以把控制的邏輯獨立出來成 TCP 層,讓真正的接收端來處理,這樣網絡整體的傳輸效率就高了。 連接到底是什麼? 我們已經知道了為什麼需要獨立出 TCP 這一層,並且這一層主要是用來幹嘛的,接下來就來看看它到底是怎麼幹的。
  • 網絡篇:朋友面試之TCP/IP,回去等通知吧
    ,朋友不失禮貌地笑著回了句「行」面試官:看你簡歷說精通TCP和IP,那我們來討論下網絡模型和TCP、IP協議,講下你的理解先 朋友(怎麼一上來就問TCP,不按套路出牌啊,不該問問java基礎嗎?不過常規題,我還行) 朋友:網絡模型一般分七層:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層。
  • 面試又掛了,只因問了:TCP三次握手和四次揮手
    面試官:跟我講講TCP的三次握手和四次揮手流程,為什麼是三次握手或四次揮手?面試者:額......不太記得了.....gg..那麼接下來就是TCP的核心了,即TCP的可靠性依賴其:三次握手和四次揮手。先思考下這三個面試題:1、TCP 為什麼三次握手而不是兩次握手?2、為什麼連接的時候是三次握手,關閉的時候卻是四次握手?
  • 面試官問:「你的興趣愛好是什麼?」這樣回答,面試官最滿意
    1 面試官為什麼要問這道題?面試官時間是很寶貴的,在短短一個小時之內,需要對候選人深入的了解,所以問任何問題都是有目的性的,那面試官問:「你的興趣愛好是什麼?」有什麼目的呢?面試官問你有什麼體育運動方面的愛好,他可不是想尋找球友,而是想從側面了解你的工作精力和活力以及身體健康程度。面試官問你是否喜歡看書,他可能是想從側面看看你是否愛好學習。同時, 面試官也想了解候選人是否有不良嗜好,如果這個不良嗜好對於崗位有影響,可能就不不能要。
  • 「你還有什麼問題?」面試官這個靈魂拷問,究竟怎麼答?
    經歷了重重面試的人大多都被問到過一個問題:「你對我們公司/這個崗位還有什麼問題嗎」( Do you have any questions for us?Reddit網友也發現基本沒人反過來問招聘官問題。 Interviewers have often told me almost no one asks questions during interviews. 面試官們經常跟我提到說面試時幾乎沒有面試者提問。
  • 軟體測試之TCP、HTTP協議必知必會,面試必備!
    無狀態:含義:(1)對事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態,給伺服器發送HTTP請求之後,伺服器回應之後,不會有任何記錄;(2)每個請求都是獨立的;優點:釋放伺服器壓力設計:從而設計為處理完請求後,釋放連接。問題:網頁越來越複雜了,頁面中有很多圖片,如果每次都要建立一次TCP連接,效率就會很低。
  • 面試官問有什麼興趣愛好,應該怎麼回答?學會這幾招,為面試加分
    在工作場所,你遇到了多少次面試?當面試官提出問題時,他是否考慮過這些問題的出發點是什麼?作為受訪者,我們應該如何回答才能使人們感到可靠?工作場所的每個人都知道,當我們去公司進行面試時。在面試中,面試官會提出各種問題。但是實際上,所有問題都是無法改變的,但是表面會出現一層霧。
  • 雙語|「你還有什麼問題?」面試官這個靈魂拷問,究竟怎麼答?
    經歷了重重面試的人大多都被問到過一個問題:「你對我們公司/這個崗位還有什麼問題嗎」( Do you have any questions for us?Reddit網友也發現基本沒人反過來問招聘官問題。 Interviewers have often told me almost no one asks questions during interviews. 面試官們經常跟我提到說面試時幾乎沒有面試者提問。
  • 面試官不講武德,上來就問我Chrome底層原理和HTTP協議
    下面,我總結了4個面試常考的關於瀏覽器和網絡通信的問題,為你重新梳理瀏覽器,網絡通信、頁面渲染、JavaScript、瀏覽器安全等知識,從而讓你對整個前端後端體系有全新的認識。第一問:Chrome為什麼打開一個頁面,會有4個進程?
  • 弱電網絡技術之TCP協議靈魂 12 問,總會用得到
    先亮出這篇文章的思維導圖作者:神三元TCP 作為傳輸層的協議,是一個軟體工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。001.TCP 花了非常多的功夫保證連接的可靠,這個可靠性體現在哪些方面呢?一個是有狀態,另一個是可控制。TCP 會精準記錄哪些數據發送了,哪些數據被對方接收了,哪些沒有被接收到,而且保證數據包按序到達,不允許半點差錯。這是有狀態。
  • 面試官問你為什麼要辭職?學會這幾招,讓你在面試順利通過
    面試官問你為什麼要辭職?學會這幾招,讓你在面試順利通過我們在面試中總會遇到各種各樣的奇葩問題,當我們面對我們無法回答的問題時,我們通常都會表現得很緊張,說話支支吾吾,無法給面試官留下一個很好的印象。我的鄰居小鄭就在面試的時候犯了這個錯誤。當他去參加面試時,面試官向他詢問離職原因的時候,他對面試官說:「因為我不喜歡公司的老闆,他經常會讓我們有大量的工作任務。」當面試官聽到這種回答時,你的面試結果很有可能是面試無法通過。因為當你抱怨公司的工作過多,面試官可能會認為你的工作效率不高,並且當公司要你加班的時候你也很有可能會推三阻四甚至辭職。
  • 面試問「山」字加一筆,是什麼字?女大學生妙答,面試官拍手叫好
    在一次面試當中,面試官問了這樣一個問題:「山」加一筆是什麼字?來面試的人聽到這個問題,一時間沒有搞明白面試官的目的到底是什麼,也不知道怎樣回他才能更加合理。大家面面相覷,沒有作出回答。分析是一項非常重要的過程,有的時候我們可能沒有辦法分析出面試官的目的,或者是不知道面試官是出於什麼問出了這個問題,如果碰到這種情況的話,那麼就先放下面試官提問的目的,去思考他提出的問題。
  • 拼多多2020屆數據分析面試題合集
    網易雲音樂有什麼拼多多可以借鑑的地方?問面試官:部門?評價?業務答案空洞是指?(後來問面試官,面試官並沒有說回答錯)。6.有什麼問題問我。我問了流程大概有幾輪,大概中間隔多久,面試官說這個他不清楚要問HR。然後問了對我有什麼建立,有什麼需要提升。面試官接下來的回答扎心了,面試官說感覺我的SQL還不太行。。。。(本人一直最自信的技能就是SQL。。。。在SQL上下了很多功夫)。
  • 你的GitHub爆款項目,面試官可能問都不問
    因此必須制定戰略上的路線圖,要列出每一步對業務和技術方案的影響,有哪些優點和缺點。要做到這一點,數據科學家必須具備一個靈活、有戰略思維的頭腦,才能得到有可識別的檢查點的各種有效的解決方案。對於想要提升這項技能的應聘者而言,可以去解決儘可能多的 Leetcode 問題。也要讀讀數據科學產品的問題。