TCP協議學習筆記(一)首部以及TCP的三次握手鍊接四次揮手斷開

TCP協議是一種面向鏈接的、可靠協議。服務器

流即不間斷的數據結構。這樣可以保證接收到數據順序與發送相同。可是猶如數據間沒有間隔,所以在TCP通訊中,發送端應用能夠在本身所要發送的消息中設置一個標示長度或間隔的字段信息。網絡

因爲TCP爲應用提供可靠傳輸,因此須要對數據傳輸時數據破壞、丟包、重複以及亂序問題有充分的控制能力。同時TCP協議做爲面向鏈接的協議,只有確認對端存在纔會發送數據。數據結構

TCP經過檢驗和、序列號、確認應答、重發控制、鏈接管理、窗口控制等實現可靠傳輸。併發

 

當傳輸層採用TCP協議進行通訊時,TCP數據被封裝在一個IP數據報裏,首先來看一下TCP首部的構成,不包括可選字段,TCP首部通常是20個字節:spa

看書的時候把首部各部分的意義畫在了圖中,簡單來講,TCP數據報經過源端端口號和目的端口號來確認彼此使用TCP的程序,序號和確認序號用於完成字節流的標識,使其可以按照發送的順序被接收。窗口大小指的是滑動窗口協議的大小,檢驗和用來檢驗當前收到的數據包是否是有應該收的。具體我都在看書過程當中畫在圖裏了。blog

TCP是面向鏈接的可靠傳輸,在每次通訊以前都須要先創建連接,創建一個新鏈接的時候:進程

  • 請求端(客戶端)發送一個SYN段指明創建鏈接的端口,此時TCP首部中,SYN字段被設置爲1,序號字段是一個隨機生成的初始序號(ISN),可選字段中會有一個己方可以發送的數據包最大長度MSS
  • 服務器收到這個報文以後,發送一個ACK給客戶端,這個數據包中,ACK和SYN字段被設置爲1,序號字段是一個隨機生成的初始序號(與客戶端的不一樣),確認序號字段是客戶端的ISN+1,可選字段有一個服務器所可以發送的MSS
  • 客戶端接收到這個報文以後,發送一個ACK給服務器,這個數據包中,ACK字段爲1,確認序號爲服務器的ISN+1

MSS的確認是創建鏈接的過程當中實現,可是若是有一方不接收來自另外一方的MSS,則設定爲默認值536(這個默認值容許20字節的IP首部以及20字節的TCP首部以適合576字節的IP數據報)內存

 

在通訊結束以後,須要通過4次揮手斷開連接(這是由TCP的半關閉形成的),在這個過程當中,第一個發送FIN的執行主動關閉,另外一方執行被動關閉。當客戶端結束數據傳輸,給對方發送一個FIN數據包請求關閉連接,,服務器收到FIN後回覆一個ACK。然後服務器再給客戶端發送一個FIN請求關閉連接,客戶端回覆一個ACK,便可完成關閉。io

附圖:TCP/IP詳解(注意創建鏈接與關閉連接中雙方的序號關係,起始ISN是隨機產生的)請求

在創建鏈接與斷開連接的過程當中,有一個很是重要的問題,就是丟包處理。通常會設置一個最長等待時間,當發送方超過最長等待時間接收不到對方回覆,就會重發剛纔的數據包。而接收方若是接到數據包,會根據序號(或其餘策略)判斷是否是重複的數據包從而接收或者丟棄。

還有很重要的在創建鏈接與關閉連接過程當中,TCP的狀態變遷:

  • TIME_WAIT狀態也稱爲2MSL等待狀態,MSL是任何報文段被丟棄前在網絡內存活的最長時間。當TCP執行一個主動關閉,併發回最後一個ACK,該鏈接必須在TIME_WAIT狀態停留時間爲2倍的MSL,這樣可讓TCP再次發送最後的ACK防止ACK丟失。另外,誰執行主動關閉,誰進入TIME_WAIT狀態,誰被動關閉,誰進入CLOSE_WAIT狀態
  • FIN_WAIT_2狀態,是已經發出FIN而且另外一端已經確認,除非實行半關閉,不然等待另外一端發送FIN請求關閉連接。只有當另外一端的進程完成這個關閉,這端纔會從FIN_WAIT2狀態進入TIME_WAIT狀態
相關文章
相關標籤/搜索