TCP 狀態轉移機

2021-07-15 02:53:45 字數 1465 閱讀 5281

tcp協議可靠傳輸協議,它的可靠性是有它的面向連線的性質所決定,在tcp連線與斷開的時候會出現不同的狀態,各種狀態之間的存在相互轉換,因此便有了狀態轉移機這個概念,下圖就是tcp連線的11種狀態之間的轉換圖

注意在tcp連線過程中沒有固定的客戶端與服務端的概念,是乙個相對的存在,兩者可交換身份,服務端可作為發起者,也可作為接受者,客戶端同理。

服務端:

1. 客戶端主動斷開連線:

首先服務端應用程序開啟斷開處於listen狀態,如下圖所示服務端的狀態從closed–>listen

在接收到客戶端傳送的請求後也就是說收到了第乙個syn後進入syn收到狀態,在收到從客戶端傳送的ack後進入established狀態,說明連線已經建立,可進行資料互動。互動完成後收到客戶端傳送的fin並傳送ack同時進入close_wait狀態,在自己的互動完成後向客戶端傳送fin並進入last_ack狀態,在收到客戶端的ack後進入closed狀態等待下一次連線。

2. 服務端主動斷開連線:

當服務端主動傳送fin並進入fin_wait1狀態 ,接下來分3中情況轉移:

1.收到ack後進如fin_wait2狀態,收到fin並傳送ack進入time_wait狀態等待2msl超時後進入closed狀態。

2.收到fin和ack並傳送ack,狀態轉移到time_wait狀態,等待2msl超時後進入closed狀態。

3.收到fin並傳送ack,先轉移到closing狀態,之後收到ack後進入time_wait狀態,等待2msl超時後進入closed狀態。

客戶端:

客戶端主動傳送fin進入syn_send狀態,在沒收到來自服務端的ack時會超時關閉程序也就是進入初始狀態,可以認為是closed狀態

當收到來自對端的syn後進入established狀態,表示連線已經建立,其他的狀態轉移方式與服務端相同。

在上文中有乙個特殊的狀態為time_wait狀態,此狀態是乙個很重要的狀態。為什麼會存在呢,乙個重要的原因就是防止回給對方fin的ack丟失。由於服務端並不會對該ack做確認,因此只能等待一段時間寄希望於服務端收到,如果服務端沒有收到對其fin的確認會繼續發乙個fin,這樣客戶端還有機會繼續回乙個ack。另外乙個原因是防止上一次連線中遲到的資料報影響新的連線,而在time_wait狀態中這些包會被丟棄。但是這種狀態的存在容易被攻擊,攻擊者傳送大量請求,使其進入time_wait狀態,拒絕服務正常的連線,從而導致伺服器進入癱瘓模式。

TCP狀態轉移

tcp狀態轉移,一共存在11個狀態,請看下圖 1.closed 起始點,在超時或者連線關閉時候進入此狀態。2.listen svr端在等待連線過來時候的狀態,svr端為此要呼叫socket,bind,listen函式,就能進入此狀態。此稱為應用程式被動開啟 等待客戶端來連線 3.syn sent 客...

TCP狀態轉移

被動開啟 active open 客戶端通過connect發起主動開啟。客戶端通過connect連線伺服器,客戶端tcp將傳送乙個syn包,告訴伺服器客戶端將在待建立連線傳送資料的初始序列號。客戶端 closed syn sent 伺服器端必須ack客戶端syn,同時傳送乙個syn,告訴客戶端,伺服...

TCP狀態轉移

1 伺服器程式執行,listen監聽之後伺服器進入listen狀態,等待客戶端的連線 2 當伺服器監聽到服務請求 接收到同步報文段 會傳送syn同步報文段和確認報文段,並進入syn rcvd狀態。3 當伺服器接收到客戶端返回的ack確認報文段,伺服器進入established狀態 情況一 4 當伺服...