久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

TCP的11種狀態分別是什么

174次閱讀
沒有評論

共計 2280 個字符,預計需要花費 6 分鐘才能閱讀完成。

TCP 的 11 種狀態分別是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

本來想寫運維過程中,nginx 服務器中 time_wait 的相關測試及解決方法的,然后發現 TCP 的狀態需要先鋪墊一下,于是就整理了這篇文章。

網上很多大佬整理 TCP 三次握手、四次揮手,看到過很多人寫,但其實從運維角度來說,我們分析 TCP 鏈接狀態的時候,首先是用 netstat 或 ss 來查看。

之后才會根據 TCP 狀態的情況進行抓包分析,進一步確認一些問題,所以我們首先看到的會是 TCP 的狀態,那么就需要很清楚的了解 TCP 的 11 種狀態代表著什么。

TCP 的 11 種狀態分別對應 TCP 三次握手過程的 5 種狀態和 TCP 四次揮手斷開過程中的 6 種狀態。

如上圖,就是 11 種狀態,在整個 TCP 建立連接和斷開連接的整個過程

下面我用 tcpdump 抓了個完整的客戶端和服務端的三次握手和四次揮手的包,可以對應上面的狀態圖

下面分開來詳細看,首先是三次握手

上面這個圖就是完整的三次握手過程

首先由 client 發出請求連接,即 SYN=1 ACK=0,TCP 規定 SYN=1 時不能攜帶數據,但要消耗一個 seq,所以聲明自己的 seq=x

然后 Server 進行回復確認,即 SYN=1 ACK=1 seq=y ack=x+1

最后 Client 再進行一次確認,但不用 SYN 了,即 ACK=1 seq=x+1 ack=y+1

整個過程中對應的 TCP 狀態如下:

CLOSED:初始狀態,表示 TCP 連接是”關閉著的”或”未打開的”

LISTEN:表示服務器端的某個 SOCKET 處于監聽狀態,可以接受客戶端的連接

SYN_RCVD:表示服務器接收到了來自客戶端請求連接的 SYN 報文。這個狀態是在服務端的,但是它是一個中間狀態,很短暫,平常我們用 netstat 或 ss 的時候,不太容易看到這種狀態,但是遇到 SYN flood 之類的 SYN 攻擊時,會出現大量的這種狀態,即收不到三次握手最后一個客戶端發來的 ACK,所以一直是這個狀態,不會轉換到 ESTABLISHED

SYN_SENT:這個狀態與 SYN_RCVD 狀態相呼應,,它是 TCP 連接客戶端的狀態,當客戶端 SOCKET 執行 connect() 進行連接時,它首先發送 SYN 報文,然后隨機進入到 SYN_SENT 狀態,并等待服務端的 SYN 和 ACK,該狀態表示客戶端的 SYN 已發送

ESTABLISHED:表示 TCP 連接已經成功建立,開始傳輸數據

以上就是三次握手的五種 TCP 狀態,單從客戶端服務端角度來區分的話,CLOSED 和 ESTABLISHED 會在客戶端和服務端都出現,而 LISTEN 和 SYN_RCVD 通常是出現在服務端,SYN_SENT 出現在客戶端

但通常在服務器和客戶端并不是絕對的,比如 Nginx 的服務器中,Nginx 通常作為 web 代理服務器,它既是服務端,也是客戶端,所以在查詢統計 TCP 狀態的時候,最好通過匹配端口來區分是客戶端的還是服務端的,來更精確的定位問題。

接著看四次揮手的狀態

FIN_WAIT_1:這個狀態在實際工作中很少能看到,當客戶端想要主動關閉連接時,它會向服務端發送 FIN 報文,此時 TCP 狀態就進入到 FIN_WAIT_1 的狀態,而當服務端回復 ACK,確認關閉后,則客戶端進入到 FIN_WAIT_2 的狀態,也就是只有在沒有收到服務端 ACK 的情況下,FIN_WAIT_1 狀態才能看到,然后長時間收不到 ACK,通常會在默認超時時間 60s(由內核參數 tcp_fin_timeout 控制) 后,直接進入 CLOSED 狀態

FIN_WAIT_2:這個狀態相比較常見,也是需要注意的一個狀態,FIN_WAIT_1 在接收到服務端 ACK 之后就進入到 FIN_WAIT_2 的狀態,然后等待服務端發送 FIN,所以在收到對端 FIN 之前,TCP 都會處于 FIN_WAIT_2 的狀態,也就是,在主動斷開的一端發現大量的 FIN_WAIT_2 狀態時,需要注意,可能時網絡不穩定或程序中忘記調用連接關閉,FIN_WAIT_2 也有超時時間,也是由內核參數 tcp_fin_timeout 控制,當 FIN_WAIT_2 狀態超時后,連接直接銷毀

CLOSE_WAIT:表示正在等待關閉,該狀態只在被動端出現,即當主動斷開的一端調用 close() 后發送 FIN 報文給被動端,被動段必然會回應一個 ACK( 這是由 TCP 協議層決定的),這個時候,TCP 連接狀態就進入到 CLOSE_WAIT

LAST_ACK:當被動關閉的一方在發送 FIN 報文后,等待對方的 ACK 報文的時候,就處于 LAST_ACK 的狀態,當收到對方的 ACK 之后,就進入到 CLOSED 狀態了

TIME_WAIT:該狀態是最常見的狀態,主動方在收到對方 FIN 后,就由 FIN_WAIT_2 狀態進入到 TIME_WAIT 狀態

CLOSING:這個狀態是一個比較特殊的狀態,也比較少見,正常情況下不會出現,但是當雙方同時都作為主動的一方,調用 close() 關閉連接的時候,兩邊都進入 FIN_WAIT_1 的狀態,此時期望收到的是 ACK 包,進入 FIN_WAIT_2 的狀態,但是卻先收到了對方的 FIN 包,這個時候,就會進入到 CLOSING 的狀態,然后給對方一個 ACK,接收到 ACK 后直接進入到 CLOSED 狀態。

以上就是四次揮手的 6 種狀態,了解了每個狀態的詳細含義,就可以在性能調優及故障排查中快速定位問題,調整相關參數。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計2280字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 乐业县| 前郭尔| 都江堰市| 玉林市| 九江县| 江陵县| 钟山县| 襄樊市| 郁南县| 禹州市| 辽宁省| 民丰县| 安陆市| 林西县| 微博| 来凤县| 孟连| 阳信县| 子洲县| 苍南县| 怀集县| 青铜峡市| 灵宝市| 南郑县| 周宁县| 浦县| 丹棱县| 腾冲县| 天气| 交城县| 利辛县| 肇州县| 确山县| 虎林市| 铁岭县| 彝良县| 仙桃市| 沁水县| 酒泉市| 沁阳市| 包头市|