TCP/IP三次握手和四次揮手

一 首先我們看下TCP報文頭


image.png

說明:
1 源端口號(16位):標識發(fā)送端端口號
2 目的端口號(16位):標識目的端口號
3 序列號:表示發(fā)送數(shù)據(jù)的位置,字段長為32位。每發(fā)送一次數(shù)據(jù),就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小
序列號并非從0開始,而是由發(fā)送端生成一個隨機數(shù)發(fā)送給目標機器,然后再將每轉(zhuǎn)發(fā)過去的字節(jié)數(shù)累加到初始值上表示數(shù)據(jù)的位置。
4 確認應答號:表示下一次應該收到的數(shù)據(jù)的序列號,字段長為32字節(jié)。發(fā)送端收到這個確認應答以后可以認為在這個序號以前的數(shù)據(jù)都已經(jīng)被正常接收。
PS:序號的優(yōu)點如下
(1)保證報文按序到達。
(2)保證可靠性。
(3)保證效率。
(4)精準的報告哪些報文已經(jīng)收到,哪些需要重傳
5 首部長度:該字段長度為4位,單位為4字節(jié)(32位)。TCP首部長度不包括選項的話,是20個字節(jié),20/4=5,5的二進制序列:0101,報頭長度也叫數(shù)據(jù)偏移,所以該字段可以設(shè)置為5,選項字段最大的是40字節(jié),所以,TCP首部長度為最大為20+40=60字節(jié),該字段可以設(shè)置的最大長度為60/4=15。
6 保留:該字段主要是為了以后擴展時使用,其長度為4位。一般設(shè)置為0,即使收到的包在該字段不為0,此包也不會丟棄
7控制位:字段長為6,每一位從左到右分別為:URG、ACK、PSH、RST、SYN、FIN。當對應的值為1,表示有具體含義。
字段|含義
—|:—
URG|緊急指針是否有效。為1,表示某一位需要被優(yōu)先處理。
ACK|確認號是否有效,一般置為1。
PSH|提示接收端應用程序立即從TCP緩沖區(qū)把數(shù)據(jù)讀走。
RST|對方要求重新建立連接,復位。
SYN|請求建立連接,并在其序列號的字段進行序列號的初始值設(shè)定。建立連接,設(shè)置為1.
FIN|希望斷開連接。
8 窗口大小:接收緩沖區(qū)的大小,TCP不允許發(fā)送超過此處所示大小的數(shù)據(jù)
9 校驗和:發(fā)送端填充,CRC校驗,接收校驗不通過,則認為數(shù)據(jù)有問題。和UDP的區(qū)別是,UDP校驗的是數(shù)據(jù)本身,TCP校驗的不僅包含TCP首部,而且包含TCP數(shù)據(jù)部分。
我們在著重講一下在三次握手和四次揮手中的用到序列號、確認號及標志位。

  1. 序列號seq
    占4個字節(jié),用來標記數(shù)據(jù)段的順序,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個序號,第一個字節(jié)的編號由本地隨機產(chǎn)生,給字節(jié)編上序號后,就給每一個報文段指派一個序號,序列號seq就是這個報文段中的第一個字節(jié)的數(shù)據(jù)編號。

  2. 確認號ack
    占4個字節(jié),期待收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號,序列號表示報文段攜帶數(shù)據(jù)的第一個字節(jié)的編號,而確認號指的是期望接受到下一個字節(jié)的編號,因此擋墻報文段最后一個字節(jié)的編號+1即是確認號。

3. 確認ACK

占1個比特位,僅當ACK=1,確認號字段才有效。ACK=0,確認號無效。

  1. 同步SYN
    連接建立時用于同步序號。當SYN=1,ACK=0表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使用SYN=1,ACK=1.因此,SYN=1表示這是一個連接請求,或連接接收報文,SYN這個標志位只有在TCP建立連接才會被置為1,握手完成后SYN標志位被置為0.

  2. 終止FIN
    用來釋放一個

6 TCP/IP 三次握手過程:


image.png

三次握手的過程
step1:第一次握手
建立連接時,客戶端發(fā)送SYN包到服務器,其中包含客戶端的初始序號seq=x,并進入SYN_SENT狀態(tài),等待服務器確認。(其中,SYN=1,ACK=0,表示這是一個TCP連接請求數(shù)據(jù)報文;序號seq=x,表明傳輸數(shù)據(jù)時的第一個數(shù)據(jù)字節(jié)的序號是x)。

step2:第二次握手
服務器收到請求后,必須確認客戶的數(shù)據(jù)包。同時自己也發(fā)送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài)。(其中確認報文段中,標識位SYN=1,ACK=1,表示這是一個TCP連接響應數(shù)據(jù)報文,并含服務端的初始序號seq(服務器)=y,以及服務器對客戶端初始序號的確認號ack(服務器)=seq(客戶端)+1=x+1)。

