來源 | 公衆號:小鹿動畫學編程前端
TCP 三次握手過程對於面試是必考的一個,因此不但要掌握 TCP 整個握手的過程,其中有些小細節也更受到面試官的青睞。面試
對於這部分掌握以及 TCP 的四次揮手,小鹿將會以動畫的形式呈現給每一個人,這樣將複雜的知識簡單化,理解起來也容易了不少,尤爲對於一個初學者來講。算法
TCP(Transmission Control Protocol 傳輸控制協議)
是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。編程
咱們知道了上述瞭解到了 TCP
的定義,通俗一點的講,TCP
就是一個雙方通訊的一個規範標準(協議)。服務器
咱們在學習 TCP
握手過程以前,首先必須瞭解 TCP
報文頭部的一些標誌信息,由於在 TCP
握手的過程當中,會使用到這些報文信息,若是沒有掌握這些信息,在學習握手過程當中,整我的處於懵逼狀態,也是爲了可以深刻 TCP
三次握手的原理。網絡
source port
和 distination port
二者分別爲「源端口號」和「目的端口號」。源端口號就是指本地端口,目的端口就是遠程端口。數據結構
一個數據包(pocket
)被解封裝成數據段(segment
)後就會涉及到鏈接上層協議的端口問題。socket
能夠這麼理解,咱們能夠想象發送方不少的窗戶,接收方也有不少的窗戶,這些窗口都標有不一樣的端口號,源端口號和目的端口號就分別表明從哪一個規定的串口發送到對方接收的窗口。不一樣的應用程度都有着不一樣的端口,以前網絡分層的文章中有提到過。 學習
擴展:應用程序的端口號和應用程序所在主機的 IP 地址統稱爲 socket(套接字),IP:端口號, 在互聯網上 socket 惟一標識每個應用程序,源端口+源IP+目的端口+目的IP稱爲」套接字對「,一對套接字就是一個鏈接,一個客戶端與服務器之間的鏈接。動畫
Sequence Numbe
稱爲「序列號」。用於 TCP 通訊過程當中某一傳輸方向上字節流的每一個字節的編號,爲了確保數據通訊的有序性,避免網絡中亂序的問題。接收端根據這個編號進行確認,保證分割的數據段在原始數據包的位置。
PS:初始序列號由本身定,然後緒的序列號由對端的 ACK 決定:SN_x = ACK_y (x 的序列號 = y 發給 x 的 ACK),這裏後邊會講到。
Acknowledgment Numbe
稱爲「確認序列號」。確認序列號是接收確認端所指望收到的下一序列號。確認序號應當是上次已成功收到數據字節序號加1,只有當標誌位中的 ACK 標誌爲 1 時該確認序列號的字段纔有效。主要用來解決不丟包的問題。
若確認號=N,則代表:到序號N-1爲止的全部數據都已正確收到。
在這裏,如今咱們只需知道它的做用是什麼,就是在數據傳輸的時候是一段一段的,都是由序列號進行標識的,因此說,接收端每接收一段,以後就想要的下一段的序列號就稱爲「確認序列號」。
TCP Flag
TCP
首部中有 6 個標誌比特,它們中的多個可同時被設置爲 1
,主要是用於操控 TCP
的狀態機的,依次爲URG,ACK,PSH,RST,SYN,FIN
。
不要求初學者所有掌握,在這裏只講三個重點的標誌:
ACK
這個標識能夠理解爲發送端發送數據到接收端,發送的時候 ACK 爲 0,標識接收端還未應答,一旦接收端接收數據以後,就將 ACK 置爲 1,發送端接收到以後,就知道了接收端已經接收了數據。
此標誌表示「應答域有效」,就是說前面所說的TCP應答號將會包含在 TCP 數據包中;有兩個取值:0 和 1,爲 1 的時候表示應答域有效,反之爲 0;
SYN
表示「同步序列號」,是 TCP 握手的發送的第一個數據包。
用來創建 TCP 的鏈接。SYN 標誌位和 ACK 標誌位搭配使用,當鏈接請求的時候,SYN=1,ACK=0鏈接被響應的時候,SYN=1,ACK=1;這個標誌的數據包常常被用來進行端口掃描。掃描者發送一個只有 SYN 的數據包,若是對方主機響應了一個數據包回來 ,就代表這臺主機存在這個端口。看下面動畫:
FIN
表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據能夠傳送了,發送FIN標誌位的 TCP 數據包後,鏈接將被斷開。這個標誌的數據包也常常被用於進行端口掃描。
這個很好理解,就是說,發送端只剩最後的一段數據了,同時要告訴接收端後邊沒有數據能夠接受了,因此用FIN標識一下,接收端看到這個FIN以後,哦!這是接受的最後的數據,接受完就關閉了。動畫以下:
Window size
稱爲滑動窗口大小。所說的滑動窗口,用來進行流量控制。
若是以前你不瞭解網絡分層的話,建議看看寫的文章。
第一,爲了確認雙方的接收與發送能力是否正常。第二,指定本身的初始化序列號,爲後面的可靠傳送作準備。第三,若是是 https 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密密鑰的生成到。
若是你瞭解 UDP 的話,TCP 的出現正式彌補了 UDP 不可靠傳輸的缺點。可是 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
狀態。
防止了服務器端的一直等待而浪費資源。
爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。若是此時客戶端發送的延遲的握手信息服務器收到,而後服務器進行響應,認爲客戶端要和它創建鏈接,此時客戶端並無這個意思,但 server
卻覺得新的運輸鏈接已經創建,並一直等待 client
發來數據。這樣,server
的不少資源就白白浪費掉了。
文章都看完了,爲什麼不妨點個贊呢?嘻嘻,那就說明你很自私,你怕那麼好的文章讓別人也看到。開個小小玩笑。
其實我也很自私,我把個人一直以來堅持原創的公衆號:「小鹿動畫學編程」偷偷給你,裏邊匯聚了小鹿以動畫形式講解的數據結構與算法、網絡原理、Web 等技術文章。
做者Info:
【做者】:小鹿
【原創公衆號】小鹿動畫學編程
【簡介】:和小鹿同窗一塊兒用動畫的方式從零基礎學編程,將Web前端領域、數據結構與算法、網絡原理等通俗易懂的呈獻給小夥伴。公衆號回覆 「資料」 送一從零自學資料大禮包!
【轉載說明】:轉載請說明出處,謝謝合做!~