UNP學習筆記五 TCP四次揮手終止

2021-08-19 17:27:50 字數 2225 閱讀 9130

(五)tcp四次揮手終止

(1)四次握手過程

假設主機a為客戶端,主機b為伺服器,其釋放tcp連線的過程如下:

1) 關閉客戶端到伺服器的連線:首先客戶端a傳送乙個fin,用來關閉客戶到伺服器的資料傳送,然後等待伺服器的確認。其中終止標誌位fin=1,序列號seq=u

2)伺服器收到這個fin,它發回乙個ack,確認號ack為收到的序號加1。

3) 關閉伺服器到客戶端的連線:也是傳送乙個fin給客戶端。

4)客戶段收到fin後,並發回乙個ack報文確認,並將確認序號seq設定為收到序號加1。

首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

主機a傳送fin後,進入終止等待狀態, 伺服器b收到主機a連線釋放報文段後,就立即給主機a傳送確認,然後伺服器b就進入close-wait狀態,此時tcp伺服器程序就通知高層應用程序,因而從a到b的連線就釋放了。此時是「半關閉」狀態。即a不可以傳送給b,但是b可以傳送給a。

此時,若b沒有資料報要傳送給a了,其應用程序就通知tcp釋放連線,然後傳送給a連線釋放報文段,並等待確認。a傳送確認後,進入time-wait,注意,此時tcp連線還沒有釋放掉,然後經過時間等待計時器設定的2msl後,a才進入到close狀態。

(2)為什麼要等待2msl呢?

msl即maximum segment lifetime,也就是最大報文生存時間,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。引用《tcp/ip詳解》中的話:「它(msl)是任何報文段被丟棄前在網路內的最長時間」。rfc 793中規定msl為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

tcp的time_wait狀態需要等待2msl,當tcp的一端發起主動關閉,在發出最後乙個ack包後,即第3次握手完成後傳送了第四次握手的ack包後就進入了time_wait狀態,必須在此狀態上停留兩倍的msl時間,等待2msl時間主要目的是怕最後乙個ack包對方沒收到,那麼對方在超時後將重發第三次握手的fin包,主動關閉端接到重發的fin包後可以再發乙個ack應答包。在time_wait狀態時兩端的埠不能使用,要等到2msl時間結束才可繼續使用。當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設定so_reuseaddr選項達到不必等待2msl時間結束再使用此埠。

概括原因如下:

①、為了保證a傳送的最後乙個ack報文段能夠到達b。即最後這個確認報文段很有可能丟失,那麼b會超時重傳,然後a再一次確認,同時啟動2msl計時器,如此下去。如果沒有等待時間,傳送完確認報文段就立即釋放連線的話,b就無法重傳了(連線已被釋放,任何資料都不能出傳了),因而也就收不到確認,就無法按照步驟進入close狀態,即必須收到確認才能close。

②、防止「已失效的連線請求報文段」出現在連線中。經過2msl,那些在這個連線持續的時間內,產生的所有報文段就可以都從網路中消失。即在這個連線釋放的過程中會有一些無效的報文段滯留在樓閣結點,但是呢,經過2msl這些無效報文段就肯定可以傳送到目的地,不會滯留在網路中。這樣的話,在下乙個連線中就不會出現上乙個連線遺留下來的請求報文段了。

可以看出:b結束tcp連線的時間比a早一點,因為b收到確認就斷開連線了,而a還得等待2msl。

(3)為什麼tcp釋放連線需要四次?

tcp建立連線要進行三次握手,而斷開連線要進行四次。這是由於tcp的半關閉造成的。因為tcp連線是全雙工的(即資料可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉。這個單方向的關閉就叫半關閉。當一方完成它的資料傳送任務,就傳送乙個fin來向另一方通告將要終止這個方向的連線。

注意:

1)傳送了fin只是表示這端不能繼續傳送資料(應用層不能再呼叫send傳送),但是還可以接收資料。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料,比如:如主機a收到主機b的fin斷開tcp連線請求,只是表示主機b已經傳送完資料,主機a收到fin後作出應答,並終止這個方向的資料傳輸,此時處於半關閉狀態。但是主機a仍然可以傳送資料的,只有當主機a傳送完資料並傳送fin給主機b時,主機b才停止這個方向的資料傳輸,並關閉tcp連線。

2)在很多時候,tcp連線的斷開都會由tcp層自動進行,例如你ctrl+c終止你的程式,tcp連線依然會正常關閉,你可以寫**試試。

參考<

tcp 四次揮手 TCP四次揮手

tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...

TCP四次揮手

純給自己看的 發起關閉的一方是客戶端,被動關閉的一方是伺服器。1 客戶端a傳送乙個fin 1,用來關閉客戶a到伺服器b的資料傳送。圖上畫的對,還有乙個seq n 2 伺服器b收到這個fin,它發回乙個ack 1,確認序號ack為收到的序號加1。3 伺服器b關閉與客戶端a的連線,傳送乙個fin 1給客...

TCP四次揮手

四次揮手 1.客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin 1,其序列號為seq u 等於前面已經傳送過來的資料的最後乙個位元組的序號加1 此時,客戶端進入fin wait 1 終止等待1 狀態。tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。2.伺服器收到連線釋...