(1) TCP是怎麼樣的協議?
TCP(Transmission Control Protocol)傳輸控制協議,是一種面向連接的,可靠的,基於IP的傳輸層協議。它的主要目地是爲數據提供可靠的端到端的傳輸。
(2) TCP協議的由來?
上一節學習了UDP協議,可以知道UDP協議非常簡單,而且容易實現。但是其可靠性較差,一旦將數據包發出,將無法知道對方是否收到。爲了解決這個問題,TCP協議就誕生了。使用TCP協議,可以提供網絡的安全性。因爲使用TCP協議傳輸數據時,每發出一個數據包都要求確認。如果其中有一個數據包丟失,就收不到確定包,發送方就知道應該重發這個數據包。這樣TCP協議就保證了數據的安全性。
(3)TCP三次握手
上圖就是TCP協議三次握手建議的連接。 其中Seq表示請求序列號,Ack表示確認序列號,SYN和ACK爲控制位
1. 第一次握手
第一次握手建立連接時,客戶端向服務器發送SYN報文(Seq=x, SYN=1),客戶端進去SYN_SENT狀態, 等待服務器確定。
2. 第2次握手
首先,服務器收到客戶端的請求,向客戶端回覆一個確認信息(Ack = x + 1)
其次,服務器再次向客戶端發送一個SYN包(seq=y)建立連接請求,此時服務器進去SYN_RECV狀態
3. 第3次握手
第三次握手客戶端收到服務器的回覆(SYN+ACK報文)。此時,客戶端向服務器端發送ACK,此包發送完畢後客戶端和服務器端進入ESTABLISHED狀態。完成三次握手
(4) TCP四次斷開
在TCP通信中,當每次通信完畢後都會終止連接。該過程包含4個數據包,並且用一個FIN標誌來表明連接的終結。
TCP斷開需要四個步驟:
a. 客戶端通過發送一個設置了FIN和ACK標誌的TCP數據包,告訴服務器通信已經完成
b. 服務器收到客戶端的數據後,發送一個ACK數據包來響應客戶端
c. 服務器再次向客戶端傳輸一個自己的FIN/ACK數據包
d. 客戶端手動啊服務器的FIN/ACK包後,響應服務器一個ACK數據包。然後結束通信。
(5)有人機會問, 爲什麼建立連接只需3步,而斷開需要4步?
答: 因爲在客戶端與服務器建立連接時,當收到客戶端發送 的SYN數據後,是把ACK/SYN放在一起發送給客戶端的。 但是當斷開連接時,當收到客戶端發送的FIN數據後,只能說明數據發送完畢,客戶端不再發送數據,但是服務還是連接的。只能說明客戶端沒有數據發送給服務端了,但不代表服務端沒有數據要發送給客戶端了。當服務器所有的數據都發送完畢後,纔會發送FIN/ACK數據,請求斷開連接。
(1)TCP首部格式
源端口: 用來傳輸數據報的端口
目標端口: 數據包將要發送到的端口
序號: 用來表示一個TCP片段。這個值用來表示數據流中的部分數據沒有丟失
確認號: 表示通信中希望從另一個設備得到的下一個數據包的序號
數據偏移: 表示此塊數據在整塊數據中的偏移
保留: 包括Reserved, Nonce, CWR和ECN-Echo,共6個比特位
標記:用來表示所傳輸的TCP數據包類型。該字段中可用的標記包括URG, ACK, PSH, RST, SYN, FIN
窗口: TCP接受者緩衝區的大小
檢驗和: 用來保證TCP首部和數據部分的完整性
緊急指針: 如果設置了URG位,這個值將被檢查作爲額外的指令
選項: 各種可選的域,可以在TCP數據包中進行指定
上面提到了TCP傳輸時,可用的標記有URG, ACK, PSH, RST, SYN, FIN。 下面分別介紹這幾個標記
URG: 緊急標誌。此標誌表示TCP包的緊急指針域有效,用來保證TCP連接補被中斷。
ACK: 確認標誌。此標誌表示應答域有效。1表示應答域有效,0表示無效
PSH: 此標誌表示Push操作,所謂Push操作就是指在數據包到達接收端以後,立刻傳送到應用程序,而不在緩衝區排隊。
RST: 該標誌表示連接復位請求。
SYN: 表示同步序號,用來建立連接。SYN標誌位和ACK標誌位搭配使用。當連接請求時SYN=1, ACK=0。 當連接被響應的時候,SYN=1, ACK=1.
FIN: 表示發送端已經達到數據的末尾,也就是說雙方的數據傳輸完成,沒有數據可以傳輸了。此時發送FIN標誌位的TCP數據包後,連接將被斷開。
(2) 捕獲TCP數據包
上圖是捕獲的TCP數據包。接下來對三次握手和四次揮手做詳細說明
(3) 第一次握手(分析461幀)
從以上的分析可以看出,客戶端向服務器發送請求建立連接,當前的序列號爲0。
(4)第二次握手(分析462幀)
從第二次的分析可以看到,服務器收到客戶端的請求建立連接後,發送給客戶端確定包(ACK=1)已經請求建立(SYN=1),當前的序列號爲0,並且希望下一次的系列號爲1.
(5)第三次握手(分析463幀)
當第三次握手成功後,客戶端和服務端就可以建立連接了,就可以傳輸數據了。
可能這部分有點不好懂,我建議大家實際操作分析,並結合下圖分析
(1)捕獲TCP四次揮手數據包
(2)接下來分析四次揮手的過程,第一次揮手(分析524幀,通過FIN/ACK標誌確定這個客戶端提出揮手的第一次)
通過第一次揮手客戶端發送FIN和ACK標誌,表示本次通信已經結束,請求結束連接
(3)分析第二次揮手,也就是525幀
(4)分析第三次揮手,也就是526幀
(5)第四次揮手分析,也就是527幀
到這裏TCP四次揮手分析完畢,大家可以實際操作爲主,同時結合下圖分析