TCP的三次握手和四揮手的3和2MSL

2021-08-20 15:13:06 字數 1363 閱讀 4118

**:

1.tcp為甚要3次握手?

在謝希仁著《計算機網路》第四版中講「三次握手」的目的是「

為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤

」,書中的例子是這樣的,「已失效的連線請求報文段」的產生在這樣一種情況下:client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。

本來這是乙個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的乙個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用「三次握手」而是「兩次握手」,那麼只要server發出確認,新的連線就建立了。

由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。

採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。說白了主要目的是防止server端一直等待,浪費資源。

2.四次揮手時為什麼要等待2msl?

和tcp三次同步握手不一樣的是,tcp關閉連線用四次握手來實現,即a--->b fin, b--->a ack, b--->a fin, a--->b ack,為什麼要這樣?

a--->b fin, b--->a ack ,a屬於主動關閉方,收到b的ack後,a到b的方向連線關閉,即half shutown ,這時a不能再傳送資料了。

這種狀態下b還是可以單向傳送資料的,b的資料傳送完畢,也做關閉動作了:

b--->a fin, a--->b ack

b收到ack,關閉連線。但是a無法知道ack是否已經到達b,於是開始等待?等待什麼呢?假如ack沒有到達b,b會為fin這個訊息超時重傳 timeout retransmit ,那如果a等待時間足夠,又收到fin訊息,說明ack沒有到達b,於是再傳送ack,直到在足夠的時間內沒有收到fin,說明ack成功到達。這個等待時間至少是:b的timeout + fin的傳輸時間,為了保證可靠,採用更加保守的等待時間2msl。

msl,maximum segment life,這是tcp 對tcp segment 生存時間的限制。

ttl, time to live ,ip對ip datagram 生存時間的限制,255 秒,所以 msl一般 = ttl = 255秒

a發出ack,等待ack到達對方的超時時間 msl,等待fin的超時重傳,也是msl,所以如果2msl時間內沒有收到fin,說明對方安全收到fin。

綜上所述,等待2msl的目的是為了a最後傳送的ack能最終到達b端。

TCP的三次握手和四次揮手

1.建立連線 三次握手 1 客戶端傳送乙個syn包給伺服器,然後等待應答。2 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料段。3 客戶必須再次回應伺服器端乙個ack確認資料段。2.釋放連線 四次揮手 1 tcp客戶端傳送乙個fin,關閉客戶端到伺服器端的資料傳送。客戶端不再傳送報文給伺...

TCP的三次握手和四次揮手

三次握手 tcp連線是通過三次握手來連線的。第一次握手 當客戶端向伺服器發起連線請求時,客戶端會傳送同步序列標號syn到伺服器,在這裡我們設syn為m,等待伺服器確認,這時客戶端的狀態為syn sent。第二次握手 當伺服器收到客戶端傳送的syn後,伺服器要做的是確認客戶端傳送過來的syn,在這裡伺...

TCP的三次握手和四次揮手

tcp實現可靠的傳輸,是靠seq確認完成的。tcp傳送資料,既要保證資料的可靠傳輸,還要保證資料的傳輸效率,而用三次握手恰恰能夠滿足可靠和效率的需求。第一次握手 client端向server端傳送請求報文段 意思是,我要向你傳送資料了,問server端是否可以收到呢?第二次握手 server端收到c...