IP、UDP、TCP協議格式(待完善)


UDP協議和TCP協議同位於傳輸層,介於網絡層(IP)和應用層之間:UDP數據部分爲應用層報文,而UDP報文在IP中承載。如下圖:

一、UDP與IP關聯

1、整體封裝格式

在這裏插入圖片描述
在接收時當IP層根據協議字段把UDP報文向上傳送到UDP模塊後,UDP模塊再根據端口號將數據發送到相應的進程中,以此實現進程到進程間的通信。

2、UDP與IP分組

在這裏插入圖片描述

注:上圖中分組1包含udp頭部,後續分組並不包含udp頭部

3、UDP報文格式

在這裏插入圖片描述
源端口號:端口號0-65535,1-1024保留端口號,爲標準的服務端口
目的端口號:字面含義
UDP長度:UDP報文的字節長度(UDP首部和數據長度),最小爲8,對應不包含數據
UDP校驗和: 檢驗UDP首部和數據部分的正確性

UDP報文抓包
UDP抓包

UDP允許傳輸的最大長度理論上2^16 - udp head - iphead( 65507 字節 = 65535 - 20 - 8)

但是實際上UDP數據報的數據區最大長度爲1472字節。分析如下:

首先,我們知道,TCP/IP通常被認爲是一個四層協議系統,包括鏈路層,網絡層,運輸層,應用層.

UDP屬於運輸層,下面我們由下至上一步一步來看:
以太網(Ethernet)數據幀的長度必須在46-1500字節之間,這是由以太網的物理特性決定的。這個1500字節被稱爲鏈路層的MTU(最大傳輸單元)。
但這並不是指鏈路層的長度被限制在1500字節,其實這這個MTU指的是鏈路層的數據區。 並不包括鏈路層的首部和尾部的18個字節。 所以,事實上,這個1500字節就是網絡層IP數據報的長度限制。 因爲IP數據報的首部爲20字節,所以IP數據報的數據區長度最大爲1480字節.
而這個1480字節就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數據報的。 又因爲UDP數據報的首部8字節,所以UDP數據報的數據區最大長度爲1472字節。這個1472字節就是我們可以使用的字節數。

超過1500字節怎麼辦?

這也就是說IP數據報大於1500字節,大於MTU.這個時候發送方IP層就需要分片(fragmentation).
把數據報分成若干片,使每一片都小於MTU.而接收方IP層則需要進行數據報的重組.
這樣就會多做許多事情,而更嚴重的是,由於UDP的特性,當某一片數據傳送中丟失時,接收方便
無法重組數據報.將導致丟棄整個UDP數據報。

因此,在普通的局域網環境下,我建議將UDP的數據控制在1472字節以下爲好.

進行Internet編程時則不同,因爲Internet上的路由器可能會將MTU設爲不同的值.
如果我們假定MTU爲1500來發送數據的,而途經的某個網絡的MTU值小於1500字節,那麼系統將會使用一系列的機
制來調整MTU值,使數據報能夠順利到達目的地,這樣就會做許多不必要的操作。鑑於Internet上的標準MTU值爲576字節,

所以我建議在進行Internet的UDP編程時. 最好將UDP的數據長度控件在548字節(576-8-20)以內.

二、TCP

TCP 包的大小就應該是 1500 - IP頭(20) - TCP頭(20) = 1460 (Bytes)

我們在用Socket編程時,UDP協議要求包小於64K。TCP沒有限定,TCP包頭中就沒有“包長度”字段,而完全依靠IP層去處理分幀。這就是爲什麼TCP常常被稱作一種“流協議”的原因,開發者在使用TCP服務的時候,不必去關心數據包的大小,只需講SOCKET看作一條數據流的入口,往裏面放數據就是了,TCP協議本身會進行擁塞/流量控制。

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