動畫:用動畫給面試官解釋 TCP 三次握手過程

一隻不甘平凡的小鹿發表於2019-10-12

在這裡插入圖片描述
作者 | 小鹿
來源 | 公眾號:小鹿動畫學程式設計


寫在前邊

TCP 三次握手過程對於面試是必考的一個,所以不但要掌握 TCP 整個握手的過程,其中有些小細節也更受到面試官的青睞。

對於這部分掌握以及 TCP 的四次揮手,小鹿將會以動畫的形式呈現給每個人,這樣將複雜的知識簡單化,理解起來也容易了很多,尤其對於一個初學者來說。


學習導圖

在這裡插入圖片描述

一、TCP 是什麼?

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

我們知道了上述瞭解到了 TCP 的定義,通俗一點的講,TCP 就是一個雙方通訊的一個規範標準(協議)。

我們在學習 TCP 握手過程之前,首先必須瞭解 TCP 報文頭部的一些標誌資訊,因為在 TCP 握手的過程中,會使用到這些報文資訊,如果沒有掌握這些資訊,在學習握手過程中,整個人處於懵逼狀態,也是為了能夠深入 TCP 三次握手的原理。


二、TCP 頭部報文

在這裡插入圖片描述

2.1 source portdestination port

兩者分別為「源埠號」和「目的埠號」。源埠號就是指本地埠,目的埠就是遠端埠。

一個資料包(pocket)被解封裝成資料段(segment)後就會涉及到連線上層協議的埠問題。

可以這麼理解,我們可以想象傳送方很多的窗戶,接收方也有很多的窗戶,這些視窗都標有不同的埠號,源埠號和目的埠號就分別代表從哪個規定的串列埠傳送到對方接收的視窗。不同的應用程度都有著不同的埠,之前網路分層的文章中有提到過。
在這裡插入圖片描述

擴充套件:應用程式的埠號和應用程式所在主機的 IP 地址統稱為 socket(套接字),IP:埠號, 在網際網路上 socket 唯一標識每一個應用程式,源埠+源IP+目的埠+目的IP稱為”套接字對“,一對套接字就是一個連線,一個客戶端與伺服器之間的連線。


2.2 Sequence Numbe

稱為「序列號」。用於 TCP 通訊過程中某一傳輸方向上位元組流的每個位元組的編號,為了確保資料通訊的有序性,避免網路中亂序的問題。接收端根據這個編號進行確認,保證分割的資料段在原始資料包的位置。

在這裡插入圖片描述
再通俗一點的講,每個欄位在傳送中用序列號來標記自己位置的,而這個欄位就是用來完成雙方傳輸中確保欄位原始位置是按照傳輸順序的。(傳送方是資料是怎樣一個順序,到了接受方也要確保是這個順序)

PS:初始序列號由自己定,而後緒的序列號由對端的 ACK 決定:SN_x = ACK_y (x 的序列號 = y 發給 x 的 ACK),這裡後邊會講到。


2.3 Acknowledgment Numbe

稱為「確認序列號」。確認序列號是接收確認端所期望收到的下一序列號。確認序號應當是上次已成功收到資料位元組序號加1,只有當標誌位中的 ACK 標誌為 1 時該確認序列號的欄位才有效。主要用來解決不丟包的問題。

若確認號=N,則表明:到序號N-1為止的所有資料都已正確收到。

在這裡,現在我們只需知道它的作用是什麼,就是在資料傳輸的時候是一段一段的,都是由序列號進行標識的,所以說,接收端每接收一段,之後就想要的下一段的序列號就稱為「確認序列號」。


2.4 TCP Flag

TCP 首部中有 6 個標誌位元,它們中的多個可同時被設定為 1,主要是用於操控 TCP 的狀態機的,依次為URG,ACK,PSH,RST,SYN,FIN

不要求初學者全部掌握,在這裡只講三個重點的標誌:


2.4.1 ACK

這個標識可以理解為傳送端傳送資料到接收端,傳送的時候 ACK 為 0,標識接收端還未應答,一旦接收端接收資料之後,就將 ACK 置為 1,傳送端接收到之後,就知道了接收端已經接收了資料。
在這裡插入圖片描述

此標誌表示「應答域有效」,就是說前面所說的TCP應答號將會包含在 TCP 資料包中;有兩個取值:0 和 1,為 1 的時候表示應答域有效,反之為 0;


2.4.2 SYN

表示「同步序列號」,是 TCP 握手的傳送的第一個資料包。

