1、建立連線協議(三次握手)
(1)客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。
(2)伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應;同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通 訊。
(3)客戶必須再次回應服務段乙個ack報文,這是報文段3。
2、連線終止協議(四次握手)
由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(1) tcp客戶端傳送乙個fin,用來關閉客戶到伺服器的資料傳送(報文段4)。
(2)伺服器收到這個fin,它發回乙個ack,確認序號為收到的序號加1(報文段5)。和syn一樣,乙個fin將占用乙個序號。
(3)伺服器關閉客戶端的連線,傳送乙個fin給客戶端(報文段6)。
(4)客戶段發回ack報文確認,並將確認序號設定為收到序號加1(報文段7)。
如果是client端主動斷掉當前連線的話,那麼雙方關閉這個tcp連線共需要四個packet:
client ---> fin ---> server
client <--- ack <--- server
這時候client端處於fin_wait_2狀態;而server 程式處於close_wait狀態。
client <--- fin <--- server
這時server 傳送fin給client,server 就置為last_ack狀態。
client ---> ack ---> server
client回應了ack,那麼server 的套接字才會真正置為closed狀態。
server 程式處於close_wait狀態,而不是last_ack狀態,說明還沒有發fin給client,那麼可能是在關閉連線之前還有許多資料要傳送或者其他事要做,導致沒有發這個fin packet。
通常來說,乙個close_wait會維持至少2個小時的時間。如果有個流氓特地寫了個程式,給你造成一堆的 close_wait,消耗你的資源,那麼通常是等不到釋放那一刻,系統就已經解決崩潰了。
3、 為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?
這是因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的。
4、 為什麼time_wait狀態還需要等2msl後才能返回到closed狀態?
這是因為:雖然雙方都同意關閉連線了,而且握手的4個報文也都協調和傳送完畢,按理可以直接回到closed狀態(就好比從syn_send狀態到establish狀態那樣);但是因為我們必須要假想網路是不可靠的,你無法保證你最後傳送的ack報文會一定被對方收到,因此對方處於last_ack狀態下的socket可能會因為超時未收到ack報文,而重發fin報文,所以這個time_wait狀態的作用就是用來重發可能丟失的ack報文,並保證於此。
TCP IP協議三次握手與四次握手釋放
我們知道tcp建立連線要進行 三次握手 即交換三個分組。大致流程如下 只有就完了三次握手,但是這個三次握手發生在socket的那幾個函式中呢?請看下圖 圖1 socket中傳送的tcp三次握手 從圖中可以看出,當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connec...
TCP建立連線三次握手和釋放連線四次握手
尊重 在談及tcp建立連線和釋放連線過程,先來簡單認識一下 tcp報文段首部格式 的的幾個名詞 這裡只是簡單說明,具體請檢視相關教程 序列號seq 佔4個位元組,用來標記資料段的 順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生 給位元組編上序號後,就給每乙個...
TCP建立連線三次握手和釋放連線四次握手
尊重 在談及tcp建立連線和釋放連線過程,先來簡單認識一下tcp報文段首部格式 的的幾個名詞 這裡只是簡單說明,具體請檢視相關教程 序列號seq 佔4個位元組,用來標記資料段的順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生 給位元組編上序號後,就給每乙個報文...