<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大量的 TIME_WAIT 狀態(tài) TCP 連接,對(duì)業(yè)務(wù)有什么影響?

          共 6928字,需瀏覽 14分鐘

           ·

          2020-08-30 21:03

          點(diǎn)擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”

          回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!

          來(lái)源 | ningg.top/computer-basic-theory-tcp-time-wait/

          1.問題描述

          模擬高并發(fā)的場(chǎng)景,會(huì)出現(xiàn)批量的 TIME_WAIT 的 TCP 連接:

          短時(shí)間后,所有的 TIME_WAIT 全都消失,被回收,端口包括服務(wù),均正常。

          即,在高并發(fā)的場(chǎng)景下,TIME_WAIT 連接存在,屬于正常現(xiàn)象。

          線上場(chǎng)景中,持續(xù)的高并發(fā)場(chǎng)景

          • 一部分 TIME_WAIT 連接被回收,但新的 TIME_WAIT 連接產(chǎn)生;
          • 一些極端情況下,會(huì)出現(xiàn)大量 的 TIME_WAIT 連接。

          Think:

          上述大量的 TIME_WAIT 狀態(tài) TCP 連接,有什么業(yè)務(wù)上的影響嗎?

          Nginx 作為反向代理時(shí),大量的短鏈接,可能導(dǎo)致 Nginx 上的 TCP 連接處于 time_wait 狀態(tài):

          • 每一個(gè) time_wait 狀態(tài),都會(huì)占用一個(gè)「本地端口」,上限為 65535(16 bit,2 Byte);
          • 當(dāng)大量的連接處于 time_wait 時(shí),新建立 TCP 連接會(huì)出錯(cuò),address already in use : connect 異常

          統(tǒng)計(jì) TCP 連接的狀態(tài):

          1.  `// 統(tǒng)計(jì):各種連接的數(shù)量`
          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 本地端口數(shù)量,上限為 65535(6.5w),這是因?yàn)?TCP 頭部使用 16 bit,存儲(chǔ)「端口號(hào) 」,因此約束上限為 65535

          推薦一個(gè)艿艿寫的 6000+ Star 的 SpringBoot + SpringCloud + Dubbo 教程的倉(cāng)庫(kù):https://github.com/YunaiV/SpringBoot-Labs

          2.問題分析

          大量的 TIME_WAIT 狀態(tài) TCP 連接存在,其本質(zhì)原因是什么?

          • 大量的短連接 存在
          • 特別是 HTTP 請(qǐng)求中,如果 connection 頭部取值被設(shè)置為 close 時(shí),基本都由「服務(wù)端 」發(fā)起主動(dòng)關(guān)閉連接
          • 而,TCP 四次揮手關(guān)閉連接機(jī)制中,為了保證 ACK 重發(fā)丟棄延遲數(shù)據(jù),設(shè)置 time_wait 為 2 倍的 MSL(報(bào)文最大存活時(shí)間)

          TIME_WAIT 狀態(tài):

          • TCP 連接中,主動(dòng)關(guān)閉連接 的一方出現(xiàn)的狀態(tài);(收到 FIN 命令,進(jìn)入 TIME_WAIT 狀態(tài),并返回 ACK 命令)
          • 保持 2 個(gè) MSL 時(shí)間,即,4 分鐘;(MSL 為 2 分鐘)

          推薦一個(gè)艿艿寫的 3000+ Star 的 SpringCloud Alibaba 電商開源項(xiàng)目的倉(cāng)庫(kù):https://github.com/YunaiV/onemall

          3.解決辦法

          解決上述 time_wait 狀態(tài)大量存在,導(dǎo)致新連接創(chuàng)建失敗的問題,一般解決辦法:

          1、客戶端 ,HTTP 請(qǐng)求的頭部,connection 設(shè)置為 keep-alive,保持存活一段時(shí)間:現(xiàn)在的瀏覽器,一般都這么進(jìn)行了 2、服務(wù)器端 ,

          • 允許 time_wait 狀態(tài)的 socket 被重用
          • 縮減 time_wait 時(shí)間,設(shè)置為 1 MSL(即,2 mins)

          更多細(xì)節(jié),參考:

          • https://www.cnblogs.com/yjf512/p/5327886.html

          結(jié)論 :幾個(gè)核心要點(diǎn)

          1、 time_wait 狀態(tài)的影響 :

          • TCP 連接中,「主動(dòng)發(fā)起關(guān)閉連接」的一端,會(huì)進(jìn)入 time_wait 狀態(tài)
          • time_wait 狀態(tài),默認(rèn)會(huì)持續(xù) 2 MSL(報(bào)文的最大生存時(shí)間),一般是 2x2 mins
          • time_wait 狀態(tài)下,TCP 連接占用的端口,無(wú)法被再次使用
          • TCP 端口數(shù)量,上限是 6.5w(65535,16 bit)
          • 大量 time_wait 狀態(tài)存在,會(huì)導(dǎo)致新建 TCP 連接會(huì)出錯(cuò),address already in use : connect 異常

          2、 現(xiàn)實(shí)場(chǎng)景 :

          • 服務(wù)器端,一般設(shè)置:不允許 「主動(dòng)關(guān)閉連接」
          • 但 HTTP 請(qǐng)求中,http 頭部 connection 參數(shù),可能設(shè)置為 close,則,服務(wù)端處理完請(qǐng)求會(huì)主動(dòng)關(guān)閉 TCP 連接
          • 現(xiàn)在瀏覽器中, HTTP 請(qǐng)求 connection 參數(shù),一般都設(shè)置為 keep-alive
          • Nginx 反向代理場(chǎng)景中,可能出現(xiàn)大量短鏈接,服務(wù)器端,可能存在

          3、 解決辦法:服務(wù)器端 ,

          • 允許 time_wait 狀態(tài)的 socket 被重用
          • 縮減 time_wait 時(shí)間,設(shè)置為 1 MSL(即,2 mins)

          4.附錄

          幾個(gè)方面:

          1. TCP 連接狀態(tài)的查詢
          2. MSL 時(shí)間
          3. TCP 三次握手和四次握手

          附錄 A:查詢 TCP 連接狀態(tài)

          Mac 下,查詢 TCP 連接狀態(tài)的具體命令:

          1.  `// Mac 下,查詢 TCP 連接狀態(tài)`
          2.  `$ netstat -nat |grep TIME_WAIT`
          3.  ``
          4.  `// Mac 下,查詢 TCP 連接狀態(tài),其中 -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.  `// 統(tǒng)計(jì):各種連接的數(shù)量`
          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 時(shí)間

          MSL,Maximum Segment Lifetime,“報(bào)文最大生存時(shí)間”,

          1. 任何報(bào)文在網(wǎng)絡(luò)上存在的最長(zhǎng)時(shí)間,超過這個(gè)時(shí)間報(bào)文將被丟棄。(IP 報(bào)文)
          2. TCP報(bào)文 (segment)是ip數(shù)據(jù)報(bào)(datagram)的數(shù)據(jù)部分。

          Tips:

          RFC 793中規(guī)定MSL為2分鐘,實(shí)際應(yīng)用中常用的是30秒,1分鐘和2分鐘等。

          2MSL,TCP 的 TIME_WAIT 狀態(tài),也稱為2MSL等待狀態(tài) :

          1. 當(dāng)TCP的一端發(fā)起主動(dòng)關(guān)閉(收到 FIN 請(qǐng)求),在發(fā)出最后一個(gè)ACK 響應(yīng)后,即第3次握 手完成后,發(fā)送了第四次握手的ACK包后,就進(jìn)入了TIME_WAIT狀態(tài)。
          2. 必須在此狀態(tài)上停留兩倍的MSL時(shí)間,等待2MSL時(shí)間主要目的是怕最后一個(gè) ACK包對(duì)方?jīng)]收到,那么對(duì)方在超時(shí)后將重發(fā)第三次握手的FIN包,主動(dòng)關(guān)閉端接到重發(fā)的FIN包后,可以再發(fā)一個(gè)ACK應(yīng)答包。
          3. 在 TIME_WAIT 狀態(tài)時(shí),兩端的端口不能使用,要等到2MSL時(shí)間結(jié)束,才可繼續(xù)使用。(IP 層)
          4. 當(dāng)連接處于2MSL等待階段時(shí),任何遲到的報(bào)文段都將被丟棄。

          不過在實(shí)際應(yīng)用中,可以通過設(shè)置 「SO_REUSEADDR選項(xiàng) 」,達(dá)到不必等待2MSL時(shí)間結(jié)束,即可使用被占用的端口。

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

          詳細(xì)細(xì)節(jié),參考:

          • TCP的三次握手與四次揮手(詳解+動(dòng)圖)

          具體示意圖:

          1. 三次握手 ,建立連接過程
          2. 四次揮手 ,釋放連接過程

          幾個(gè)核心疑問:

          1、 time_wait 是「服務(wù)器端」的狀態(tài)?or 「客戶端」的狀態(tài)?

          • RE:time_wait 是「主動(dòng)關(guān)閉 TCP 連接」一方的狀態(tài),可能是「客服端」的,也可能是「服務(wù)器端」的
          • 一般情況下,都是「客戶端」所處的狀態(tài);「服務(wù)器端」一般設(shè)置「不主動(dòng)關(guān)閉連接」

          2、 服務(wù)器在對(duì)外服務(wù)時(shí),是「客戶端」發(fā)起的斷開連接?還是「服務(wù)器」發(fā)起的斷開連接?

          • 正常情況下,都是「客戶端」發(fā)起的斷開連接
          • 「服務(wù)器」一般設(shè)置為「不主動(dòng)關(guān)閉連接」,服務(wù)器通常執(zhí)行「被動(dòng)關(guān)閉」
          • 但 HTTP 請(qǐng)求中,http 頭部 connection 參數(shù),可能設(shè)置為 close,則,服務(wù)端處理完請(qǐng)求會(huì)主動(dòng)關(guān)閉 TCP 連接

          關(guān)于 Apache httpd 服務(wù)器的關(guān)聯(lián)配置,參考:https://elf8848.iteye.com/blog/1739571

          關(guān)于 HTTP 請(qǐng)求中,設(shè)置的主動(dòng)關(guān)閉 TCP 連接的機(jī)制:TIME_WAIT的是主動(dòng)斷開方才會(huì)出現(xiàn)的,所以主動(dòng)斷開方是服務(wù)端?

          • 答案是是的。在HTTP1.1協(xié)議中,有個(gè) Connection 頭,Connection有兩個(gè)值,close和keep-alive,這個(gè)頭就相當(dāng)于客戶端告訴服務(wù)端,服務(wù)端你執(zhí)行完成請(qǐng)求之后,是關(guān)閉連接還是保持連接,保持連接就意味著在保持連接期間,只能由客戶端主動(dòng)斷開連接。還有一個(gè)keep-alive的頭,設(shè)置的值就代表了服務(wù)端保持連接保持多久。
          • HTTP默認(rèn)的Connection值為close,那么就意味著關(guān)閉請(qǐng)求的一方幾乎都會(huì)是由服務(wù)端這邊發(fā)起的。那么這個(gè)服務(wù)端產(chǎn)生TIME_WAIT過多的情況就很正常了。
          • 雖然HTTP默認(rèn)Connection值為close,但是,現(xiàn)在的瀏覽器發(fā)送請(qǐng)求的時(shí)候一般都會(huì)設(shè)置Connection為keep-alive了。所以,也有人說(shuō),現(xiàn)在沒有必要通過調(diào)整參數(shù)來(lái)使TIME_WAIT降低了。

          關(guān)于 time_wait :

          1、TCP 連接建立后,「主動(dòng)關(guān)閉連接 」的一端,收到對(duì)方的 FIN 請(qǐng)求后,發(fā)送 ACK 響應(yīng),會(huì)處于 time_wait 狀態(tài);

          2、 time_wait 狀態(tài) ,存在的必要性

          • 可靠的實(shí)現(xiàn) TCP 全雙工連接的終止 :四次揮手關(guān)閉 TCP 連接過程中,最后的 ACK 是由「主動(dòng)關(guān)閉連接」的一端發(fā)出的,如果這個(gè) ACK 丟失,則,對(duì)方會(huì)重發(fā) FIN 請(qǐng)求,因此,在「主動(dòng)關(guān)閉連接」的一段,需要維護(hù)一個(gè) time_wait 狀態(tài),處理對(duì)方重發(fā)的 FIN 請(qǐng)求;
          • 處理延遲到達(dá)的報(bào)文 :由于路由器可能抖動(dòng),TCP 報(bào)文會(huì)延遲到達(dá),為了避免「延遲到達(dá)的 TCP 報(bào)文」被誤認(rèn)為是「新 TCP 連接」的數(shù)據(jù),則,需要在允許新創(chuàng)建 TCP 連接之前,保持一個(gè)不可用的狀態(tài),等待所有延遲報(bào)文的消失,一般設(shè)置為 2 倍的 MSL(報(bào)文的最大生存時(shí)間),解決「延遲達(dá)到的 TCP 報(bào)文」問題;


          往期推薦

          Spring Validation最佳實(shí)踐及其實(shí)現(xiàn)原理

          fastjson 的作者,在阿里內(nèi)網(wǎng)挨罵了?!

          UML類圖符號(hào)、各種關(guān)系說(shuō)明以及舉例

          Spring Cloud 常見面試題及答案

          瞎了,蘋果說(shuō)這兩個(gè)Logo過于相似而提起訴訟...


          星球限時(shí)拼團(tuán)優(yōu)惠進(jìn)行中


          我的星球是否適合你?

          點(diǎn)擊閱讀原文看看我們都聊過啥?

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草原www网站 | 啪啪视频黄页 | 日本操B 黄色性爱视频欧美 | 草草草视频 | 国产第一页在线观看不卡 |