TCP三次握手和四次揮手

     如果你讀到這篇博客,這個絕對是最容易懂的TCP三次握手和四次揮手,今天面試被問到了TCP三次握手和四次揮手,沒有回答上來,回來查了很多資料,現在總算有點眉目,將自己對TCP的理解寫下來。

一.TCP數據結構介紹

原端口號:表示客戶端發送這個tcp報文程序的通信端口號。

目的端口:表示服務端接受這個tcp報文程序的通信端口號。

序號:可以看作是這個tcp報文的唯一id。

確認序號:可以看作是接收方接受下一個tcp報文的序列號。發送方發送一個確認編碼給接收方,接收方收到這個確認編碼後會驗證這個報文是不是我想要的,如果是就接受,不是就丟棄。所以這個確認編碼是給接收方使用的。

ACK:確認標誌,如果是1的話,表示你上次發給我的報文我已經接收到了。

SYN:建立連接的標誌,如果是1的話,表示我想和你建立連接。

FIN:關閉連接的標誌,如果是1的話,表示我想和你斷開連接。

二.三次握手

1.客戶端發送第一次請求,SYN=1,seq=J,seq表示這個報文的id=J,SYN=1就是告訴服務端我想和你建立連接。

2.服務端接收到請求後發送SYN=1,ACK=1,ack=J+1,seq=K,seq=K表示服務端發送的這個報文id是K,ACK=1表示你上次發給我的報文我已經確認接受了,ack=J+1表示我接受到你上一個報文的證據,確認號表示接受端向發送端確實接收到你發的報文了。

3.客戶端收到服務端的請求後,要表示我已經知道你答應和我建立連接了,所以會發送一個報文,發送的seq=J+1,ACK=1,ack=K+1,表示這個報文的id是seq=J+1,ACK表示我確認接受到你答應接受連接的消息,ack=K+1表示這就是我接受到的證據,這一步沒有SYN=1,因爲到這裏不再是發起連接了,而只是表示確認連接了。

這裏的確認號的編碼爲什麼都是加一,那是因爲連接報文和確認報文的所佔的大小都是1。

如果沒有第三步,客戶端不給服務端發知道服務端答應接受連接的消息會怎麼樣,假設客戶端第一次發送的請求由於網絡延遲,很晚才被服務端接收到,服務端收到消息後表示自己願意接受你的請求,這個時候由於中間時間過得太久了,所以客戶端已經放棄這次連接了,客戶端在接受到服務端發來的請求的時候,但是客戶端這個時候沒有發送給服務端的連接請求所以不予理睬,這個時候服務端就一直等待着客戶端發消息過來,這樣會浪費大量的服務端資源。

三.四次揮手

第一步:客戶端向服務端發送斷開連接的請求,這個請求是客戶端不再向服務端發送消息了,seq=u,FIN=1,ACK=1,seq是u表示這次報文的編碼,ACK=1表示你服務端上次發送給我客戶端的數據我已經接收到了,FIN=1,表示這次我要和你斷開連接。

第二步:服務端接收到客戶端發過來斷開連接的消息後,斷開客戶端和服務端的連接,然後告訴客戶端,客戶端到服務端的連接已經斷開了,怎麼告訴呢,ACK=1,FIN=0,ack=u+1,ACK=1表示你發送斷開連接的消息我已經接受到了,FIN=0表示我現在還不想和你斷開,只是你和我斷開了,但是我和你還沒有斷開,我還可以繼續給你發消息,ack=u+1表示我接收到你斷開消息的證據。

第三步:服務器向客戶端發送斷開的消息,這個請求是服務端不再向客戶端發送消息了,seq=w,FIN=1,ACK=1,seq是w表示這次報文的編碼,ACK=1表示你客戶端上次發送給我服務端的數據我已經接收到了(感覺這裏不需要了,因爲上次服務端確認斷開的時候,已經發送了),FIN=1,表示這次服務端要和客戶端斷開連接。

第四步:客戶端ACK=1,FIN=0,ack=w+1,客戶端接受到服務端發過來要求斷開服務端和客戶端連接的請求後,已經斷開,然後發送消息給服務端,你和我之間的連接已經斷開了,ACK=1表示確認,ack=w+1表示我接受到你請求確認的證據。

這裏可能有點繞,客戶端和服務端是雙向連接的,客戶端連接服務端,服務端連接客戶端,如果只有客戶端連接服務端這一條線的話,客戶端可以發送消息給服務端,但是客戶端收不到消息被接受的確認消息了。

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