UDP/TCP/IP/MTU 小註解

我們部門本來是做多媒體的, 可是多媒體不是從網路上拿來, 就是有可能再傳到網路上, 所以我們也愈來愈像是在做網路了.

在網路上傳送多媒體, 如果是即時的應用, 就會使用 UDP (user datagram protocol). 一個 UDP 封包最小是 8 bytes (只有 8 bytes header), 最大是 65535 bytes (64KB, 包括 8 byte header). 它的長相如下:

bits 0-15 16-31
0 Source Port Number Destination Port Number
32 Length Checksum
64 data

 

Checksum 的部分相當神奇, 根據 IP v4 或是 IP v6 的不同, 它還要想像它前面還有 IP header, 一起做 checksum. 因為想像中的 IP header 並不在 UDP 的協議中, 所以那個想像中的 header 就叫做偽頭 (pseudo header). 顯然地, IP v6 的偽頭比 IP v4 要來得大! 如果不要那麼麻煩去算 checksum, 填 0 也可以, 那就表示 "我沒算 checksum".

如果加上 IP 層的頭, overhead 又多了 20 bytes. 所以原來號稱最大可以傳 65535 bytes, 減去 UDP header 8 bytes 和 IP header 20 bytes, 就剩下 65507 bytes.

bit offset 0-3 4-7 8-15 16-18 19-31
0 Version Header length Differentiated Services Total Length
32 Identification Flags Fragment Offset
64 Time to Live Protocol Header Checksum
96 Source Address
128 Destination Address
160 Options ( if Header Length > 5 )
160 or 192+ UDP, TCP (for example)

 

如果是 TCP 的話, 用來取代 UDP 那個位置. 不過 TCP 光是 header 就有 20 bytes 以上, 幾乎和 IP v4 header 等量齊觀.

MTU (Maximum transmission unit) 又是啥呢? 無論我們選了 UDP 或是 TCP, 對傳輸系統來說, 都是 IP 的封包. MTU 就是能夠傳送最大封包的 size. 比方說 IPv4 建議值是 576 bytes, IPv6 建議值是 1280 bytes.  最大的狀況大概是 Ethernet Jumbo frame 的 9000 bytes, 基本上都不會太大, 連 10 KBytes 都不到.

當然, MTU 設得愈大, 系統就要等更多的 data 才能發送, 造成資料的延遲. 如果 MTU 設得很大, 對 TCP 或許是有意義的, 但是對於 UDP 就有點不知所云了. 畢竟即時和延遲是對立的關係.

[ref]

1. http://en.wikipedia.org/wiki/User_Datagram_Protocol

2. http://en.wikipedia.org/wiki/Maximum_transmission_unit

3. http://en.wikipedia.org/wiki/IPv4

4. http://www.docin.com/p-47138983.html