最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何分析SocketTIME_WAIT問題

本篇文章給大家分享的是有關(guān)如何分析Socket TIME_WAIT 問題,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為宜賓企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),宜賓網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。


Socket TIME_WAIT 問題

tcp/ip詳解的卷1有詳細(xì)介紹過tcp的相關(guān)內(nèi)容,其中TIME_WAIT講得有點(diǎn)晦澀,今日找到一篇不錯(cuò)的文章,特拿來分享一下。

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"/t",state[key]}'

會(huì)得到類似下面的結(jié)果,具體數(shù)字會(huì)有所不同:

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669

狀態(tài):描述
CLOSED:無連接是活動(dòng)的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個(gè)連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時(shí)嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個(gè)釋放
LAST_ACK:等待所有分組死掉

也就是說,這條命令可以把當(dāng)前系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)分類匯總。

下面解釋一下為啥要這樣寫:

一個(gè)簡單的管道符連接了netstat和awk命令。

------------------------------------------------------------------

每個(gè)TCP報(bào)文在網(wǎng)絡(luò)內(nèi)的最長時(shí)間,就稱為MSL(Maximum Segment Lifetime),它的作用和IP數(shù)據(jù)包的TTL類似。

RFC793指出,MSL的值是2分鐘,但是在實(shí)際的實(shí)現(xiàn)中,常用的值有以下三種:30秒,1分鐘,2分鐘。

注意一個(gè)問題,進(jìn)入TIME_WAIT狀態(tài)的一般情況下是客戶端,大多數(shù)服務(wù)器端一般執(zhí)行被動(dòng)關(guān)閉,不會(huì)進(jìn)入TIME_WAIT狀態(tài),當(dāng)在服務(wù)

器端關(guān)閉某個(gè)服務(wù)再重新啟動(dòng)時(shí),它是會(huì)進(jìn)入TIME_WAIT狀態(tài)的。

舉例:
1.客戶端連接服務(wù)器的80服務(wù),這時(shí)客戶端會(huì)啟用一個(gè)本地的端口訪問服務(wù)器的80,訪問完成后關(guān)閉此連接,立刻再次訪問服務(wù)器的

80,這時(shí)客戶端會(huì)啟用另一個(gè)本地的端口,而不是剛才使用的那個(gè)本地端口。原因就是剛才的那個(gè)連接還處于TIME_WAIT狀態(tài)。
2.客戶端連接服務(wù)器的80服務(wù),這時(shí)服務(wù)器關(guān)閉80端口,立即再次重啟80端口的服務(wù),這時(shí)可能不會(huì)成功啟動(dòng),原因也是服務(wù)器的連

接還處于TIME_WAIT狀態(tài)。


檢查net.ipv4.tcp_tw當(dāng)前值,將當(dāng)前的值更改為1分鐘:
[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]#

vi /etc/sysctl
增加或修改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使內(nèi)核參數(shù)生效:
[root@aaa1 ~]# sysctl -p

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

用netstat再觀察正常


這里解決問題的關(guān)鍵是如何能夠重復(fù)利用time_wait的值,我們可以設(shè)置時(shí)檢查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

問一下TIME_WAIT有什么問題,是閑置而且內(nèi)存不回收嗎?

是的,這樣的現(xiàn)象實(shí)際是正常的,有時(shí)和訪問量大有關(guān),設(shè)置這兩個(gè)參數(shù): reuse是表示是否允許重新應(yīng)用處于TIME-WAIT狀態(tài)的

socket用于新的TCP連接; recyse是加速TIME-WAIT sockets回收

Q: 我正在寫一個(gè)unix server程序,不是daemon,經(jīng)常需要在命令行上重啟它,絕大 
多數(shù)時(shí)候工作正常,但是某些時(shí)候會(huì)報(bào)告"bind: address in use",于是重啟失 
敗。 

