[IP Datagram] |<-----------------IP datagram---------------------->| | |<-------- UDP datagram------------->| +---------------+----------+-------------------------+ | IP Header |UDP Header| UDP data | +---------------+----------+-------------------------+ |<-- 20 byte -->|<- 8byte->| |
[UDP Header] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Srouce Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | your data ... | ... | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Length = UDP Headerの長さ + UDP Dataの長さ
[UDP Checksum用の仮想ヘッダ] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | (Source) IP Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | (Destination) IP Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0 | protocol(17) | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Srouce Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | UDP data ... | ... | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
fragment化されたデータがさらに fragment化されることがある。
[IP Header] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | TCP (or UDP) header, then your data .... | ... | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[IP Fragmentation on Ethernet] |<-----------------IP datagram---------------------->| |<-- 20 byte -->|<- 8byte->|<-------1473byte-------->| +---------------+----------+-------------------------+ | IP Header |UDP Header| UDP data | +---------------+----------+-------------------------+ |<-----------------IP packet----------------------->| |<---IP packet--->| |<-- 20 byte -->|<- 8byte->|<------1472byte-------->| |<-- 20 byte -->| | +---------------+----------+------------------------+ +---------------+-+ | IP Header |UDP Header| UDP data | | IP Header | | +---------------+----------+------------------------+ +---------------+-+ ^1byte(用語に関する注意)
[ICMP Error Message: Port Unreachable] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused (must be 0) | MTU of next hop network | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ... | | IP Header of Original IP Packet | | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | First 8 byte Data of Original IP Packet | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ type =3: ICMP Destination Unreachable (宛先到達不能) code = 4: Fragmentation Needed and Don't Fragment was Set
(例) p.171 Fig.11.10: 「netb → sun のMTU」を決定したい場合 552 SLIP ??? bsdi sun------------------netb solaris 1500| 1500| |1500 |1500 ============ ====================== ETHERNET ETHERNET (予想) <-- <-- <---- fragment化されたデータ ICMP echo request(ping) (実験結果) <---- <---- <---- ICMP echo request(ping) ----> ICMP echo reply <---- ICMP Destination Unreachable
(例) path MTU discovery機能がサポートされていない場合 sun% traceroute.pmtu slip 1 bsdi (140.25213.35) 15 ms 6 ms 6 ms 2 bsdi (140.252.13.35) 6 ms fragmentation required and DF set, trying new MTU = 1492 fragmentation required and DF set, trying new MTU = 1006 ... fragmentation required and DF set, trying new MTU = 296 2 slip (140.252.13.65) 377 ms 378 ms 377 ms
(例) 図11.13: UDPによる path MTU discoveryの例 296 SLIP 296 552 SLIP 1500 slip--------bsdi sun------------------netb solaris 1500| 1500| |1500 |1500 ============== ====================== ETHERNET ETHERNETbsdi から solarisに ICMP Destination Unreachable Message (Fragementation needed and Don't Fragment was Set) を返す。 bsdiから送られるICMP Messageが、「次のネットワークのMTU」を 含んでいればただちに path MTU がわかる。
そうでない場合は、一度に送るサイズを小さくしたり、DF (DOn't Fragment) ビットを 0 にしたりする(Fig.11.4)。
UDP Header + UDP Data = 8 + 8192 = (1500 - 20) * 5 + 800 ^^^^MTU ^^IP Headerなので、1480byteのパケット5個と800byteのパケット1個が送出される ことが期待される。
Fig.11.17 Ethernetに8192byteのUDPデータグラムを送る 1 0.0 arp who-has svr4 tell bsdi 2 0.001234 (0.0012) arp who-has svr4 tell bsdi 3 0.001941 (0.0007) arp who-has svr4 tell bsdi 4 0.002775 (0.0008) arp who-has svr4 tell bsdi 5 0.003495 (0.0007) arp who-has svr4 tell bsdi 6 0.004319 (0.0008) arp who-has svr4 tell bsdi 7 0.008772 (0.0045) arp reply svr4 is-at 0:0:c0:c2:9b:26 8 0.009911 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26 9 0.011127 (0.0012) bsdi > svr4: (frag 10863:800@7400) 10 0.011255 (0.0001) arp reply svr4 is-at 0:0:c0:c2:9b:26 11 0.012562 (0.0013) arp reply svr4 is-at 0:0:c0:c2:9b:26 12 0.013458 (0.0009) arp reply svr4 is-at 0:0:c0:c2:9b:26 13 0.014526 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26 14 0.015583 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26Fig.11.17 を見ると、
65535 - 20 - 8 = 65507しかし、実際はこれよりも小さい値をとる。 少なくとも576byte以上 (RIPが 512byte以下のパケットになる ように流していたことを思い出そう)である必要があるが、 多くの実装では NFS のデフォルトサイズ8192byteよりも大きくなっている。
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | type (4) | code (0 | checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | unused (must be 0) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ... | | IP Header of Original IP Packet | | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | First 8 byte Data of Original IP Packet | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+