用來建立 TCP 的連線。SYN 標誌位和 ACK 標誌位搭配使用,當連線請求的時候,SYN=1,ACK=0連線被響應的時候,SYN=1,ACK=1;這個標誌的資料包經常被用來進行埠掃描。掃描者傳送一個只有 SYN 的資料包,如果對方主機響應了一個資料包回來 ,就表明這臺主機存在這個埠。看下面動畫:
在這裡插入圖片描述

2.4.3 FIN

表示傳送端已經達到資料末尾,也就是說雙方的資料傳送完成,沒有資料可以傳送了,傳送FIN標誌位的 TCP 資料包後,連線將被斷開。這個標誌的資料包也經常被用於進行埠掃描。

這個很好理解,就是說,傳送端只剩最後的一段資料了,同時要告訴接收端後邊沒有資料可以接受了,所以用FIN標識一下,接收端看到這個FIN之後,哦!這是接受的最後的資料,接受完就關閉了。動畫如下:
在這裡插入圖片描述

2.5 Window size

稱為滑動視窗大小。所說的滑動視窗,用來進行流量控制。


3、為什麼進行 TCP 三次握手?

如果之前你不瞭解網路分層的話,建議看看寫的文章。

你真的懂網路分層協議嗎?

第一,為了確認雙方的接收與傳送能力是否正常。第二,指定自己的初始化序列號,為後面的可靠傳送做準備。第三,如果是 https 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密金鑰的生成到。

如果你瞭解 UDP 的話,TCP 的出現正式彌補了 UDP 不可靠傳輸的缺點。但是 TCP 的誕生,也必然增加了連線的複雜性。


4、TCP 三次握手過程?

TCP 三次握手的過程掌握最重要的兩點就是客戶端和服務端狀態的變化,另一個是三次握手過程標誌資訊的變化,那麼掌握 TCP 的三次握手就簡單多了。下面我們就以動畫形式進行拆解三次握手過程。
在這裡插入圖片描述

  • 初始狀態:客戶端處於 closed(關閉)狀態,伺服器處於 listen(監聽) 狀態。
    在這裡插入圖片描述
  • 第一次握手:客戶端傳送請求報文將 SYN = j(1)初始化序列號傳送給客戶端,傳送完之後客戶端處於SYN_Send狀態。
    在這裡插入圖片描述
  • 第二次握手:服務端受到 SYN 請求報文之後,如果同意連線,會以自己的SYN(服務端) = K(0)ack(1) = SYN(客戶端) + 1(ACK = 1)報文作為應答,伺服器為SYN_Receive狀態。
    在這裡插入圖片描述
  • 第三次握手: 客戶端接收到服務端的 SYN + ACK,然後傳送 ack = SYN(服務端) + 1(ACK = 1)確認包作為應答,客戶端轉為established狀態。
    第三次握手

5、為什麼不是一次、二次握手?

防止了伺服器端的一直等待而浪費資源。

為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。如果此時客戶端傳送的延遲的握手資訊伺服器收到,然後伺服器進行響應,認為客戶端要和它建立連線,此時客戶端並沒有這個意思,但 server 卻以為新的運輸連線已經建立,並一直等待 client 發來資料。這樣,server 的很多資源就白白浪費掉了。


下一篇:動畫:用動畫給女朋友講解 TCP 四次分手過程



❤️ 不要忘記留下你學習的腳印 [點贊 + 收藏 + 評論]

文章都看完了,為何不妨點個贊呢?嘻嘻,那就說明你很自私,你怕那麼好的文章讓別人也看到。開個小小玩笑。

其實我也很自私,我把我的一直以來堅持原創的公眾號:「小鹿動畫學程式設計」偷偷給你,裡邊匯聚了小鹿以動畫形式講解的資料結構與演算法、網路原理、Web 等技術文章。
在這裡插入圖片描述

動一動你的小手,點贊就完事了,每個人出一份力量(點贊 + 評論)就會讓更多的學習者加入進來!非常感謝! ̄ω ̄=


作者Info:

【作者】:小鹿

【原創公眾號】:小鹿動畫學程式設計。

【簡介】:和小鹿同學一起用動畫的方式從零基礎學程式設計,將 Web前端領域、資料結構與演算法、網路原理等通俗易懂的呈獻給小夥伴。先定個小目標,原創 1000 篇的動畫技術文章,和各位小夥伴共同努力一起學習!公眾號回覆 “資料” 送一從零自學資料大禮包!

【轉載說明】:轉載請說明出處,謝謝合作!~

相關文章