日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项

發(fā)布時(shí)間:2023/12/31 ChatGpt 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

徹底弄懂TIME_WAIT 及 tcp_tw_reuse選項(xiàng)

約等于這篇文章的摘選和翻譯
https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

文章目錄

  • 徹底弄懂TIME_WAIT 及 tcp_tw_reuse選項(xiàng)
    • TIME_WAIT存在的兩個(gè)原因
    • net.ipv4.tcp_tw_reuse —— 針對客戶端(發(fā)起連接的一方)優(yōu)化TIME_WAIT
      • net.ipv4.tcp_tw_reuse開啟后 特殊情況的分析
    • 總結(jié)

TIME_WAIT是tcp釋放連接的四次揮手后的主動(dòng)關(guān)閉連接方的狀態(tài)

TIME_WAIT存在的兩個(gè)原因

人盡皆知的是,防止上一個(gè)TCP連接的延遲的數(shù)據(jù)包(發(fā)起關(guān)閉,但關(guān)閉沒完成),被接收后,影響到新的TCP連接。(唯一連接確認(rèn)方式為四元組:源IP地址、目的IP地址、源端口、目的端口),包的序列號也有一定作用,會(huì)減少問題發(fā)生的幾率,但無法完全避免。尤其是較大接收windows size的快速(回收)連接。

第一個(gè)理由和連接“化身”和報(bào)文迷走有關(guān)系,為了讓舊連接的重復(fù)分節(jié)在網(wǎng)絡(luò)中自然消失。
下一次新的連接中就肯定不會(huì)出現(xiàn)舊連接的報(bào)文段了。

  • 我們知道,在網(wǎng)絡(luò)中,經(jīng)常會(huì)發(fā)生報(bào)文經(jīng)過一段時(shí)間才能到達(dá)目的地的情況,產(chǎn)生的原因是多種多樣的,如路由器重啟,鏈路突然出現(xiàn)故障等。
  • 如果迷走報(bào)文到達(dá)時(shí),發(fā)現(xiàn) TCP 連接四元組(源 IP,源端口,目的 IP,目的端口)所代表的連接不復(fù)存在,那么很簡單,這個(gè)報(bào)文自然丟棄。
    • 我們考慮這樣一個(gè)場景,在原連接中斷后,又重新創(chuàng)建了一個(gè)原連接的“化身”,說是化身其實(shí)是因?yàn)檫@個(gè)連接和原先的連接四元組完全相同,如果迷失報(bào)文經(jīng)過一段時(shí)間也到達(dá),那么這個(gè)報(bào)文會(huì)被誤認(rèn)為是連接“化身”的一個(gè) TCP 分節(jié),這樣就會(huì)對 TCP 通信產(chǎn)生影響。

另外一個(gè)作用是,當(dāng)最后一個(gè)ACK丟失時(shí),遠(yuǎn)程連接進(jìn)入LAST-ACK狀態(tài),它可以確保遠(yuǎn)程已經(jīng)關(guān)閉當(dāng)前TCP連接。如果沒有TIME-WAIT狀態(tài),當(dāng)遠(yuǎn)程仍認(rèn)為這個(gè)連接是有效的,則會(huì)繼續(xù)與其通訊,導(dǎo)致這個(gè)連接會(huì)被重新打開。當(dāng)遠(yuǎn)程收到一個(gè)SYN 時(shí),會(huì)回復(fù)一個(gè)RST包,因?yàn)檫@SEQ不對,那么新的連接將無法建立成功,報(bào)錯(cuò)終止。

  • 如果遠(yuǎn)程因?yàn)樽詈笠粋€(gè)ACK包丟失,導(dǎo)致停留在LAST-ACK狀態(tài),將影響新建立具有相同四元組的TCP連接。

所以,TCP 就設(shè)計(jì)出了這么一個(gè)機(jī)制,經(jīng)過 2MSL 這個(gè)時(shí)間,足以讓兩個(gè)方向上的分組都被丟棄,使得原來連接的分組在網(wǎng)絡(luò)中都自然消失,再出現(xiàn)的分組一定都是新化身所產(chǎn)生的。

2MSL 的時(shí)間是從主機(jī) 1 接收到 FIN 后發(fā)送 ACK 開始計(jì)時(shí)的;如果在 TIME_WAIT 時(shí)間內(nèi),因?yàn)橹鳈C(jī) 1 的 ACK 沒有傳輸?shù)街鳈C(jī) 2,主機(jī) 1 又接收到了主機(jī) 2 重發(fā)的 FIN 報(bào)文,那么 2MSL 時(shí)間將重新計(jì)時(shí)。道理很簡單,因?yàn)?2MSL 的時(shí)間,目的是為了讓舊連接的所有報(bào)文都能自然消亡,現(xiàn)在主機(jī) 1 重新發(fā)送了 ACK 報(bào)文,自然需要重新計(jì)時(shí),以便防止這個(gè) ACK 報(bào)文對新可能的連接化身造成干擾。