A: Andrew Gierth 
server程序總是應(yīng)該在調(diào)用bind()之前設(shè)置SO_REUSEADDR套接字選項(xiàng)。至于 
TIME_WAIT狀態(tài),你無法避免,那是TCP協(xié)議的一部分。 

Q: 如何避免等待60秒之后才能重啟服務(wù) 

A: Erik Max Francis 

使用setsockopt,比如 

-------------------------------------------------------------------------- 
int option = 1; 

if ( setsockopt ( masterSocket, SOL_SOCKET, SO_REUSEADDR, &option, 
sizeof( option ) ) < 0 ) 

die( "setsockopt" ); 

-------------------------------------------------------------------------- 

Q: 編寫 TCP/SOCK_STREAM 服務(wù)程序時(shí),SO_REUSEADDR到底什么意思? 

A: 這個(gè)套接字選項(xiàng)通知內(nèi)核,如果端口忙,但TCP狀態(tài)位于 TIME_WAIT ,可以重用 
端口。如果端口忙,而TCP狀態(tài)位于其他狀態(tài),重用端口時(shí)依舊得到一個(gè)錯(cuò)誤信息, 
指明"地址已經(jīng)使用中"。如果你的服務(wù)程序停止后想立即重啟,而新套接字依舊 
使用同一端口,此時(shí) SO_REUSEADDR 選項(xiàng)非常有用。必須意識(shí)到,此時(shí)任何非期 
望數(shù)據(jù)到達(dá),都可能導(dǎo)致服務(wù)程序反應(yīng)混亂,不過這只是一種可能,事實(shí)上很不 
可能。 

一個(gè)套接字由相關(guān)五元組構(gòu)成,協(xié)議、本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端 
口。SO_REUSEADDR 僅僅表示可以重用本地本地地址、本地端口,整個(gè)相關(guān)五元組 
還是唯一確定的。所以,重啟后的服務(wù)程序有可能收到非期望數(shù)據(jù)。必須慎重使 
用 SO_REUSEADDR 選項(xiàng)。 

Q: 在客戶機(jī)/服務(wù)器編程中(TCP/SOCK_STREAM),如何理解TCP自動(dòng)機(jī) TIME_WAIT 狀 
態(tài)? 

A: W. Richard Stevens <1999年逝世,享年49歲> 

下面我來解釋一下 TIME_WAIT 狀態(tài),這些在<> 
中2.6節(jié)解釋很清楚了。 

MSL(最大分段生存期)指明TCP報(bào)文在Internet上最長生存時(shí)間,每個(gè)具體的TCP實(shí)現(xiàn) 
都必須選擇一個(gè)確定的MSL值。RFC 1122建議是2分鐘,但BSD傳統(tǒng)實(shí)現(xiàn)采用了30秒。 

TIME_WAIT 狀態(tài)最大保持時(shí)間是2 * MSL,也就是1-4分鐘。 

IP頭部有一個(gè)TTL,最大值255。盡管TTL的單位不是秒(根本和時(shí)間無關(guān)),我們?nèi)孕?nbsp;
假設(shè),TTL為255的TCP報(bào)文在Internet上生存時(shí)間不能超過MSL。 

TCP報(bào)文在傳送過程中可能因?yàn)槁酚晒收媳黄染彌_延遲、選擇非最優(yōu)路徑等等,結(jié)果 
發(fā)送方TCP機(jī)制開始超時(shí)重傳。前一個(gè)TCP報(bào)文可以稱為"漫游TCP重復(fù)報(bào)文",后一個(gè) 
TCP報(bào)文可以稱為"超時(shí)重傳TCP重復(fù)報(bào)文",作為面向連接的可靠協(xié)議,TCP實(shí)現(xiàn)必須 
正確處理這種重復(fù)報(bào)文,因?yàn)槎呖赡茏罱K都到達(dá)。 

一個(gè)通常的TCP連接終止可以用圖描述如下: 

client server 
FIN M 
close -----------------> (被動(dòng)關(guān)閉) 
ACK M+1 
<----------------- 
FIN N 
<----------------- close 
ACK N+1 
-----------------> 

