[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 ETHERNET
bsdi から 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 を見ると、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:26
![]()
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+