0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么建鏈接要3次握手,斷鏈接需要4次揮手?

Linux愛好者 ? 來(lái)源:Jack ? 作者:Linux愛好者 ? 2020-11-12 15:36 ? 次閱讀

首先處理這個(gè)問(wèn)題,我們要知道一些網(wǎng)絡(luò)知識(shí),要知道tcp那些事,比如說(shuō)三次握手,和四次揮手......很多人會(huì)問(wèn),為什么建鏈接要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)文后,意思是說(shuō)"我Client端沒(méi)有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒(méi)有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。

所以你先發(fā)送ACK,"告訴Client端,你的請(qǐng)求我收到了,但是我還沒(méi)準(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端沒(méi)有收到ACK則可以重傳?!?,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒(méi)有收到回復(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 " " State[key]}'LAST_ACK 7LISTEN 9SYN_RECV 2CLOSE_WAIT 125ESTABLISHED 1070FIN_WAIT1 17FIN_WAIT2 247CLOSING 4TIME_WAIT 25087

對(duì)于網(wǎng)站來(lái)說(shuō),這樣的time_wait略顯偏高, 也就是說(shuō)大量的關(guān)閉操作在等待2個(gè)MSL后結(jié)束,正常我們的tcp 端口是65535個(gè),如果并發(fā)再高一些,可能會(huì)大量的socket不能及時(shí)被釋放,從而導(dǎo)致性能下降,所以我們可以通過(guò)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來(lái)處理,可防范少量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連接過(guò)多的問(wèn)題,可以通過(guò)激活tcp_tw_reuse來(lái)緩解。

net.ipv4.tcp_max_tw_buckets = 5000