step3:第三次握手
客戶端收到服務器的SYN+ACK包,向服務器發(fā)送一個序列號(seq=x+1),確認號為ack(客戶端)=y+1,此包發(fā)送完畢,客戶端和服務器進入ESTAB_LISHED(TCP連接成功)狀態(tài),完成三次握手。

未連接隊列
在三次握手協(xié)議中,服務器維護一個未連接隊列,該隊列為每個客戶端的SYN包(syn=j)開設(shè)一個條目,該條目表明服務器已收到SYN包,并向客戶發(fā)出確認,正在等待客戶的確認包時,刪除該條目,服務器進入ESTAB_LISHED狀態(tài)

7 斷開連接TCP/IP


image.png

step1:第一次揮手
首先,客戶端發(fā)送一個FIN,用來關(guān)閉客戶端到服務器的數(shù)據(jù)傳送,然后等待服務器的確認。其中終止標志位FIN=1,序列號seq=u。

step2:第二次揮手
服務器收到這個FIN,它發(fā)送一個ACK,確認ack為收到的序號加一。

step3:第三次揮手
關(guān)閉服務器到客戶端的連接,發(fā)送一個FIN給客戶端。

step4:第四次揮手
客戶端收到FIN后,并發(fā)回一個ACK報文確認,并將確認序號seq設(shè)置為收到序號加一。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。

客戶端發(fā)送FIN后,進入終止等待狀態(tài),服務器收到客戶端連接釋放報文段后,就立即給客戶端發(fā)送確認,服務器就進入CLOSE_WAIT狀態(tài),此時TCP服務器進程就通知高層應用進程,因而從客戶端到服務器的連接就釋放了。此時是“半關(guān)閉狀態(tài)”,即客戶端不可以發(fā)送給服務器,服務器可以發(fā)送給客戶端。
此時,如果服務器沒有數(shù)據(jù)報發(fā)送給客戶端,其應用程序就通知TCP釋放連接,然后發(fā)送給客戶端連接釋放數(shù)據(jù)報,并等待確認。客戶端發(fā)送確認后,進入TIME_WAIT狀態(tài),但是此時TCP連接還沒有釋放,然后經(jīng)過等待計時器設(shè)置的2MSL后,才進入到CLOSED狀態(tài)。

2.為什么需要2MSL時間?
首先,MSL即Maximum Segment Lifetime,就是最大報文生存時間,是任何報文在網(wǎng)絡(luò)上的存在的最長時間,超過這個時間報文將被丟棄。《TCP/IP詳解》中是這樣描述的:MSL是任何報文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長時間。RFC 793中規(guī)定MSL為2分鐘,實際應用中常用的是30秒、1分鐘、2分鐘等。

TCP的TIME_WAIT需要等待2MSL,當TCP的一端發(fā)起主動關(guān)閉,三次揮手完成后發(fā)送第四次揮手的ACK包后就進入這個狀態(tài),等待2MSL時間主要目的是:防止最后一個ACK包對方?jīng)]有收到,那么對方在超時后將重發(fā)第三次握手的FIN包,主動關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個ACK應答包。在TIME_WAIT狀態(tài)時兩端的端口不能使用,要等到2MSL時間結(jié)束才可以繼續(xù)使用。當連接處于2MSL等待階段時任何遲到的報文段都將被丟棄。

3.為什么是四次揮手,而不是三次或是五次、六次?
雙方關(guān)閉連接要經(jīng)過雙方都同意。所以,首先是客服端給服務器發(fā)送FIN,要求關(guān)閉連接,服務器收到后會發(fā)送一個ACK進行確認。服務器然后再發(fā)送一個FIN,客戶端發(fā)送ACK確認,并進入TIME_WAIT狀態(tài)。等待2MSL后自動關(guān)閉。

總結(jié):
(1)為了保證客戶端發(fā)送的最后一個ACK報文段能夠到達服務器。即最后一個確認報文可能丟失,服務器會超時重傳,然后服務器發(fā)送FIN請求關(guān)閉連接,客戶端發(fā)送ACK確認。一個來回是兩個報文生命周期。

如果沒有等待時間,發(fā)送完確認報文段就立即釋放連接的話,服務器就無法重傳,因此也就收不到確認,就無法按步驟進入CLOSED狀態(tài),即必須收到確認才能close。
(2)防止已經(jīng)失效的連接請求報文出現(xiàn)在連接中。經(jīng)過2MSL,在這個連續(xù)持續(xù)的時間內(nèi),產(chǎn)生的所有報文段就可以都從網(wǎng)絡(luò)消失。

源文章地址:https://blog.csdn.net/ZWE7616175/article/details/80432486 轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容