1. 程式人生 > >TIME_WAIT狀態與解決方法

TIME_WAIT狀態與解決方法

tcp_tw_recycle和tcp_timestamps】
參考官方文件(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt),tcp_tw_recycle解釋如下:
tcp_tw_recycle選項作用為:Enable fast recycling TIME-WAIT sockets. Default value is 0.
tcp_timestamps選項作用為:Enable timestamps as defined in RFC1323. Default value is 1.

這兩個選項是linux核心提供的控制選項,和具體的應用程式沒有關係,而且網上也能夠查詢到大量的相關資料,但資訊都不夠完整,最主要的幾個問題如下;
1)快速回收到底有多快?
2)有的資料說只要開啟tcp_tw_recycle即可,有的又說要tcp_timestamps同時開啟,具體是哪個正確?
3)為什麼從虛擬機器NAT出去發起客戶端連線時選項無效,非虛擬機器連線就有效?

為了回答上面的疑問,只能看程式碼,看出一些相關的程式碼供大家參考:
=====linux-2.6.37 net/ipv4/tcp_minisocks.c 269======
void tcp_time_wait(struct sock *sk, int state, int timeo)
{
struct inet_timewait_sock *tw = NULL;
const struct inet_connection_sock *icsk = inet_csk(sk);
const struct tcp_sock *tp = tcp_sk(sk);
int recycle_ok = 0;

    //判斷是否快速回收,這裡可以看出tcp_tw_recycle和tcp_timestamps兩個選項都開啟的時候才進行快速回收,
    //且還有進一步的判斷條件,後面會分析,這個進一步的判斷條件和第三個問題有關
if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)
recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);

if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets)
tw = inet_twsk_alloc(sk, state);

if (tw != NULL) {
struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
        //計算快速回收的時間,等於 RTO * 3.5,回答第一個問題的關鍵是RTO(Retransmission Timeout)大概是多少
const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
        
        //。。。。。。此處省略很多程式碼。。。。。。
        
    if (recycle_ok) {
            //設定快速回收的時間
tw->tw_timeout = rto;
} else {
tw->tw_timeout = TCP_TIMEWAIT_LEN;
if (state == TCP_TIME_WAIT)
timeo = TCP_TIMEWAIT_LEN;
}
        
        //。。。。。。此處省略很多程式碼。。。。。。
}

RFC中有關於RTO計算的詳細規定,一共有三個:RFC-793、RFC-2988、RFC-6298,Linux的實現是參考RFC-2988。
對於這些演算法的規定和Linuxde 實現,有興趣的同學可以自己深入研究,實際應用中我們只要記住Linux如下兩個邊界值:
=====linux-2.6.37 net/ipv4/tcp.c 126================
#define TCP_RTO_MAX ((unsigned)(120*HZ))
#define TCP_RTO_MIN ((unsigned)(HZ/5))
==========================================
這裡的HZ是1s,因此可以得出RTO最大是120s,最小是200ms,對於區域網的機器來說,正常情況下RTO基本上就是200ms,因此3.5 RTO就是700ms
也就是說,快速回收是TIME_WAIT的狀態持續700ms,而不是正常的2MSL(Linux是1分鐘,請參考:include/net/tcp.h 109行TCP_TIMEWAIT_LEN定義)。
實測結果也驗證了這個推論,不停的檢視TIME_WAIT狀態的連線,偶爾能看到1個。

