請問 TCP 斷開連線為何比建立連線多一次握手?

時間 2021-05-11 14:56:07

1樓:薄荷紅茶

回答這個問題,咋們發散思維下。假如tcp握手是四次,即syn, ack, syn, ack。

客戶端首先傳送syn,告訴伺服器,建立乙個從客戶端到伺服器的連線。

伺服器收到資料後,根據確認機制,需要回覆ack(不是syn/ack),表示收到對方的syn包。

按道理,這時候客戶端就可以往伺服器傳送資料了,因為這個方向的連線解決起來了。

但真實情況,這時候是不允許的,為何呢?賣個關子先。

接著講握手,上面客戶端通過syn建立好了客戶端到伺服器的連線。伺服器也想建立到客戶端的連線,咋整?

簡單,伺服器也傳送syn到客戶端,客戶端收到回覆ack。

此時,伺服器就可以通過此方向的連線,往客戶端傳送資料了。

到這裡,好像四次握手,也可以解決客戶端和伺服器的互相收發資料的需求。

但仔細想想,這樣的收發資料,其實是通過兩個連線完成的,此時的連線是單工的。

而tcp是希望建立乙個雙工的連線,在乙個連線上,解決資料收發的問題。

那怎麼把這兩個單工的連線合併成乙個雙工的連線呢?

tcp給出的方法就是,把中間ack和syn合在一起,組成syn/ack。

這樣子,在雙工的連線沒有建立起來時,不給任何乙個方向傳資料。建立起來後,無論客戶端還是伺服器,都可以收發資料。

這才是符合雙工的要求嘛,前面的疑問也就好理解了。

總結一句話,tcp握手為啥是三次,是因為tcp的連線是雙工的。

同樣的道理,tcp揮手是四次。

假如tcp揮手是三次,fin,fin/ack,ack。現實中是存在的,有時候三次,有時候四次。為何呢?

首先fin是用於關閉從本端到對端的連線,表示本端沒有資料給對端了。

對端收到該fin後,會回覆ack,這是tcp確認機制的要求。

這時候,本端是不能傳送資料給對端,但對端仍然可以發資料給本端。

等對端沒資料給本端時,也傳送給fin給本端,關閉從對端到本端的連線。

本端收到對端的fin後,回覆ack。

到這裡,經過四次揮手,雙工的tcp連線才完全關閉。

還有一種情況,本端要關閉到對端連線,傳送fin給到對端時,剛好對端也沒資料給本端,對端就回覆fin/ack了。而是,四次揮手變成三次了。

這也好理解,你沒話跟我說(沒資料給我),我既可以有話跟你講(有資料給你),也可以對你無言(無資料給你),選擇權在我(回覆ack還是fin/ack,我說了算)。

綜上,握手一定是三次,揮手既可以是三次,也可以是四次,當然一般都是說四次揮手,沒必要咬文嚼字,知道就好。

2樓:南盼

因為在建立連線之前。誰是連線發起方(客戶端),誰是接收方(接收方)是確定的。必然是客戶端發起,服務端接受。

而在斷開連線之前。並不能確定哪邊是斷連的發起方,客戶端和服務端都有可能發起斷連。多出來的這次握手就是來協調這件事的

3樓:微峰清雨

TCP通過「四次揮手」拆除連線。

假設電腦A傳送資料給電腦B,電腦A已將全部資料傳送完畢,則「四次揮手」過程為:

第一次揮手,電腦A傳送拆除連線請求(FIN=1);

第二次揮手,電腦B收到請求後,需要做個收尾,比如緩衝區中還有資料沒有處理完。為避免對端超時,傳送ACK=1對電腦A的請求進行確認,意思是「你的請求我收到了,但我還沒處理完,稍等一下下哦」;

第三次揮手,電腦B處理完成,收尾結束,向電腦A傳送拆除連線請求(FIN=1),意思是「我OK了,可以拆除了」;

第四次揮手,電腦A收到後,向電腦B回覆ACK=1,意思是「收到,可以拆除」。

電腦B收到第四次揮手報文後,立即拆除連線。電腦A發出第四次揮手報文後,經過2倍MSL時間後,拆除連線。

MSL(Maximum Segment Lifetime,最大報文段生存時間),不同作業系統預設值也不同。

Windows系統,MSL預設為120秒;

Linux系統,MSL預設為60秒。

既然是「預設」,那就可以改。怎麼改就不在這兒說了,感興趣自己查查。

電腦A為什麼要等待2MAL時間,而不是發出第四次揮手後就立即拆除呢?

電腦A發出第四次揮手報文後,立即拆除連線。可是,如果這個報文丟失,電腦B就收不到了。電腦B遲遲收不到確認回覆,經過RTO超時後會重傳第三次揮手報文,然而,此時的電腦A已經拆除連線,不會再發ACK確認,而電腦B則會不停地超時重傳,無法拆除連線!

當然,四次揮手是很佛系的正常拆除。實際上我們常常會遇到不正常拆除,比如斷網了,或者把應用程式強行關閉了,等等。不正常拆除會通過RST拆除重連,或者通過TCP的保持計時器處理。

通訊雙方如果收到對方的任意報文,都會重置保持計時器。如果長時間沒收到對端的訊息,保持計時器超時後,會每隔75秒傳送探測報文給對方,傳送10次後還沒有收到對方回覆,則拆除連線。

TCP建立連線後會一直保持連線狀態嗎?

從理論上講,開啟TCP IP連線需要3次握手,關閉連線需要4次揮手。但是,只要建立了連線,如果任何一方都沒有傳送任何資料 資料報停止傳送 連線可以永遠保持開放的狀態。TCP是乙個空閒的協議,它假設所有的連線處於活動狀態。直到後來證明不是如此。TCP這麼設計是希望提高彈性和效率,這種設計能夠從不穩定的...

如何解決長城寬頻主動斷開tcp長連線的問題?

鶴83 你用長寬線路和你的伺服器傳輸資料,不超過5M頻寬說明該阿里雲IP沒有接入長城寬頻線路,換多幾個阿里雲IP,再不行可以換區域試試。 只能打長寬客服轉機房網管做白名單解決。TCP IP協議下,出口路由的埠只有65536個,長寬乙個出口路由下內網使用者太多,為了不讓高峰時長鏈結佔滿了出口路由埠,埠...

TCP建立連線過程為什麼會有4個包?

攻城獅 另外,關於圖示顯示的第四個包的問題。這個包不屬於握手階段,但因為ack是對方seq 1,這一點容易被認為屬於握手階段。因為window size有改變 變大 應該是通知作用的視窗更新包。視窗更新包可以是跟隨包含payload的TCP segment一起發 也就是在包含payload的包的wi...