前言
TCP 三次握手程序對于面試是必考的一個,所以不但要掌握 TCP 整個握手的程序,其中有些小細節也更受到面試官的青睞,
學習導圖

一、TCP 是什么?
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基于位元組流的傳輸層通信協議,
我們知道了上述了解到了 TCP 的定義,通俗一點的講,TCP 就是一個雙方通信的一個規范標準(協議),
我們在學習 TCP 握手程序之前,首先必須了解 TCP 報文頭部的一些標志資訊,因為在 TCP 握手的程序中,會使用到這些報文資訊,如果沒有掌握這些資訊,在學習握手程序中,整個人處于懵逼狀態,也是為了能夠深入 TCP 三次握手的原理,
二、TCP 頭部報文

2.1 source port 和 distination 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 的很多資源就白白浪費掉了,
原文鏈接:https://blog.csdn.net/qq_36903042/article/details/102513465
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10558.html
標籤:其他
上一篇:網路運維問題,求教技術大佬
