This is just for my own reference about IPv6 MTU. i needed some question to add it to - and i cho-cho-choose you.
First is our Ethernet packet, which normally we ignore:
+-------------------------+
| Ethernet - 16 bytes |
| 6 byte destination MAC |
| 6 byte source MAC |
| 4 byte type |
+-------------------------+
| |
/ 1,500 byte payload /
| |
+-------------------------+
Now we add IPv4 or IPv6 header:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv6 - 40 bytes |
| 10 byte control flags | | 6 byte control flags |
| 2 byte total length | | 2 byte payload length |
| 4 byte source addr | | 16 byte source addr |
| 4 byte dest addr | | |
+-------------------------+ | 16 byte dest addr |
| | | |
| | +-------------------------|
| | | |
/ 1,480 payload / / 1,460 payload /
| | | |
+-------------------------+ +-------------------------+
Next we add my reality of a PPPoE connection, which takes 8 bytes out of the packet for the PPPoE PADS tag:
+-------------------------+
| Ethernet - 12 bytes |
| 6 byte destination MAC |
| 6 byte source MAC |
| 4 byte type |
+-------------------------+
| PPPoE PADS - 8 bytes |
+-------------------------+
| |
/ 1,492 payload /
| |
+-------------------------+
Which reduces the MTU available for our IPv4 and IPv6 traffic:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| PPPoE PADS - 8 bytes | | PPPoE PADS - 8 bytes |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv6 - 40 bytes |
| 10 byte control flags | | 6 byte control flags |
| 2 byte total length | | 2 byte payload length |
| 4 byte source addr | | 16 byte source addr |
| 4 byte dest addr | | |
+-------------------------+ | 16 byte dest addr |
| | | |
| | +-------------------------|
| | | |
/ 1,472 payload / / 1,452 payload /
| | | |
+-------------------------+ +-------------------------+
And then, in my case, i'm using Hurricane Electric's 6in4 tunneling, since my ISP doesn't offer native IPv6 connectivity. This means that my IPv6 traffic is wrapped in an IPv4 packet:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| PPPoE PADS - 8 bytes | | PPPoE PADS - 8 bytes |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv4 - 20 bytes |
| 10 byte control flags | | 10 byte control flags |
| 2 byte total length | | 2 byte total length |
| 4 byte source addr | | 4 byte source addr |
| 4 byte dest addr | | 4 byte dest addr |
+-------------------------+ +-------------------------+
| | | IPv6 - 40 bytes |
| | | 6 byte control flags |
| | | 2 byte payload length |
| | | 16 byte source addr |
| | | |
| | | 16 byte dest addr |
| | | |
| | +-------------------------|
| | | |
/ 1,472 payload / / 1,432 payload /
| | | |
+-------------------------+ +-------------------------+
But the important number is the MTU, which is the size that IPv4 or IPv6 has available to itself (including its headers):
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| PPPoE PADS - 8 bytes | | PPPoE PADS - 8 bytes |
+-------------------------+ +-------------------------+
| | | IPv4 - 20 bytes |
/ MTU = 1492 / | 10 byte control flags |
| | | 2 byte total length |
+-------------------------+ | 4 byte source addr |
| 4 byte dest addr |
+-------------------------+
| |
/ MTU = 1472 |
| |
+-------------------------+
Next is the confusion about the payload size, used when pinging someone with the do not fragment flag. ICMP operates over IP, and adds its own header overhead:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv6 - 40 bytes |
| 10 byte control flags | | 6 byte control flags |
| 2 byte total length | | 2 byte payload length |
| 4 byte source addr | | 16 byte source addr |
| 4 byte dest addr | | |
+-------------------------+ | 16 byte dest addr |
| ICMP - 8 bytes | | |
+-------------------------+ +-------------------------|
| | | ICMP - 8 bytes |
| | +-------------------------+
| | | |
/ 1,472 ping payload / / 1,452 ping payload /
| | | |
+-------------------------+ +-------------------------+
Note: This is why you can ping with 1,452 byte payload before you need to fragment.
In my case, with the overhead of a PPPoE PADS tag:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| PPPoE PADS - 8 bytes | | PPPoE PADS - 8 bytes |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv6 - 40 bytes |
| 10 byte control flags | | 6 byte control flags |
| 2 byte total length | | 2 byte payload length |
| 4 byte source addr | | 16 byte source addr |
| 4 byte dest addr | | |
+-------------------------+ | 16 byte dest addr |
| ICMP - 8 bytes | | |
+-------------------------+ +-------------------------|
| | | ICMP - 8 bytes |
| | +-------------------------+
| | | |
/ 1,464 ping payload / / 1,444 ping payload /
| | | |
+-------------------------+ +-------------------------+
And my additional overhead of 6in4:
IPv4 IPv6
+-------------------------+ +-------------------------+
| Ethernet - 12 bytes | | Ethernet - 12 bytes |
| 6 byte destination MAC | | 6 byte destination MAC |
| 6 byte source MAC | | 6 byte source MAC |
| 4 byte type | | 4 byte type |
+-------------------------+ +-------------------------+
| PPPoE PADS - 8 bytes | | PPPoE PADS - 8 bytes |
+-------------------------+ +-------------------------+
| IPv4 - 20 bytes | | IPv4 - 20 bytes |
| 10 byte control flags | | 10 byte control flags |
| 2 byte total length | | 2 byte total length |
| 4 byte source addr | | 4 byte source addr |
| 4 byte dest addr | | 4 byte dest addr |
+-------------------------+ +-------------------------+
| ICMP - 8 bytes | | IPv6 - 40 bytes |
+-------------------------+ | 6 byte control flags |
| | | 2 byte payload length |
| | | 16 byte source addr |
| | | |
| | | 16 byte dest addr |
| | | |
| | +-------------------------|
| | | ICMP - 8 bytes |
| | +-------------------------+
| | | |
/ 1,464 ping payload / / 1,424 ping payload /
| | | |
+-------------------------+ +-------------------------+
And you see why i can only ping with a payload of 1,424 bytes.