超詳細解釋什麼是三次握手,四次揮手!看完不會你來打我

最近可能是和網絡幹上了,就想寫一點兒和網絡有關的東西。
今天給大家講一講什麼是三次握手和四次揮手。

在tcp/ip四層協議中,將網絡通信模型劃分爲四層,分別是應用層,傳輸層,網絡層,網絡訪問層。今天我們要說的這個,位於傳輸層中。
tcp協議在傳輸層中可謂是家喻戶曉的協議,它是一種面向連接的穩定的傳輸協議,既然他面向連接,那麼,在我們使用和結束時,肯定要進行連接的創建和關閉。
而我們的三次握手,就是發生在tcp協議的連接時。我們首先來說幾個英文單詞,哦,不對,應該是英文單詞的縮寫。
SYN : Synchronization : 同步
Seq : Sequence : 序列
Ack : Acknowledgment : 答覆
Fin :Finish:結束

看到這裏肯定有暴躁的看官老爺要問了,媽的,不好好講主題,說這幾個英文單詞有什麼用
而我也知道,如果今天不給一個令人滿意的答覆是不可能活着走出去的, 聽我細細到來

下面掛上一張我從網上偷來的圖
在這裏插入圖片描述
如圖所示是一個tcp的報文結構,下面一邊聽我說,一邊看看圖,會很快理解的。
圖中的32位序號我們使用小寫seq來表示,32位確認序號使用ack來表示
而SYN,ACK標誌位就用它們本身的大寫字母來表示,大家可千萬不要搞混了。

接下來就是大家最喜歡的名詞解釋環節

名詞解釋

seq(小寫) : 大家都知道,TCP是一種面向連接的、可靠的基於字節流服務,而保證數據傳輸時的順序性,就是它可靠性的一個重要體現。而我們tcp就是通過給每一個報文加上seq序列號來進行順序的判斷。另外,要注意一下,序號是建立在傳送的字符流之上的,而不是建立在傳送的報文段的序列之上,也就是說,假如說報文段A是位於報文段B的相鄰前方的一個報文端, 報文段A有1000個字節,並且A的序列號爲1,那麼報文段B的序列號就爲1001,各位看官老爺細細品味其中的玄機。
** ack ** : 代表了服務器端期望接收的下一個序號是多少,所以你看下面會發現服務器端返回的ack的值永遠比客戶端發送的seq大
ACK(大寫) : 大家可以看到上圖中那幾個豎着的大寫英文字母,一共有六組,TCP報文端的首部有六個比特位,分別對應六個標誌,上面6組英文字母就對應着六個標誌,ACK就是其中之一,當它的值爲1的時候,就代表某一方已經接受到了請求。
** SYN **(大寫) : 六個標誌位之一,代表是一個建立連接的請求。

三次握手

我們的客戶端(請求資源)和服務器端(發送資源)的建立連接是通過三次數據包的發送,所以我們形象的將其稱爲三次握手。

First

第一次發送時,由客戶端向服務器端發送包,其中SYN標誌位的值爲1(表示是一個同步的請求,也就是說,代表了這是一個客戶端希望和服務器端建立連接的請求)。ACK的值肯定爲0啦,然後將發送序號設置爲一個隨機生成的隨機數X,這裏假設爲1000。客戶端隨及進入了SYN發送狀態。

Second

第二次發送的時候,是服務器像客戶端發送包,SYN和ACK兩個標誌位都爲1,發送序列號Y(同樣是隨機生成的),確認序號爲1001(確認序號是在第一次發送包的發送序號基礎上加上一個數字,爲了方便解釋,這裏就記爲1)。從此刻開始,服務器進入了同步(SYN)接收狀態。

Final

第三次發送,客戶端將服務端發送的SYN和ACK包接收到後,返回ACK包代表確認, 接受序列號爲Y + 1, 從此以後,客戶端和服務端就都進入了連接建立狀態,三次握手完畢。可喜可賀,可喜可賀。

小小的彩蛋

爲什麼是三次握手,兩次握手不可以嗎?

既然人家都叫做是三次握手了,肯定這麼做是更好的了。。。。別衝動,,各位看官老爺將手中的刀放下,聽我慢慢道來。當我們通過兩次握手就可以建立連接時,客戶端向服務端發送了連接請求A,但因爲網絡延遲,在服務端還沒有收到這次請求的時候,客戶端着急的發了第二次連接請求,這次連接成功了,大家心滿意足的完成了不爲人知的交易後,連接A這時卻發給了服務端,服務端進行確認,但是客戶端已經將延遲的請求做無效的處理了,所以,服務端會向牛郎等織女一樣,這無疑會耗費我們服務端很多的資源,並且除了以上情況還有可能造成"死鎖",因爲篇幅問題,這裏不加敘述了,感興趣的客觀老爺可以自行百度。

當我們的連接建立後,客戶端出現故障怎麼辦?

當我們的客戶端和服務端正在進行愉快的交易時,客戶端突然出現故障,無法繼續發送數據,這時,服務端不會立即停止交易,而是會在小段時間內,規定次數之內進行報文探測,依然得不到迴應的話,纔會關閉連接。

四次揮手

First

客戶端發送FIN+ACK請求表示請求結束連接

Second

服務器端接收到客戶端的請求,返回ACK表示收到請求,並讓客戶端繼續等待自己將自己所有的數據發送完畢。

Third

服務端的數據發送完畢後,會向客戶端發送FIN + ACK,表示這邊數據已經發送完畢了。

final

客戶端向服務器發送ACK,表示接收到了,然後服務器就放心的關閉了,然後客戶端會等待一會兒,如果沒有任何回覆的話,就認爲服務器已經關閉了,自己也就關閉了。

到此爲止,四次揮手也完畢。。。。可喜可賀,可喜可賀

又到了和看官老爺告別的時候了
最後,小鯊祝大家萬事如意,身體健康,天天有水果喫!!!

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