TCP三次握手和四次揮手以及拓展(幫助理解)

TCP建立和斷開連接

圖片來源:https://blog.csdn.net/qq_36520235/article/details/82894126#commentBox

TCP三次握手

![TCP三次握手](https://img-blog.csdnimg.cn/20190907165522743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hlbmdUaWFuX3JlYWw=,size_16,color_FFFFFF,t_

TCP四次揮手

在這裏插入圖片描述

MSL:報文段最大生存時間,通常MSL的常用值爲30秒,1分鐘,2分鐘
握手與揮手在下面描述,請不要走開

爲什麼要等待2MSL的時間?

自己YY的:因爲服務端發送FIN信號之後,開始等待客戶端發來的確認信息,客戶端在接收到之後,開始發送報文段給服務端,而最大報文壽命(生存時間)是也就是MSL內之後,如果服務器沒收到,說明這個包肯定丟失了,所以就可以給客戶端重發請求,此時客戶端正好處於1MSL~2MSL等待時間之間,正好可以重發一次,我真是個天才

爲什麼建立連接是三次握手,斷開連接卻要四次揮手

TCP頭部分析
剛開始客戶端已經準備好了之後給服務端發送一個seq序號)=u,SYN=1說明自己來意:我想建立連接!
服務端收到後,已經知道客戶端準備好了接收數據了,就將確認信號ACK設置爲1,確認收到客戶端數據的信號ack=u+1(我收到了你的數據,下一次請從u+1開始發),自己要發的信號seq=w(我要發數據的起始位置)給客戶端,說明自己接收到了數據,並要建立連接給客戶端發數據~
客戶端再確認一遍(ACK=1,seq=u+1,ack=w+1),連接就建立起來了

而斷開連接時,客戶端發送FIN=1,seq=u(最後的數據)信號來說明來意,表示自己不會再發信號給服務端,服務端發送確認信號,說你的數據我收到了ack=u+1,確認關閉連接ACK=1,然後把自己的數據附帶上seq=w,客戶端接收到之後,知道服務器已經收到,便關閉了寫連接,因爲自己沒什麼發的了,但是還是可以收數據的,等服務器把數據發完之後,向客戶端發送FIN=1,seq=y表示這是最後的數據了,客戶端收到之後,確認,但是又不放心服務端是不是能收到,於是說:我的信息發給你要一分鐘,那我就等個兩分鐘看看你有沒有真的收到,如果沒收到肯定是要再給我發的,服務器也心中有數了:你的確認我最多一分鐘就收到了,我要是等一分鐘沒收到,發的東西肯定丟失了,我就再給你發一次FIN,就這樣,客戶端等了2MSL之後纔會關閉連接,如果服務器沒收到,客戶端也仁至義盡了,莫得辦法

咳咳,回到正題,多出來的這一次就是握手時 服務端將ACK和seq(相當於建立連接的意思吧)一起給了客戶端,因爲它知道客戶端已經準備好了接收信息了,而斷開時 將ACK和FIN分開了,因爲服務端如果有東西還可以繼續發。

握手:客戶端請求建立 -> 服務器確認建立+請求建立 -> 客戶端確認建立

揮手:客戶端請求關閉 -> 服務器確認關閉 -> 服務器確認關閉-> 客戶端確認關閉

簡化版握手+揮手

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章