先放上TCP狀態(tài)轉(zhuǎn)換圖
再放上三次握手
然后放上四次揮手
OK,我們發(fā)現(xiàn)在四次揮手中出現(xiàn)了TIME_WAIT 狀態(tài)
1.time_wait狀態(tài)是什么
簡(jiǎn)單來(lái)說:time_wait狀態(tài)是四次揮手中server向client發(fā)送FIN終止連接后進(jìn)入的狀態(tài)。
上面圖為tcp四次揮手過程?
這里寫圖片描寫敘述?
能夠看到time_wait狀態(tài)存在于client收到serverFin并返回ack包時(shí)的狀態(tài)?
當(dāng)處于time_wait狀態(tài)時(shí),我們無(wú)法創(chuàng)建新的連接,由于port被占用。
2.為什么會(huì)有time_wait狀態(tài)
time_wait存在的原因有兩點(diǎn)?
1.可靠的終止TCP連接。?
2.保證讓遲來(lái)的TCP報(bào)文段有足夠的時(shí)間被識(shí)別并丟棄。
1.可靠的終止TCP連接,若處于time_wait的client發(fā)送給server確認(rèn)報(bào)文段丟失的話,server將在此又一次發(fā)送FIN報(bào)文段,那么client必須處于一個(gè)可接收的狀態(tài)就是time_wait而不是close狀態(tài)。?
2.保證遲來(lái)的TCP報(bào)文段有足夠的時(shí)間被識(shí)別并丟棄,linux 中一個(gè)TCPport不能打開兩次或兩次以上。當(dāng)client處于time_wait狀態(tài)時(shí)我們將無(wú)法使用此port建立新連接,假設(shè)不存在time_wait狀態(tài),新連接可能會(huì)收到舊連接的數(shù)據(jù)。
time_wait持續(xù)的時(shí)間是2MSL,保證舊的數(shù)據(jù)能夠丟棄。由于網(wǎng)絡(luò)中的數(shù)據(jù)最大存在MSL(maxinum segment lifetime)
3.哪一方會(huì)有time_wait狀態(tài)
time_wait狀態(tài)是一般有client的狀態(tài)。
并且會(huì)占用port?
有時(shí)產(chǎn)生在server端,由于server主動(dòng)斷開連接或者發(fā)生異常
4.怎樣避免time_wait狀態(tài)占用資源
假設(shè)是client,我們一般不用操心,由于client一般選用暫時(shí)port。再次創(chuàng)建連接會(huì)新分配一個(gè)port。
除非指定client使用某port,只是一般不須要這么做。
假設(shè)是server主動(dòng)關(guān)閉連接后異常終止。則由于它總是使用用一個(gè)知名serverport號(hào),所以連接的time_wait狀態(tài)將導(dǎo)致它不能重新啟動(dòng)。只是我們能夠通過socket的選項(xiàng)SO_REUSEADDR來(lái)強(qiáng)制進(jìn)程馬上使用處于time_wait狀態(tài)的連接占用的port。?
通過socksetopt設(shè)置后,即使sock處于time_wait狀態(tài),與之綁定的socket地址也能夠馬上被重用。
此外也能夠通過改動(dòng)內(nèi)核參數(shù)/proc/sys/net/ipv4/tcp_tw/recycle來(lái)高速回收被關(guān)閉的socket,從而是tcp連接根本不進(jìn)入time_wait狀態(tài),進(jìn)而同意應(yīng)用程序馬上重用本地的socket地址。
TCP 狀態(tài)遷移過程
LISTEN:服務(wù)端已經(jīng)啟動(dòng)一個(gè)socket,其狀態(tài)處于監(jiān)聽狀態(tài),等待客戶發(fā)起請(qǐng)求連接。
ESTABLISHED:客戶端和服務(wù)端經(jīng)過三次握手建立,兩個(gè)方向上連接狀態(tài)都建立,狀態(tài)置為ESTABLISHED
客戶端狀態(tài)變遷:(主動(dòng)端)
FIN_WAIT_1: 發(fā)送FIN給服務(wù)端口。
FIN_WAIT_2:收到服務(wù)端的ACK報(bào)文
TIME_WAIT :收到服務(wù)端發(fā)過來(lái)的FIN報(bào)文,發(fā)送ACK報(bào)文給服務(wù)端口。主動(dòng)關(guān)閉連接端,接收到服務(wù)(TIME_WAIT是主動(dòng)端關(guān)閉)之后進(jìn)入2MSL時(shí)間的等待
CLOSE:2MSl過后,關(guān)閉進(jìn)入初始化狀態(tài)。
服務(wù)端狀態(tài)變遷:(服務(wù)端)
CLOSE_WAIT:收到客戶端FIN報(bào)文,給客戶端發(fā)送ACK狀態(tài)后,表示知道客戶端要關(guān)閉連接請(qǐng)求,服務(wù)端可能數(shù)據(jù)還沒有傳送完,所以處于等待關(guān)閉狀態(tài)。(CLOSE_WAIT是被動(dòng)端關(guān)閉)
LAST_ACK:服務(wù)端數(shù)據(jù)傳輸完畢,發(fā)送FIN報(bào)文給客戶端,同時(shí)等待客戶端發(fā)ACK報(bào)文狀態(tài)
CLOSE:收到客戶端ACK報(bào)文后,進(jìn)入初始化狀態(tài)





暫無(wú)評(píng)論,快來(lái)評(píng)論吧!