最後一個問題是為什麼從虛擬機發起的連線即使設定了tcp_tw_recycle和tcp_timestamps,也不會快速回收,繼續看程式碼:
tcp_time_wait函式中的程式碼行:recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);對應的實現如下:
=====linux-2.6.37 net/ipv4/tcp_ipv4.c 1772=====
int tcp_v4_remember_stamp(struct sock *sk)
{
    //。。。。。。此處省略很多程式碼。。。。。。

    //當獲取對端資訊時,進行快速回收,否則不進行快速回收
if (peer) {
if ((s32)(peer->tcp_ts - tp->rx_opt.ts_recent) <= 0 ||
   ((u32)get_seconds() - peer->tcp_ts_stamp > TCP_PAWS_MSL &&
    peer->tcp_ts_stamp <= (u32)tp->rx_opt.ts_recent_stamp)) {
peer->tcp_ts_stamp = (u32)tp->rx_opt.ts_recent_stamp;
peer->tcp_ts = tp->rx_opt.ts_recent;
}
if (release_it)
inet_putpeer(peer);
return 1;
}

return 0;
}
上面這段程式碼應該就是測試的時候虛擬機器環境不會釋放的原因,當使用虛擬機器NAT出去的時候,伺服器無法獲取隱藏在NAT後的機器資訊。
生產環境也出現了設定了選項,但TIME_WAIT連線數達到4W多的現象,可能和虛擬機器有關,也可能和組網有關。

總結一下:
1)快速回收到底有多快?
區域網環境下,700ms就回收;
2)有的資料說只要開啟tcp_tw_recycle即可,有的又說要tcp_timestamps同時開啟,具體是哪個正確?
需要同時開啟,但預設情況下tcp_timestamps就是開啟的,所以會有人說只要開啟tcp_tw_recycle即可;
3)為什麼從虛擬機發起客戶端連線時選項無效,非虛擬機器連線就有效?
和網路組網有關係,無法獲取對端資訊時就不進行快速回收;

綜合上面的分析和總結,可以看出這種方法不是很保險,在實際應用中可能受到虛擬機器、網路組網、防火牆之類的影響從而導致不能進行快速回收。

附:
1)tcp_timestamps的說明詳見RF1323,和TCP的擁塞控制(Congestion control)有關。
2)開啟此選項,可能導致無法連線,請參考:http://www.pagefault.info/?p=416 

相關推薦

TIME_WAIT狀態解決方法

tcp_tw_recycle和tcp_timestamps】 參考官方文件(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt),tcp_tw_recycle解釋如下: tcp_tw_recycle選項作用為:Enable fast

loadrunner---壓力機 出現TIME_WAIT狀態解決方法

當執行結果出現如上圖的曲線,首先分析壓力機的CPU是否爆了,排除了壓力機本身的問題後。然後判斷是否是壓力機TCP/IP是否釋放,cmd輸入命令netstat -n 如果出現了大量的TIME_WA

TCP連線狀態詳解及TIME_WAIT過多的解決方法

上圖對排除和定位網路或系統故障時大有幫助,但是怎樣牢牢地將這張圖刻在腦中呢?那麼你就一定要對這張圖的每一個狀態,及轉換的過程有深刻地認識,不能只停留在一知半解之中。下面對這張圖的11種狀態詳細解釋一下,以便加強記憶!不過在這之前,先回顧一下TCP建立連線的三次握手過程

CLOSE_WAIT狀態的原因解決方法

max lis echo 轉移 sin art option iad 默認 這個問題之前沒有怎麽留意過,是最近在面試過程中遇到的一個問題,面了兩家公司,兩家公司竟然都面到到了這個問題,不得不使我開始關註這個問題。說起CLOSE_WAIT狀態,如果不知道的話,還是先瞧一下TC

zabbix   監控平臺搭建過程中的報錯解決方法總結

監控 zabbix 運維自動化1.php option post_max_size 2.php option max_execution_time 3.php option max_input_time 4.php time zone 5.php bcm

inline-block元素的空隙解決方法

rom move 寬高 上下文 無效 cin idt 遮擋 inpu 多次遇到了使用inline-block後留下間隙的問題,所以記錄一下,以提醒自己以後留意這點。 現象描述: 使用display:inlie-block後和一些行內元素都有此現象如:<a&g

AppFuse 3常見問題解決方法

新建 配置 ng- fuse contex ext 什麽 article ger 非常長一段時間沒做SSH項目了。近期抽出時間看了一下升級到3.x的appfuse,對新版本號使用過程中出現的一些問題進行了排查。匯總例如以下。以備後用。本文原文出處: http://blog

spring定時任務執行兩次的原因解決方法

