TCP連線的建立與關閉(三次握手與四次揮手)

2021-08-19 04:47:49 字數 1593 閱讀 9336

當乙個http請求發出後,首選需要建立client和server之間的tcp連線,連線過程需要「三次握手」。

1、client傳送syn=1給server,client進入syn_send;

2、server傳送syn=1,ack=1給client,server進入syn_recv;

3、client傳送ack=1給server。

到此,client進入established狀態,server收到ack資料報後也進入established狀態。

關於為什麼不可以兩次握手?

這個主要原因是考慮出現失效的請求資料報的情況。如果client第一次傳送的連線請求因為網路延遲等原因,未能及時送到伺服器,client會再次傳送一次,假設這一次正常傳送,server正常響應,client收到了請求資料,然後關閉了這一次的連線,那麼一次tcp連線就完成了。

如果第一次的請求恰好在這個階段到了server(其實早就失效了的),它會已經是client又重新發了一次,於是再次將請求的資料發給client,但是呢,client根本不會理會,所以server就會一直苦苦的等待client回應,造成server的資源浪費。所以,兩次握手會造成建立兩次連線,造成沒必要的錯誤與資源占用。

當乙個http請求完成後,需要關閉tcp連線,關閉過程需要「四次揮手」。(client和server都可以作為主動關閉方)

假設client主動關閉連線

1、client需要的請求報文傳送完畢之後,會主動傳送fin報文給server,發起關閉連線,表示自己已經沒有資料需要傳送給對方了,該發的都發了,可以關閉了。client進入fin_wait_1

狀態,坐等釋放連線。(我做完作業了,我們去吃飯吧)

2、server傳送ack報文給client,進入close_wait,表示你發起的關閉請求我方已經收到,但我還要等會。這時候有可能它給client的還沒發完,所以server還不能立刻關閉,要等會。client進入fin_wait_2階段,繼續坐等關閉。(啊,你都弄完了啊,那什麼,你等會我,我還有點沒做完。)

3、等server處理完所有資料,就會發乙個fin報文給client,進入last_ack階段,表示我也給你發完了,我們散了吧。(我也做完了,我們走吧,說完立刻下樓。)

4、client收到fin,需要等接收完發過來的資料後,傳送ack給server,進入time_wait。

server

收到ack就立刻

closed。

但是,考慮到server可能因為網路延時等原因沒有收到這個ack,導致對方一直等待,所以client會等30s(2msl,最長報文壽命),如果沒出現問題,就closed了。(走吧,心想要是對方沒收到我的確認,肯會再問一遍,所以過了2msl才下樓。)

關於為什麼是四次不是三次?

server的ack和fin兩次報文是分兩次傳送的,因為傳送ack後,只是確認知道對方發完了,自己可能還有資料沒發完。

關於為什麼最後要等待2msl?

client要確保最後的ack被server接收。因為如果server沒有收到,它會再發一次fin請求釋放連線,這時client會再次回應ack,同時重啟2msl計時。這個過程一般認為是2msl時長。

三次握手 TCP建立連線

在tcp ip 中,tcp協議提供可靠的連線服務 採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端 傳送syn 包 syn j 到伺服器 並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次握手 伺服器 收到syn...

TCP連線建立(三次握手)

為了建立一條tcp連線,計算機需要為我們做如下的工作 1.請求端 通常稱為客戶 傳送乙個syn段指明客戶打算連線的伺服器端口,以及初始序號 isn 這個syn段為下面的uml中的報文段1。2.伺服器發回包含伺服器的初始序號的syn報文段 下面uml圖中的報文段2 作為應答。同時,將確認序號設定為客戶...

建立TCP連線的三次握手

伺服器發回包含伺服器的初始順序號 isn 的 syn 報文段 syn 為 1 作為應答。同時,將確認號設定為客戶的 isn 加 1 以對客戶的 syn 報文段進行確認 ack 也為 1 客戶必須將確認號設定為伺服器的 isn 加 1 以對伺服器的 syn 報文段進行確認 ack 為 1 該報文通知目...