TIME_WAIT 的危害

  • 對端口資源的占用,一個(gè) TCP 連接至少消耗一個(gè)本地端口。要知道,端口資源也是有限的,一般可以開啟的端口為 32768~61000 ,也可以通過net.ipv4.ip_local_port_range指定,如果 TIME_WAIT 狀態(tài)過多,會(huì)導(dǎo)致無法創(chuàng)建新連接。這個(gè)也是我們在一開始講到的那個(gè)例子。

net.ipv4.tcp_tw_reuse —— 針對客戶端(發(fā)起連接的一方)優(yōu)化TIME_WAIT

機(jī)器作為客戶端時(shí)起作用,開啟后time_wait在一秒內(nèi)回收
對于服務(wù)端,打開tw_reuse無效

**TIME-WAIT狀態(tài)是為了防止不相關(guān)的延遲請求包被接受。**但在某些特定條件下,很有可能出現(xiàn),新建立的TCP連接請求包,被老連接(同樣的四元組,暫時(shí)還是TIME-WAIT狀態(tài),回收中)的連接誤處理。

RFC 1323 實(shí)現(xiàn)了TCP拓展規(guī)范,以保證網(wǎng)絡(luò)繁忙狀態(tài)下的高可用。除此之外,另外,它定義了一個(gè)新的TCP選項(xiàng)–兩個(gè)四字節(jié)的timestamp fields時(shí)間戳字段,第一個(gè)是TCP發(fā)送方的當(dāng)前時(shí)鐘時(shí)間戳,而第二個(gè)是從遠(yuǎn)程主機(jī)接收到的最新時(shí)間戳。

啟用net.ipv4.tcp_tw_reuse后,如果新的時(shí)間戳,比以前存儲(chǔ)的時(shí)間戳更大,那么linux將會(huì)從TIME-WAIT狀態(tài)的存活連接中,選取一個(gè),重新分配給新的連接出去的TCP連接。

連出的TIME-WAIT狀態(tài)連接,僅僅1秒后就可以被重用了。

它如何安全?

  • TIME-WAIT狀態(tài)的第一個(gè)目的是避免在不相關(guān)的連接中接受重復(fù)的段。由于使用了時(shí)間戳,此類重復(fù)段將帶有過時(shí)的時(shí)間戳,因此會(huì)被丟棄。
  • 第二個(gè)目的是確保遠(yuǎn)端 不會(huì)因?yàn)樽詈笠粋€(gè)ACK丟失而處于LAST-ACK狀態(tài)。
    遠(yuǎn)端將重傳FIN段,直到(3種可能):
    • 它放棄(并斷開連接)
    • 它收到正在等待的ACK(并斷開連接)
    • 它收到一個(gè)RST(并斷開連接) —— 新連接會(huì)回復(fù)
    • 它收到 連接請求(同四元組) —— 特殊情況

如果按時(shí)接收到FIN段,則本端套接字仍將處于該TIME-WAIT狀態(tài),并會(huì)發(fā)送預(yù)期的ACK段。

net.ipv4.tcp_tw_reuse開啟后 特殊情況的分析

  • 特殊情況
    之前處于time_wait的機(jī)器 變?yōu)镾YN_SENT狀態(tài),向之前的 斷開連接的機(jī)器 重新 發(fā)送連接請求(四元組相同)

**一旦新連接(左邊的機(jī)器)替換了TIME-WAIT狀態(tài),新連接的SYN 段將被忽略(感謝時(shí)間戳)并且不會(huì)由RST應(yīng)答,而只會(huì)通過FIN段的重傳 。然后FIN段將用RST應(yīng)答 (因?yàn)楸镜剡B接處于該SYN-SENT狀態(tài)),這將允許轉(zhuǎn)換出該LAST-ACK狀態(tài)。**最初的SYN 段最終將被重新發(fā)送(一秒后),因?yàn)闆]有應(yīng)答,并且連接將在沒有明顯錯(cuò)誤的情況下建立,除了輕微的延遲:

如果遠(yuǎn)端因?yàn)樽詈笠粋€(gè)ACK丟失而一直處于LAST-ACK狀態(tài),當(dāng)本端轉(zhuǎn)換到SYN-SENT狀態(tài)時(shí),遠(yuǎn)端連接將被重置。

總結(jié)

通用的解決方案是通過使用更多的服務(wù)器端口來增加可能的四胞胎的數(shù)量。這將使您不會(huì)用盡可能的TIME-WAIT 狀態(tài)的連接。

服務(wù)器端,啟用net.ipv4.tcp_tw_reuse對傳入連接無用(自己的time_wait不會(huì)被優(yōu)化)。

客戶端,啟用net.ipv4.tcp_tw_reuse是另一種幾乎安全的解決方案。啟用net.ipv4.tcp_tw_recycle除了net.ipv4.tcp_tw_reuse大部分是無用的。

此外,在設(shè)計(jì)協(xié)議時(shí),不要讓客戶端先關(guān)閉。客戶端將不必處理TIME-WAIT將責(zé)任推給更適合處理此問題的服務(wù)器的狀態(tài)。

總結(jié)

以上是生活随笔為你收集整理的彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。