关于timewait状态
四次揮手
- 主動(dòng)關(guān)閉連接的一方,調(diào)用close,協(xié)議層發(fā)送FIN包,在TCP報(bào)頭的FIN字段設(shè)置為1,意思是我要和你斷開(kāi)鏈接,主動(dòng)關(guān)閉連接的一方進(jìn)入到了FIN_WATI_1狀態(tài)
- 被動(dòng)關(guān)閉的一方收到了FIN包之后,協(xié)議層回復(fù)ACK包,在他的TCP報(bào)頭中將ACK設(shè)置為1,表示收到了對(duì)方的關(guān)閉連接請(qǐng)求,被動(dòng) 的一方進(jìn)入到了CLOSE_WAIT狀態(tài);主動(dòng)關(guān)閉的一方收到了被動(dòng)關(guān)閉一方的響應(yīng),等待對(duì)方關(guān)閉,主動(dòng)關(guān)閉的一方進(jìn)入到了FIN_WAIT_2狀態(tài);
這里解釋一下,為什么被動(dòng)關(guān)閉的一方收到主動(dòng)關(guān)閉一方的FIN包之后進(jìn)入的狀態(tài)是CLOSE_WAIT狀態(tài)呢,因?yàn)榇藭r(shí)是傳輸層,傳輸層要等待上層的close操作 - 被動(dòng)關(guān)閉的一方在完成所有的數(shù)據(jù)傳輸之后,調(diào)用 close操作,此時(shí)發(fā)送FIN包,在TCP報(bào)頭中將FIN字段設(shè)置為1,表示我要和你斷開(kāi)連接,等待對(duì)方的ACK,此時(shí)被動(dòng)關(guān)閉的一方進(jìn)入到了LAST_ACK狀態(tài)
- 主動(dòng)弄關(guān)閉的一方,收到了對(duì)方的FIN包之后,回復(fù)了ACK包,主動(dòng)關(guān)閉的一方進(jìn)入到了TIME_WATI狀態(tài),而被動(dòng)關(guān)閉的一方進(jìn)入到了CLOSED狀態(tài)
- 主動(dòng)關(guān)閉的一方等待了2MSL時(shí)間,結(jié)束TIME_WATI狀態(tài),進(jìn)入了 CLOSED狀態(tài)
為什么會(huì)有TIME_WAIT狀態(tài)呢???
他的出現(xiàn)主要是為了解決網(wǎng)絡(luò)丟包和網(wǎng)絡(luò)不穩(wěn)定所帶來(lái)的其他問(wèn)題:
1. 防止前一個(gè)連接的延遲數(shù)據(jù)包或者是丟失重傳數(shù)據(jù)包被下一個(gè)連接使用,可能出現(xiàn)這樣一種情況,用戶在瀏覽器訪問(wèn)一個(gè)網(wǎng)站的時(shí)候,他的IP和端口號(hào)假設(shè)是192.168.3.2:8080,當(dāng)用戶再次在在瀏覽器中訪問(wèn)這個(gè)網(wǎng)站的時(shí)候,使用的IP和端口號(hào)恰巧還是192.168.3.2:8080,這個(gè)時(shí)候延遲數(shù)據(jù)或者是丟失重傳的數(shù)據(jù)就會(huì)被新的 連接錯(cuò)誤使用了
2. 防止最后傳輸?shù)腁CK包沒(méi)有被對(duì)方接受,如果被動(dòng)關(guān)閉的一方給主動(dòng)關(guān)閉的一方發(fā)送了FIN,此時(shí)被動(dòng)關(guān)閉的一方進(jìn)入到了LAST_ACK狀態(tài),主動(dòng)關(guān)閉連接的一方收到請(qǐng)求之后,回復(fù)ACK包,但是ACK丟失了,此時(shí)被動(dòng)關(guān)閉的一方一直停留在LAST_ACK狀態(tài),被動(dòng)方就會(huì)重發(fā)FIN包
如果TIME_WATI狀態(tài)的很短,或者是沒(méi)有這個(gè)狀態(tài),如果此時(shí)又新建立了一次連接,剛好這個(gè)連接是上次使用過(guò)的ip和port,這個(gè)時(shí)候就會(huì)收到錯(cuò)誤連接的包,連接不成功
如何查看當(dāng)前有timewait狀態(tài)有哪些
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
服務(wù)器timewait狀態(tài)問(wèn)題
Linux能夠分配的文件描述符是有限的,服務(wù)器需要處理網(wǎng)絡(luò)的數(shù)量巨大的請(qǐng)求,如果存在大量的timewait狀態(tài)狀態(tài),勢(shì)必會(huì)造成系統(tǒng)的資源浪費(fèi),甚至是服務(wù)宕機(jī)。因?yàn)榉?wù)器是需要客戶端建立連接的,通過(guò)ip+port的方式,可以理解為是端口號(hào)處于timewait狀態(tài)。服務(wù)器可以設(shè)置SO_REUSEADDR套接字選項(xiàng)來(lái)通知內(nèi)核,如果端口忙,但TCP連接位于TIME_WAIT狀態(tài)時(shí)可以重用端口。
總結(jié)
以上是生活随笔為你收集整理的关于timewait状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苏烟多少钱一包啊?
- 下一篇: 高并发系统搭建:web负载均衡