ref net 任務 article 服務 每次 bsp tail 本地 spring定時任務,本地執行一次,放到服務器上後,每次執行時會執行兩次,原因及解決辦法。 http://blog.csdn.net/yaobengen/article/details/70312

CSS - 移動端 常見小bug整理解決方法總結【更新中】

mic ros class clas 問題 像素 css strong 常見問題 常見問題總結與整理系列~ 1. border一像素在手機上看著有點粗的問題: 原理是因為:1px在手機上是使用2dp進行渲染的 換成 border: 0.5像素?是不行的!

希捷企業盤ST4000NM0035 V5更新TN04固件遇到的問題解決方法

失敗 mailto ges 51cto ext tex ado term 遇到的問題 問題說明:近期組NAS入了一塊希捷企業版硬盤V5,但高頻噪音過大,在論壇翻帖子了解到更新固件可解決此問題,又有@天涯望月發布的更新固件教程,故下決心更新固件。官網的企業盤V5固件已經更新到

java.sql.SQLException: Field 'id' doesn't have a default value(用eclipse操作數據庫時報了這種奇怪的錯誤)的原因解決方法

sql microsoft java except body class 操作數 解決方法 family 1、錯誤原因 由於id在數據庫表中是作為主鍵,但是在插入的過程中,沒有給予數值,並且沒有讓其自增 2、解決辦法 修改數據庫表中的id,讓

weblogic修改jdk版本遇到的問題解決方法

set res 聯網 內存 war pro dom href div 1.修改setDomainEnv ,路徑.../domains/xx_domain\bin\ 1.1修改JAVA_HOME為需要修改的路徑 註意:BEA_JAVA_HOME路徑不需修改 2.

淺談xss攻擊原理解決方法

ntb name 出現 AD 提交 參數傳遞 anti val 什麽 概述 XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁註入可執行代碼且成功地被瀏覽器 執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取用戶的聯系人列表,然後向聯系人發送

Eslint報錯整理解決方法(持續整理)

保存 分享圖片 indent angle strong center vsc 刪掉 abs 1.‘Unexpected tab character’   字面意思理解呢就是意想不到的制表符,當時出現的時候就是我習慣的使用Tab鍵去打空格,但是eslint默認不認可Tab,所

NGINX反向代理對HTML頁面的POST請求返回405狀態解決方法

nginx html post 405 http 實現如下:server { listen 80; listen 443 ssl; server_name nirvana.test-a.gogen; ssl_certificate /etc/ng

rsync 常見錯誤解決方法整理

pin acc ctrl 不可 管理員 rsync配置 nta onf 開啟 由於我們經常使用rsync進行服務器文件的同步工作,但在配置過程中,會出現很多問題,下面的錯誤基本上都是通過客戶端返回的錯誤進行分析我們都是通過錯誤日誌查看在rsyncd.log裏面或.err文件

遠端連線區域網內的sql server 無法連線 錯誤解決方法

第一個錯誤"SQL Server 不存在或訪問被拒絕"通常是最複雜的,錯誤發生的原因比較多,需要檢查的方面也比較多 。一般說來,有以下幾種可能性:   1、SQL Server名稱或IP地址拼寫有誤;   2、伺服器端網路配置有誤;   3、客戶端網路配置有誤。   要解決這個問題,我們一般要遵循以

ShapeDTW程式碼執行問題記錄解決方法

下載shapeDTW的GitHub程式碼執行,測試。 原始碼是MATLAB寫的,需要保證電腦安裝MATLAB。 然後根據readme.txt檔案提示: 第一步下載UCR資料集,http://www.cs.ucr.edu/~eamonn/time_series_data/ 下載後

Oracle中發生表加鎖、死鎖的原因,檢視,解決方法

一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它

onchange監聽input值變化及input隱藏後change事件不觸發的原因解決方法(設定readonly後onchange不起作用的解決方案)

轉自:https://www.cnblogs.com/white0710/p/7338456.html 1. onchange事件監聽input值變化的使用方法: <input id="test"></input> $("input"