您好,登錄后才能下訂單哦!
TCP的11種狀態(tài)分別是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
本來想寫運維過程中,nginx 服務(wù)器中 time_wait 的相關(guān)測試及解決方法的,然后發(fā)現(xiàn)TCP 的狀態(tài)需要先鋪墊一下,于是就整理了這篇文章。
網(wǎng)上很多大佬整理TCP三次握手、四次揮手,看到過很多人寫,但其實從運維角度來說,我們分析 TCP 鏈接狀態(tài)的時候,首先是用netstat或ss來查看。
之后才會根據(jù) TCP 狀態(tài)的情況進行抓包分析,進一步確認一些問題,所以我們首先看到的會是 TCP 的狀態(tài),那么就需要很清楚的了解 TCP 的11種狀態(tài)代表著什么。
TCP 的11種狀態(tài)分別對應(yīng) TCP 三次握手過程的5種狀態(tài)和TCP四次揮手斷開過程中的6種狀態(tài)。
如上圖,就是11種狀態(tài),在整個TCP建立連接和斷開連接的整個過程
下面我用 tcpdump 抓了個完整的客戶端和服務(wù)端的三次握手和四次揮手的包,可以對應(yīng)上面的狀態(tài)圖
下面分開來詳細看,首先是三次握手
上面這個圖就是完整的三次握手過程
首先由 client 發(fā)出請求連接,即SYN=1 ACK=0,TCP 規(guī)定 SYN=1 時不能攜帶數(shù)據(jù),但要消耗一個 seq,所以聲明自己的seq=x
然后 Server 進行回復(fù)確認,即 SYN=1 ACK=1 seq=y ack=x+1
最后 Client 再進行一次確認,但不用SYN了,即ACK=1 seq=x+1 ack=y+1
整個過程中對應(yīng)的TCP狀態(tài)如下:
CLOSED:初始狀態(tài),表示TCP連接是”關(guān)閉著的”或”未打開的”
LISTEN:表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài),可以接受客戶端的連接
SYN_RCVD:表示服務(wù)器接收到了來自客戶端請求連接的SYN報文。這個狀態(tài)是在服務(wù)端的,但是它是一個中間狀態(tài),很短暫,平常我們用netstat或ss的時候,不太容易看到這種狀態(tài),但是遇到SYN flood之類的SYN攻擊時,會出現(xiàn)大量的這種狀態(tài),即收不到三次握手最后一個客戶端發(fā)來的ACK,所以一直是這個狀態(tài),不會轉(zhuǎn)換到ESTABLISHED
SYN_SENT:這個狀態(tài)與SYN_RCVD狀態(tài)相呼應(yīng),,它是TCP連接客戶端的狀態(tài),當客戶端SOCKET執(zhí)行connect()進行連接時,它首先發(fā)送SYN報文,然后隨機進入到SYN_SENT狀態(tài),并等待服務(wù)端的SYN和ACK,該狀態(tài)表示客戶端的SYN已發(fā)送
ESTABLISHED:表示TCP連接已經(jīng)成功建立,開始傳輸數(shù)據(jù)
以上就是三次握手的五種TCP狀態(tài),單從客戶端服務(wù)端角度來區(qū)分的話,CLOSED和ESTABLISHED會在客戶端和服務(wù)端都出現(xiàn),而LISTEN和SYN_RCVD通常是出現(xiàn)在服務(wù)端,SYN_SENT出現(xiàn)在客戶端
但通常在服務(wù)器和客戶端并不是絕對的,比如 Nginx 的服務(wù)器中,Nginx 通常作為 web 代理服務(wù)器,它既是服務(wù)端,也是客戶端,所以在查詢統(tǒng)計 TCP 狀態(tài)的時候,最好通過匹配端口來區(qū)分是客戶端的還是服務(wù)端的,來更精確的定位問題。
接著看四次揮手的狀態(tài)
FIN_WAIT_1:這個狀態(tài)在實際工作中很少能看到,當客戶端想要主動關(guān)閉連接時,它會向服務(wù)端發(fā)送FIN報文,此時TCP狀態(tài)就進入到FIN_WAIT_1的狀態(tài),而當服務(wù)端回復(fù)ACK,確認關(guān)閉后,則客戶端進入到FIN_WAIT_2的狀態(tài),也就是只有在沒有收到服務(wù)端ACK的情況下,F(xiàn)IN_WAIT_1狀態(tài)才能看到,然后長時間收不到ACK,通常會在默認超時時間60s(由內(nèi)核參數(shù)tcp_fin_timeout控制)后,直接進入CLOSED狀態(tài)
FIN_WAIT_2:這個狀態(tài)相比較常見,也是需要注意的一個狀態(tài),F(xiàn)IN_WAIT_1在接收到服務(wù)端ACK之后就進入到FIN_WAIT_2的狀態(tài),然后等待服務(wù)端發(fā)送FIN,所以在收到對端FIN之前,TCP都會處于FIN_WAIT_2的狀態(tài),也就是,在主動斷開的一端發(fā)現(xiàn)大量的FIN_WAIT_2狀態(tài)時,需要注意,可能時網(wǎng)絡(luò)不穩(wěn)定或程序中忘記調(diào)用連接關(guān)閉,F(xiàn)IN_WAIT_2也有超時時間,也是由內(nèi)核參數(shù)tcp_fin_timeout控制,當FIN_WAIT_2狀態(tài)超時后,連接直接銷毀
CLOSE_WAIT:表示正在等待關(guān)閉,該狀態(tài)只在被動端出現(xiàn),即當主動斷開的一端調(diào)用close()后發(fā)送FIN報文給被動端,被動段必然會回應(yīng)一個ACK(這是由TCP協(xié)議層決定的),這個時候,TCP連接狀態(tài)就進入到CLOSE_WAIT
LAST_ACK:當被動關(guān)閉的一方在發(fā)送FIN報文后,等待對方的ACK報文的時候,就處于LAST_ACK的狀態(tài),當收到對方的ACK之后,就進入到CLOSED狀態(tài)了
TIME_WAIT:該狀態(tài)是最常見的狀態(tài),主動方在收到對方FIN后,就由FIN_WAIT_2狀態(tài)進入到TIME_WAIT狀態(tài)
CLOSING:這個狀態(tài)是一個比較特殊的狀態(tài),也比較少見,正常情況下不會出現(xiàn),但是當雙方同時都作為主動的一方,調(diào)用 close() 關(guān)閉連接的時候,兩邊都進入FIN_WAIT_1 的狀態(tài),此時期望收到的是ACK包,進入 FIN_WAIT_2 的狀態(tài),但是卻先收到了對方的FIN包,這個時候,就會進入到 CLOSING 的狀態(tài),然后給對方一個ACK,接收到 ACK 后直接進入到 CLOSED 狀態(tài)。
以上就是四次揮手的6種狀態(tài),了解了每個狀態(tài)的詳細含義,就可以在性能調(diào)優(yōu)及故障排查中快速定位問題,調(diào)整相關(guān)參數(shù)。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。