C++——TCP和UDP頭部結構(下)

1. TCP頭部結構

OSI七層模型網絡傳輸層中,TCP是面向連接、可靠的、字節流傳輸。

TCP協議通信雙方必須先建立連接,通信雙方必須爲該連接分配必要的內核資源,以管理連接的狀態和連接上數據的傳輸。TCP是全雙工的,即雙方的數據讀寫可通過一個連接進行。完成數據交換之後,通信雙方都必須斷開連接以釋放系統資源。

 TCP協議的這種連接是一對一的,所以基於廣播和多播(目標是多個主機地址)的應用程序不能使用TCP服務。而無連接的UDP則十分適合這種廣播和多播。

TCP協議使用字節流(UDP使用數據報),實際編程中字節流和數據報的主要區別體現在通信雙方是否必須執行相同次數的讀、寫操作(只是表現形式),發送端應用程序連續執行多次寫操作時,TCP模塊先將這些數據放入TCP發送緩衝區中。當TCP模塊真正開始發送數據時,發送緩衝區中這些等待發送的數據可能被封裝成一個或多個TCP報文段發出。因此,TCP模塊發送出的TCP模塊發送出的TCP報文段的個數和應用程序執行的寫操作次數之間沒有固定的數量關係。

      當接收端收到一個或多個TCP報文段後,TCP模塊將他們攜帶的應用程序數據按照TCP報文段的序號依次放入TCP接收緩衝區中,並通知應用程序讀取數據。接收端應用程序可以一次性將TCP接收緩衝區中的數據全部都出,也可以分多次讀取,這取決於用戶制定的應用程序讀緩衝區的大小。因此,應用程序執行的讀操作次數和TCP模塊接收到的TCP報文段個數之間也沒有固定的數量關係。

    綜上所述,發送端執行的寫操作次數和接收端執行的讀操作次數之間沒有任何數量關係,這就是字節流的概念:應用程序對數據的發送和接收是沒有邊界限制的。UDP則然,發送端應用程序沒執行一次寫操作,UDP模塊就將其封裝成一個UDP數據包併發送之。接收端必須及時針對每一個UDP數據報執行讀操作(通過recvfrom系統調用),否則就會丟包(這經常發生在較慢的服務器上)。並且,如果過用戶沒有指定足夠的應用程序緩衝區來讀取UDP數據,則UDP數據將被截斷。

TCP字節流服務具體框圖:

TCP頭部結構:

特點:可靠性。通過連接管理(三握四揮),序列號,確認號,擁塞控制,重傳控制來保證可靠性。

頭部長度:一般爲4*5=20字節,選項最多40字節,限制60字節。

16位端口號:告知主機該報文段是來自哪裏(源端口Source Port)以及傳給哪個上層協議或應用程序(目的端口Destination Port)的。進行TCP通信時,客戶端通常使用系統自動選擇的臨時端口號,而服務器則使用知名服務端口號(比如DNS協議對應端口53,HTTP協議對應80,這些端口號可在/etc/services文件中找到)。

32位序號:一次TCP通信(從TCP連接建立到斷開)過程中某一個傳輸方向上的字節流的每個字節的編號。假設主機A和主機B進行TCP通信,A發送給B的第一個TCP報文段中,序號值被系統初始化爲某個隨機值ISN(Initial Sequence Number,初始序號值)。那麼在傳輸方向上(從A到B),後續的TCP報文段中序號值將被系統設置成ISN加上該報文段所攜帶數據的第一個字節在整個字節流中的偏移。例如,某個TCP報文段傳送的數據是字節流中的第1025~2048字節,那麼該報文段的序號值就是ISN+1025,另外一個傳輸方向(從B到A)的TCP報文段的序號值也具有相同的含義。

32位確認號(acknowledgement number):用作對另一方發送來的TCP報文段的響應。其值是收到的TCP報文段的序號值加1。假設主機A和主機B進行TCP通信,那麼A發送出的TCP報文段不僅攜帶自己的序號,而且包含對B發送來的TCP報文段的確認號。反之,B發送出的TCP報文段也同時攜帶自己的序號和對A發送來的報文段的確認號。

4位頭部長度(header length):標識該TCP頭部有多少個32bit字(4字節)。因爲4位最大能標識15,所以TCP頭部最長是60字節。

6位標誌位包含如下幾項:

        URG標誌:表示緊急指針(urgent pointer)是否有效。

        ACK標誌:表示確認號是否有效。我們稱攜帶ACK標識的TCP報文段爲確認報文段

        PSH標誌:提示接收端應用程序應該立即從TCP接收緩衝區中讀走數據,爲接收後續數據騰出空間(如果應用程序不將接收到的數據讀走,它們就會一直停留在TCP接收緩衝區中)。

         RST標誌:表示要求對方重新建立連接。我們稱攜帶RST標誌的TCP報文段爲復位報文段

         SYN標誌:表示請求建立一個連接。我們稱攜帶SYN標誌的TCP報文段爲同步報文段

         FIN標誌:表示通知對方本端要關閉連接了。我們稱攜帶FIN標誌的TCP報文段爲結束報文段

16位窗口大小(window size):是TCP流量控制的一個手段。這裏說的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告訴對方本端的TCP接收緩衝區還能容納多少字節的數據,這樣對方就可以控制發送數據的速度。

16位校驗和(TCP check sum):由發送端填充,接收端對TCP報文段執行CRC算法以檢驗TCP報文段在傳輸過程中是否損壞。注意,這個校驗不僅包括TCP頭部,也包括數據部分。這也是TCP可靠傳輸的一個重要保障。

16位緊急指針(urgent pointer):是一個正的偏移量。它和序號字段的值相加表示最後一個緊急數據的下一字節的序號。因此,確切地說,這個字段是緊急指針相對當前序號的偏移,不妨稱之爲緊急偏移。TCP的緊急指針是發送端向接收端發送緊急數據的方法。

TCP頭部選項:TCP頭部的最後一個選項字段(options)是可變長的可選信息。這部分最多包含40字節,因爲TCP頭部最長是60字節(其中還包含前面討論的20字節的固定部分)。典型的TCP頭部選項結構如下圖所示。

2. UDP頭部結構

UDP頭部結構:/*UDP頭定義,共8個字節*/

頭部結構中各部分的作用(共8個字節):

(1)16位源端口號: 記錄源端口號,在需要對方回信時選用。不需要時可用全0。

(2)16位目的端口號: 記錄目標端口號。這在終點交付報文時必須要使用到。

(3)16位UDP長度: UDP數據報的長度(包括數據和首部),其最小值爲8B(即僅有首部沒有數據的情況)。

(4)16位UDP校驗和: 檢測UDP數據報在傳輸中是否有錯,有錯就丟棄。該字段時可選的,當源主機不想計算校驗和,則直接令該字段爲全0。當傳輸層從IP層收到UDP數據報時,就根據首部中的目的端口,把UDP數據報通過相應的端口,上交給進程。如果接收方UDP發現收到的報文中目的端口號不正確(即不存在對應端口號的應用進程),就丟棄該報文,並由ICMP發送“端口不可達”差錯報文交給發送方。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章