表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的最大數(shù)量,如果超過(guò)這個(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

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

# netstat -an | awk '/^tcp/ {++State[$NF]}END{for(key in State)print key " " State[key]}' LAST_ACK140 LISTEN9 SYN_RECV7 CLOSE_WAIT2 ESTABLISHED972 FIN_WAIT121 FIN_WAIT2152 CLOSING2 TIME_WAIT682

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207927
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8702

    瀏覽量

    84569
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78759

原文標(biāo)題:Linux TCP 狀態(tài) TIME_WAIT 過(guò)多的處理

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式學(xué)習(xí)-靜態(tài)鏈接和動(dòng)態(tài)鏈接

    一、靜態(tài)鏈接靜態(tài)鏈接通過(guò)靜態(tài)庫(kù)進(jìn)行鏈接,生成的目標(biāo)程序中包含運(yùn)行需要的所有庫(kù),可以直接運(yùn)行,不過(guò)就是文件比較大。靜態(tài)庫(kù)是匯編產(chǎn)生的.o文件的集合,一般以.a文件形式出現(xiàn)。gcc在使用靜
    發(fā)表于 08-28 09:33

    靜態(tài)鏈接和動(dòng)態(tài)鏈接

    一、靜態(tài)鏈接靜態(tài)鏈接通過(guò)靜態(tài)庫(kù)進(jìn)行鏈接,生成的目標(biāo)程序中包含運(yùn)行需要的所有庫(kù),可以直接運(yùn)行,不過(guò)就是文件比較大。靜態(tài)庫(kù)是匯編產(chǎn)生的.o文件的集合,一般以.a文件形式出現(xiàn)。gcc在使用靜
    發(fā)表于 08-27 10:20

    簡(jiǎn)述TCP協(xié)議的三握手機(jī)制

    TCP(Transmission Control Protocol,傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它主要用于在IP網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)傳輸。TCP協(xié)議的三握手
    的頭像 發(fā)表于 08-16 10:57 ?250次閱讀

    TSER953 4.16Gbps V3鏈接串行器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《TSER953 4.16Gbps V3鏈接串行器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-02 09:25 ?9次下載
    TSER953 4.16Gbps V<b class='flag-5'>3</b><b class='flag-5'>鏈接</b>串行器數(shù)據(jù)表

    鏈接與硬鏈接的區(qū)別

    鏈接又叫符號(hào)鏈接,和原文件不是一個(gè)文件,類似Windows的快捷方式,如果原始文件被刪除,所有指向它的符號(hào)鏈接也就都被破壞了
    的頭像 發(fā)表于 04-19 10:09 ?746次閱讀
    軟<b class='flag-5'>鏈接</b>與硬<b class='flag-5'>鏈接</b>的區(qū)別

    STM32+LWIP通信12無(wú)法再次通信怎么解決?

    嘗試移植LWIP+FREERTOS的時(shí)候出現(xiàn)了如下問(wèn)題,請(qǐng)各位大佬幫忙看看是哪里的問(wèn)題,我用了FreeRTOS+LWIP做ModbusTCP時(shí)出現(xiàn)了鏈接出現(xiàn)通信12然后通信中斷,并且再也沒(méi)法
    發(fā)表于 04-12 07:42

    說(shuō)說(shuō)TCP三握手的過(guò)程?為什么是三而不是兩、四

    說(shuō)說(shuō)TCP三握手的過(guò)程?為什么是三而不是兩、四? TCP三
    的頭像 發(fā)表于 02-04 11:03 ?443次閱讀

    TCP協(xié)議連接的三握手

    通過(guò)三握手,客戶端與服務(wù)端能夠確保彼此的網(wǎng)絡(luò)連接是可用的??蛻舳税l(fā)起的SYN報(bào)文和服務(wù)端返回的SYN+ACK報(bào)文都包含了對(duì)方的初始序列號(hào)和通信能力信息,通過(guò)互相確認(rèn)這些信息,雙方確認(rèn)彼此的能力和正確性。
    的頭像 發(fā)表于 02-03 16:44 ?1201次閱讀
    TCP協(xié)議連接的三<b class='flag-5'>次</b><b class='flag-5'>握手</b>

    淺談TCP三握手和四揮手

    在計(jì)算機(jī)網(wǎng)絡(luò)的基本概念中,分層次的體系結(jié)構(gòu)是最基本的。計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)的抽象概念較多,在學(xué)習(xí)時(shí)多思考。這些概念對(duì)后面的學(xué)習(xí)很有幫助。
    的頭像 發(fā)表于 01-03 13:40 ?645次閱讀
    淺談TCP三<b class='flag-5'>次</b><b class='flag-5'>握手</b>和四<b class='flag-5'>次</b><b class='flag-5'>揮手</b>

    TCP四揮手過(guò)程分析

    TCP 連接是全雙工的,雙方可以同時(shí)發(fā)送和接收數(shù)據(jù)。第一客戶端發(fā)送 FIN 報(bào)文后只表示它不再發(fā)送數(shù)據(jù),但還是能接受數(shù)據(jù)。服務(wù)端接收到 FIN 報(bào)文,回一個(gè) ACK 應(yīng)答報(bào)文,這次服務(wù)端可以還有數(shù)據(jù)需要處理和發(fā)送,等它處理完成
    的頭像 發(fā)表于 12-10 15:40 ?2686次閱讀
    TCP四<b class='flag-5'>次</b><b class='flag-5'>揮手</b>過(guò)程分析

    TCP三握手的理論知識(shí)

    關(guān)于TCP三握手的理論知識(shí),往上一搜一大片,本文就跳過(guò)理論,直接上手。Let’s go。 準(zhǔn)備知識(shí) 抓一個(gè)TCP三握手的包 開啟三個(gè)窗口,窗口1執(zhí)行命令: sudo tcpdump
    的頭像 發(fā)表于 11-09 11:27 ?608次閱讀
    TCP三<b class='flag-5'>次</b><b class='flag-5'>握手</b>的理論知識(shí)

    射頻識(shí)別技術(shù)漫談(19)——Desfire的3握手認(rèn)證和段密碼生成

    射頻識(shí)別技術(shù)漫談(19)——Desfire的3握手認(rèn)證和段密碼生成
    的頭像 發(fā)表于 10-16 17:00 ?983次閱讀
    射頻識(shí)別技術(shù)漫談(19)——Desfire的<b class='flag-5'>3</b><b class='flag-5'>次</b><b class='flag-5'>握手</b>認(rèn)證和段密碼生成

    鏈接PK軟鏈接

    鏈接PK軟鏈接
    的頭像 發(fā)表于 10-12 18:16 ?1052次閱讀

    長(zhǎng)短鏈接原理案例

    最近在做一套推廣系統(tǒng),將其中涉及的 長(zhǎng)短鏈接問(wèn)題 在這里分享一下。推廣方式主要是以短信方式慰問(wèn)客戶并推送宣傳鏈接(非廣告),但鏈接真的是太長(zhǎng)了,先不說(shuō)短信按字?jǐn)?shù)收費(fèi)問(wèn)題,就是看到就想立刻刪除。所以
    的頭像 發(fā)表于 10-08 14:31 ?643次閱讀
    長(zhǎng)短<b class='flag-5'>鏈接</b>原理案例

    主變充電為什么

    主變充電為什么? 主變充電是電力變壓器在運(yùn)行過(guò)程中需要進(jìn)行的一個(gè)重要步驟,其目的是為了保證電力系統(tǒng)的穩(wěn)定性和可靠性。而主變充電通常需要進(jìn)行五
    的頭像 發(fā)表于 09-27 15:55 ?2236次閱讀