為什么需要 TIME_WAIT 狀態(tài)? 

假設(shè)最終的ACK丟失,server將重發(fā)FIN,client必須維護(hù)TCP狀態(tài)信息以便可以重發(fā) 
最終的ACK,否則會(huì)發(fā)送RST,結(jié)果server認(rèn)為發(fā)生錯(cuò)誤。TCP實(shí)現(xiàn)必須可靠地終止連 
接的兩個(gè)方向(全雙工關(guān)閉),client必須進(jìn)入 TIME_WAIT 狀態(tài),因?yàn)閏lient可能面 
臨重發(fā)最終ACK的情形。 


scz 2001-08-31 13:28 

先調(diào)用close()的一方會(huì)進(jìn)入TIME_WAIT狀態(tài) 


此外,考慮一種情況,TCP實(shí)現(xiàn)可能面臨先后兩個(gè)同樣的相關(guān)五元組。如果前一個(gè)連 
接處在 TIME_WAIT 狀態(tài),而允許另一個(gè)擁有相同相關(guān)五元組的連接出現(xiàn),可能處理 
TCP報(bào)文時(shí),兩個(gè)連接互相干擾。使用 SO_REUSEADDR 選項(xiàng)就需要考慮這種情況。 

為什么 TIME_WAIT 狀態(tài)需要保持 2MSL 這么長的時(shí)間? 

如果 TIME_WAIT 狀態(tài)保持時(shí)間不足夠長(比如小于2MSL),第一個(gè)連接就正常終止了。 
第二個(gè)擁有相同相關(guān)五元組的連接出現(xiàn),而第一個(gè)連接的重復(fù)報(bào)文到達(dá),干擾了第二 
個(gè)連接。TCP實(shí)現(xiàn)必須防止某個(gè)連接的重復(fù)報(bào)文在連接終止后出現(xiàn),所以讓TIME_WAIT 
狀態(tài)保持時(shí)間足夠長(2MSL),連接相應(yīng)方向上的TCP報(bào)文要么完全響應(yīng)完畢,要么被 
丟棄。建立第二個(gè)連接的時(shí)候,不會(huì)混淆。 

A: 小四 

在Solaris 7下有內(nèi)核參數(shù)對(duì)應(yīng) TIME_WAIT 狀態(tài)保持時(shí)間 

# ndd -get /dev/tcp tcp_time_wait_interval 
240000 
# ndd -set /dev/tcp tcp_time_wait_interval 1000 

缺省設(shè)置是240000ms,也就是4分鐘。如果用ndd修改這個(gè)值,最小只能設(shè)置到1000ms, 
也就是1秒。顯然內(nèi)核做了限制,需要Kernel Hacking。 

# echo "tcp_param_arr/W 0t0" | adb -kw /dev/ksyms /dev/mem 
physmem 3b72 
tcp_param_arr: 0x3e8 = 0x0 
# ndd -set /dev/tcp tcp_time_wait_interval 0 

我不知道這樣做有什么災(zāi)難性后果,參看<>的聲明。 

Q: TIME_WAIT 狀態(tài)保持時(shí)間為0會(huì)有什么災(zāi)難性后果?在普遍的現(xiàn)實(shí)應(yīng)用中,好象也 
就是服務(wù)器不穩(wěn)定點(diǎn),不見得有什么災(zāi)難性后果吧? 

D: [email protected] 

Linux 內(nèi)核源碼 /usr/src/linux/include/net/tcp.h 中 

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to successfully 
* close the socket, about 60 seconds */ 

最好不要改為0,改成1。端口分配是從上一次分配的端口號(hào)+1開始分配的,所以一般 
不會(huì)有什么問題。端口分配算法在tcp_ipv4.c中tcp_v4_get_port中。

以上就是如何分析Socket TIME_WAIT 問題,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:如何分析SocketTIME_WAIT問題
本文來源:http://fisionsoft.com.cn/article/jhchgh.html