爲什麼初始化一個TCP連接會發這麼多SYN?

許章杭


不邀自來,專業問題我來回答一下:

首先需要明確的是TCP建立連接的三次握手(也就是題主所述的TCP初始化)只有兩個SYN,分別是第一次客戶端向服務端發起連接請求時SYN和第二次服務端發送SYN確認包給服務端。

背景

  • TCP含義:TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的,可靠的,基於字節流的傳輸協議,它位於OSI模型的傳輸層,傳輸層是提供能端到端的通信服務,位於同一層的傳輸協議還有UDP協議;
  • 面向連接的解釋:面向連接指的是在TCP建立通信之前,會通過三次握手(three-way handshake),在握手過程中通過確認序號,定時重傳,協商發送數據的窗口大小,數據校驗等機制來為可靠的傳輸服務提供保障。

什麼是SYN,SYN的用途是什麼

要知道SYN是什麼,那就必須要了解TCP的首部字段,TCP首部字段如下圖:

  • 源端口號/目的端口號:16位的源端口和目的端口號用於發送端和接受端的進程尋址(像QQ,微信,百度等不同的應用程序),它和網絡層的IP(源IP/目的IP)唯一的確認一個TCP連接。
  • 序列號(Sequence Number):32位的序列號用於標識發送的數據字節流在該報文中的第一個數據字節,當順序號超過2^32 - 1後重新從0開始
  • 確認號:當ACK為1(表明該數據包是一個確認包)是有效,當ack=y時表明對方已經成功收到收到前y-1字節的數據。
  • 首部長度:用來支出報文段數據距離報文段起始位置的距離,單位為字節,其實就是表明TCP報文頭的長度
  • 保留域:保留以便以後使用,目前全為0.
  • URG:URG和緊急指針配合使用,當URG=1時,表明緊急字段有效,告訴系統此報文中有緊急數據,應儘快傳送。於是發送方TCP就把緊急數據插入到本報文段數據的最前面,而在緊急數據後面的數據仍是普通數據。
  • ACK:確認號標誌位,當ACK為1時,表明此數據包時一個確認包,一般會返回ack號給對方。
  • PSH:當PSH為1時表明應儘快的將報文交付給應用層來處理,而不用等將緩存區填滿後再交付,以便為後續數據騰出空間。
  • RST:RST為1時表明TCP建聯出現嚴重問題,必須釋放當前連接,重新建聯。
  • SYN:當SYN為1時,表明此數據包是一個同步包,用來表明正在請求連接。
  • FIN:當FIN為1時表明數據已經發送完畢,要斷開TCP連接
  • 窗口大小:窗口大小主要用於TCP流量控制,是接收方給發送方確定發送數據的大小的依據。
  • TCP校驗和:用來校驗數據的完整性,以防被篡改,該字段佔2個字節,包含頭部和數據兩部分。
  • 緊急指針:該字段只有在URG=1時才有效。它指出緊急數據在當前報文段的字節數,它是一個正的偏移量,因此這個字段也相當於緊急指針相對於當前序號的偏移。
  • 選項:長度可變,最長40字節,當沒有該字段時,TCP首部字段的長度是20字節。

為什是兩次SYN

由前面TCP頭部字段的學習,可知SYN=1表明該數據包發起請求建立TCP連接,在TCP建立一個可靠的連接時只有三次握手,前兩次客戶端和服務端分別發起一起連接請求,最後一次握手是客戶端發給服務端的確認數據包,表明已經建立連接,後面就可以發送接收數據了。

第一次握手:SYN=1,表明客戶端主動發起連接的請求,同時將序列號為seq=x的包發送給服務端,此時發送端進入SYN_SENT狀態。

第二次握手:SYN=1,表明服務器發起一個連接請求,同時ACK=1,表明次數據包對之前服務端的接受進行確認,ack=x+1,標識序號為x的包接受成功。

第三次握手:ACK=1,由客戶端對第二次握手的狀態進行一個確認,確認沒問題TCP就建鏈成功,可以發送數據。

通過抓包來驗證只有兩次SYN

綜上,TCP在建立可靠連接的三次握手中,僅有前兩次有SYN標記,倒是為了數據傳輸中序號確認,AK標記有很多次。

如果我的回答對你有幫助,請點贊關注加轉發,你們的鼓勵是我堅持下去的動力,也可以留言一起交流一起成長。


愛答問題的小星星


“我是喲喲吼說科技,專注於數據網絡的回答,歡迎大家與我交流數據網絡的問題”

TCP是通過三次握手機制建立的一個面向連接、可靠的傳輸層的協議,每個TCP連接建立後會使用某個端口進行數據通信。

如題,初始化一個TCP連接相當於重新建立一個TCP連接,而當建立一個新的TCP連接時會進行三次握手,其中只會存在兩個SYN,而不是題主所說的多個SYN,具體在瞭解三次握手的具體步驟後即可清楚。

1、第一次握手。

客戶端發送請求報文,將標誌位SYN設置為1,隨機產生seq值為J,並將數據包發送給服務器端,客戶端進入SYN_SENT狀態。

2、第二次握手。

服務器端收到請求報文,將標誌位SYN和ACK設置為1,ack為J+1,隨機產生seq值為K,並將數據包發送給客戶端,服務器端進入SYN_RCVD狀態。

3、第三次握手。

客戶端接收到報文後,確認ack是否為J+1,ACK是否為1,並將ACK設置為1,ack為K+1,將數據包發送給服務器端,服務器進行確認,確認結束後,雙方進入ESTABLISHED狀態,完成三次握手,建立連接可以進行通信了。

從這三次握手就可以明顯看出前兩次握手是有SYN標誌的,通過抓包工具抓到這些數據,但每個TCP連接不會產生多個SYN的。題主是否抓包時抓到多個TCP連接而發現多個SYN標誌的,建議檢查抓包數據中TCP連接的端口是否一致

歡迎大家多多關注我,一起分享更多科技技術相關的知識。


分享到:


相關文章: