第8章 傳輸層(3)_TCP協議

3. 傳輸控制協議(TCP)

3.1 TCP協議的主要特點

(1)TCP是面向連接的傳輸層協議。即使用TCP協議之前必須先建立TCP連接。在傳送數據完畢之後,必須釋放己經建立的TCP連接。

(2)每一條TCP連接只能有兩個端點,即只能是一對一的。

(3)TCP提供可靠交付服務,也就是說通過TCP連接傳送的數據,無差錯、不丟失、不重複且按序發送。

(4)TCP提供全雙工通信。TCP連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的數據。這就允許通信雙方在任何時候都可以發送數據。

(5)面向字節流

  ①TCP中的「流」是指流入到進程或從進程流出的字節序列。「面向字節流」的含義是:是指TCP把應用程序交下來的數據僅僅看成是一連串的無結構的字節流。它並不知道所傳送的字節流的含義(如是一個整型或自定義的結構體),其含義由應用層的接收雙方自行協商的,但到了傳輸層其意義就不存在了

  ②UDP發送的報文長度是應用程序給了的。但與UDP不同,如果應用程傳送到TCP緩存的數據塊太長,TCP就會把它劃分得短一些再傳送。如果應用程序一次只發一個字節,TCP會等待積累到足夠多字節後再構成報文發送出去。一個TCP報文段的大小,只是根據對方給出的窗口值和當前網絡的擁塞程度來決定的。

3.2 TCP報文的首部格式

(1)抓包分析TCP

 

(2)TCP首部

 

  ①TCP報文分爲首部和數據兩個部分。TCP的全部功能都體現在它首部的各個字段的作用,只有弄清首部各字段的作用才能掌握TCP的工作原理。

  ②TCP首部的前20個字節是固定的,後面的4N個字節是根據需要而增加的(N爲整數),因此TCP首部的最小長度是20字節。

3.3 TCP首部各字段含義

(1)源端口和目的端口:各佔2個字節。和UDP一樣,使用端口號來標識不同的應用層協議。

(2)序號:佔4個字節,共232個序號,序號從0開始,增到最大時,下一個序號會循環回到0。一個TCP連接中傳送的字節流的每一個字節都按順序編號。而序號字段表示本報文段所發送的數據的第一個字節的序號。

(3)確認號:佔4個字節,是期望收到下一個報文段的第一個數據字節的序號應記住:若確認號爲N,則表明到序號N-1爲止的所有數據都已正確收到

 

(4)數據偏移:佔4位二進制,單位是4字節。它指出TCP報文段的數據起始處距離TCP報文段的起始的偏移,實際上就是指出TCP報文段的首部長度。

(5)保留:佔6位。保留爲今後使用,但目前應置爲0。

(6)緊急URG(Urgent)。當URG=1時,表示緊急指針字段有效。它告訴系統此報文段中有緊急數據,應儘快傳送(相當於高優先級的數據),而不要按原來的排隊順序傳送。(注意,該標誌位只是告訴TCP,優先發送本報文段。但接收方是否優先把該數據報儘快交付(推送)給應用程序是由push標誌位來決定的)

(7)確認ACK(Acknowlegment)當ACK=1時確認號字段纔有效。當ACK=0時,確認號無效。TCP規定,在連接建立後所有傳送的報文段都必須把ACK置1。

(8)推送(Push):當兩個應用進程進行交互的通信時有時在一端的應用進程希望在鍵入一個命令後立即就能夠收到對方的響應。(即接收方優先接收這個數據包,就優先交付給其上的應用程序,而不再等到整個緩存都填滿後再向上交付!)。實際中很少使用該字段。

(9)復位RST(Reset):當RST=1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立傳輸連接。

(10)同步SYN(Synronization)在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文段。對方若同意建立連接,則應在響應的報文段中使用SYN=1和ACK=1。因此,SYN置1就表示這是一個連接請求或連接接受報文

(11)終止FIN(Finish)用來釋放一個連接。當FIN=1時,表明此報文段的發送方的數據己發送完畢,並要求釋放傳輸連接。

(12)窗口 。佔2個字節。窗口值是[0,216-1]之間的整數,主要起着流量控制的作用。其意義在於告訴對方:從本報文段首部中的確認號算起,接收方目前允許對方發送的數據量(單位是字節)。

  ①由於TCP的確認機制也讓TCP連接雙方的數據傳輸速度變慢,也就是說,一方發送數據需要等待對方的確認才繼續發送後續數據。爲了充分利用雙方的帶寬及緩衝區(Buffer),發送方不必等待對方的確認,可以連續發送多個數據包給對方,而對方可以暫時把這些數據存放在緩衝區,並給對方一個總確認。這樣,可以大大增加數據傳輸的速度

  ②可見,之所以要有這個限制,是因爲接收方的數據緩存空間是有限的。總之,窗口值作爲接收方讓發送方設置其發送窗口的依據。使用TCP協議傳輸數據的計算機會根據自己的接收能力讓對方參數這個窗口值來調整數據發送的速率,從而達到流量控制的功能。

(13)檢驗和。佔2個字節。檢驗的範圍包括首部和數據這兩個部分。其檢驗方法與UDP類似,也要臨時添加一個僞首部。只是僞首部的第4個字段的17改爲16,第5個字段的UDP長度改爲TCP長度。若使用IPv6,則僞首部也要相應的改變。

(14)緊急指針。佔2個字節。緊急指針僅在URG=1時纔有意義,它指出本報文段中的緊急數據的字節數(緊急數據結束後就是普通數據),由於緊急數據是從數據部分的開始處算起,因此,緊急指針也是緊急數據的長度。

(15)選項:長度可變,最長可達40個字節。當沒有使用選項時,TCP的首部長度是20個字節。該選項中通常可以設置MMS、窗口擴大選項和時間戳等。

 

  ①TCP最長報文段長度(MMS),並不是整個TCP報文段的最大長度,而是數據字段的最大長度

  ②受數據鏈路層最大傳輸單元(MTU)的限制,以太網的MTU默認是1500字節。因此TCP報文段數據部分的最大長度(MMS)爲1460字節

  ③若選擇較小的TCP報文段太小,則網絡的利用率就低反之,如果TCP報文段太長,那麼在IP層就可能被分解成多個短數據報片,當傳輸出錯時要進行重傳以及到達終點還要還原成原來的TCP報文,這些都會使網絡開銷增大

  ④因此,MMS應儘可能設置大些,只要在IP層傳輸時不需要再分片就行。若主機未填寫MMS,默認爲536字節。因此所有因特網上的主機都應能接受的報文長度是536+20(固定首部長度)=556字節。