6. UDP段格式

下圖是UDP的段格式(該圖出自[TCPIP])。

圖 36.11. UDP段格式

UDP段格式

下面分析一幀基于UDP的TFTP協議幀。

乙太網首部
0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00 
IP首部
0000:                                           45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8
0020: 00 01
UDP首部
0020:      05 d4 00 45 00 3f ac 40
TFTP協議
0020:                               00 01 'c'':''\''q'
0030: 'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i'
0040: 'i'00 'b''l''k''s''i''z''e'00 '5''1''2'00 't''i'
0050: 'm''e''o''u''t'00 '1''0'00 't''s''i''z''e'00 '0'
0060: 00

乙太網首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上層協議類型0x0800表示IP。

IP首部:每一個位元組0x45包含4位版本號和4位首部長度,版本號為4,即IPv4,首部長度為5,說明IP首部不帶有選項欄位。服務類型為0,沒有使用服務。16位總長度欄位(包括IP首部和IP層payload的長度)為0x0053,即83位元組,加上乙太網首部14位元組可知整個幀長度是97位元組。IP報標識是0x9325,標誌欄位和片偏移欄位設置為0x0000,就是DF=0允許分片,MF=0此數據報沒有更多分片,沒有分片偏移。TTL是0x80,也就是128。上層協議0x11表示UDP協議。IP首部校驗和為0x25ec,源主機IP是c0 a8 00 37(192.168.0.55),目的主機IP是c0 a8 00 01(192.168.0.1)。

UDP首部:源連接埠號0x05d4(1492)是客戶端的連接埠號,目的連接埠號0x0045(69)是TFTP服務的well-known連接埠號。UDP報長度為0x003f,即63位元組,包括UDP首部和UDP層payload的長度。UDP首部和UDP層payload的校驗和為0xac40。

TFTP是基于文本的協議,各欄位之間用位元組0分隔,開頭的00 01表示請求讀取一個檔案,接下來的各欄位是:

c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0

一般的網絡通信都是像TFTP協議這樣,通信的雙方分別是客戶端和伺服器,客戶端主動發起請求(上面的例子就是客戶端發起的請求幀),而伺服器被動地等待、接收和應答請求。客戶端的IP地址和連接埠號唯一標識了該主機上的TFTP客戶端進程,伺服器的IP地址和連接埠號唯一標識了該主機上的TFTP服務進程,由於客戶端是主動發起請求的一方,它必須知道伺服器的IP地址和TFTP服務進程的連接埠號,所以,一些常見的網絡協議有預設的伺服器連接埠,例如HTTP服務預設TCP協議的80連接埠,FTP服務預設TCP協議的21連接埠,TFTP服務預設UDP協議的69連接埠(如上例所示)。在使用客戶端程序時,必須指定伺服器的主機名或IP地址,如果不明確指定連接埠號則採用預設連接埠,請讀者查閲ftp、tftp等程序的man page瞭解如何指定連接埠號。/etc/services中列出了所有well-known的服務連接埠和對應的傳輸層協議,這是由IANA(Internet Assigned Numbers Authority)規定的,其中有些服務既可以用TCP也可以用UDP,為了清晰,IANA規定這樣的服務採用相同的TCP或UDP預設連接埠號,而另外一些TCP和UDP的相同連接埠號卻對應不同的服務。

很多服務有well-known的連接埠號,然而客戶端程序的連接埠號卻不必是well-known的,往往是每次運行客戶端程序時由系統自動分配一個空閒的連接埠號,用完就釋放掉,稱為ephemeral的連接埠號,想想這是為什麼。

前面提過,UDP協議不面向連接,也不保證傳輸的可靠性,例如:

因此,使用UDP協議的應用程序必須考慮到這些可能的問題並實現適當的解決方案,例如等待應答、超時重發、為數據包編號、流量控制等。一般使用UDP協議的應用程序實現都比較簡單,只是發送一些對可靠性要求不高的消息,而不發送大量的數據。例如,基于UDP的TFTP協議一般只用於傳送小檔案(所以才叫trivial的ftp),而基于TCP的FTP協議適用於各種檔案的傳輸。下面看TCP協議如何用面向連接的服務來代替應用程序解決傳輸的可靠性問題。