<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>

          Linux TCP 狀態(tài) TIME_WAIT 過多的處理

          共 2865字,需瀏覽 6分鐘

           ·

          2020-11-23 21:09

          來自:Jack

          鏈接:https://zhuanlan.zhihu.com/p/45102654

          首先處理這個(gè)問題,我們要知道一些網(wǎng)絡(luò)知識(shí),要知道tcp那些事,比如說三次握手,和四次揮手......很多人會(huì)問,為什么建鏈接要3次握手,斷鏈接需要4次揮手?讓我們一起看下下面的流程圖:



          首先,是三次握手:

          首先Client端發(fā)送連接請(qǐng)求報(bào)文,Server段接受連接后回復(fù)ACK報(bào)文,并為這次連接分配資源。Client端接收到ACK報(bào)文后也向Server段發(fā)生ACK報(bào)文,并分配資源,這樣TCP連接就建立了。


          然后是中間部分:?兩者之間可以傳輸數(shù)據(jù)了


          再次,下面的斷開鏈接:【注意】中斷連接端可以是Client端,也可以是Server端。


          假設(shè)Client端發(fā)起中斷連接請(qǐng)求,也就是發(fā)送FIN報(bào)文。Server端接到FIN報(bào)文后,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。


          所以你先發(fā)送ACK,"告訴Client端,你的請(qǐng)求我收到了,但是我還沒準(zhǔn)備好,請(qǐng)繼續(xù)你等我的消息"。這個(gè)時(shí)候Client端就進(jìn)入FIN_WAIT狀態(tài),繼續(xù)等待Server端的FIN報(bào)文。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成,則向Client端發(fā)送FIN報(bào)文,"告訴Client端,好了,我這邊數(shù)據(jù)發(fā)完了,準(zhǔn)備好關(guān)閉連接了"。


          Client端收到FIN報(bào)文后,"就知道可以關(guān)閉連接了,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,我Client端也可以關(guān)閉連接了。Ok,TCP連接就這樣關(guān)閉了!


          那么可以這么理解,當(dāng)client進(jìn)入time_wait的等待時(shí)間是2個(gè)MSL


          讓我們看一下一臺(tái)linux服務(wù)器的網(wǎng)絡(luò)狀態(tài):


          # netstat -an | awk '/^tcp/ {++State[$NF]}END{for(key in State)print key "\t" State[key]}'LAST_ACK  7LISTEN  9SYN_RECV  2CLOSE_WAIT  125ESTABLISHED  1070FIN_WAIT1  17FIN_WAIT2  247CLOSING  4TIME_WAIT  25087


          對(duì)于網(wǎng)站來說,這樣的time_wait略顯偏高, 也就是說大量的關(guān)閉操作在等待2個(gè)MSL后結(jié)束,正常我們的tcp 端口是65535個(gè),如果并發(fā)再高一些,可能會(huì)大量的socket不能及時(shí)被釋放,從而導(dǎo)致性能下降,所以我們可以通過linux內(nèi)核進(jìn)行一些網(wǎng)絡(luò)調(diào)整比如,開啟socket重用和快速回收:


          net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_keepalive_time = 1200net.ipv4.ip_local_port_range = 1024 65000



          net.ipv4.tcp_syncookies = 1

          表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;


          net.ipv4.tcp_tw_reuse = 1

          表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;


          net.ipv4.tcp_tw_recycle = 1

          表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。

          系統(tǒng)tcp_timestamps缺省就是開啟的,所以當(dāng)tcp_tw_recycle被開啟后,實(shí)際上這種行為就被激活了.如果服務(wù)器身處NAT環(huán)境,安全起見,通常要禁止tcp_tw_recycle,至于TIME_WAIT連接過多的問題,可以通過激活tcp_tw_reuse來緩解。


          net.ipv4.tcp_max_tw_buckets = 5000

          表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為180000,改為 5000。對(duì)于Apache、Nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對(duì)于Squid,效果卻不大。此項(xiàng)參數(shù)可以控制TIME_WAIT套接字的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死。


          net.ipv4.tcp_max_syn_backlog = 8192

          表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。


          net.ipv4.tcp_keepalive_time = 1200

          表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。


          net.ipv4.ip_local_port_range = 1024-65000

          表示用于向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。

          # netstat -an | awk '/^tcp/ {++State[$NF]}END{for(key in State)print key "\t" State[key]}'
          LAST_ACK 140
          LISTEN 9
          SYN_RECV 7
          CLOSE_WAIT 2
          ESTABLISHED 972
          FIN_WAIT1 21
          FIN_WAIT2 152
          CLOSING 2
          TIME_WAIT 682


          讀者福利
          《程序員內(nèi)功修煉》第二版強(qiáng)勢(shì)來襲,匯總了高質(zhì)量的算法、計(jì)算機(jī)基礎(chǔ)文章并且每一篇文章,要嘛是漫畫講解,要嘛是對(duì)話講解,一步步引導(dǎo),要嘛是圖形并茂...

          文章整體目錄


          如何獲取

          很簡(jiǎn)單,在我的微信公眾號(hào)?帥地玩編程?回復(fù)?程序員內(nèi)功修煉?即可獲取《程序員內(nèi)功修煉》第一版和第二版的 PDF。

          推薦,推薦一個(gè) GitHub,這個(gè) GitHub 整理了幾百本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,GitHub地址:https://github.com/iamshuaidi/CS-Book(電腦打開體驗(yàn)更好),地址閱讀原文直達(dá)

          瀏覽 35
          點(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>
                  美女操逼福利 | 色老板免费网址 | 天天干天天射天天操 | 欧美一区二区三区成人片下载 | 日本1234区在线观看 |