Starlink MTU size: path MTU measured at 1500 bytes

The path MTU from a home Starlink connection was 1500 bytes over both IPv4 and IPv6, on every path tested. That is the largest packet a computer whose own link MTU is 1500 bytes can send, so the test can't show whether the path would carry more; it covers one connection, behind its home router, in two reads a few minutes apart.

By Rowan Hale · Published

Promo: $100 off Starlink with my referral link

If you've never been a Starlink customer and you order an eligible Residential or Roam plan through my link, we both get Starlink's reward for your country. In the US, that is a $100 credit on your second monthly bill, and I get $100 too. Use my referral link

1500-byte packets reached all three test hosts, over IPv4 and IPv6

A link's maximum transmission unit (MTU) is the largest packet it carries in one piece, and a path's MTU is the smallest link MTU along it. RFC 8201 puts it as "the minimum link MTU of all the links in a path between a source node and a destination node" (section 2, checked October 2026).

The test ran in October 2026 from a wired computer on the home network, on a home Starlink connection, in two reads a few minutes apart. Every route to the test hosts left through the wired interface, so no VPN, exit node or tunnel carried the traffic. In each read, for each host, over IPv4 and over IPv6, tracepath ran to its end. Then three pings sized to make 1500-byte packets went out with don't-fragment set and a 2-second reply timeout. Three more, sized to make 1501-byte packets, were refused by the computer before they were sent.

The three hosts are public machines that their operators offer for network tests (each page checked October 2026):

Table 1. Path MTU from a wired computer on a home Starlink connection to three public test hosts, in two reads a few minutes apart, October 2026. Each read sent three 1500-byte pings with don't-fragment set to each host, over IPv4 and over IPv6, and tracepath gave the same start and end figures in both reads.
IP Host Replies to 3 pings, reads 1 and 2 tracepath path MTU, start and end Last tracepath answer from
IPv4 scanme.nmap.org 3, 3 1500, 1500 the host
IPv4 speedtest.newark.linode.com 3, 3 1500, 1500 the host
IPv4 proof.ovh.net 3, 3 1500, 1500 the host
IPv6 scanme.nmap.org 3, 3 1500, 1500 the host
IPv6 speedtest.newark.linode.com 3, 3 1500, 1500 another address, answering for the host, in both reads
IPv6 proof.ovh.net 3, 3 1500, 1500 the host

Note

For the Newark host over IPv6, the answer that ended each trace came from an address other than the host's, in both reads. In the second read, which checked, every ping reply came from the host's own address, so its size result stands.

Path MTU discovery starts from the MTU of the sender's first link. Over IPv4 the sender sets the Don't Fragment (DF) bit, and a router that can't forward such a packet whole discards it and returns an ICMP message meaning "fragmentation needed and DF set" (RFC 1191, section 2, checked October 2026). Over IPv6, a router that can't forward a packet because it is larger than the next link's MTU must return a Packet Too Big message (RFC 4443, section 3.2, checked October 2026). Either way, the sender lowers its estimate (RFC 8201, section 3). tracepath traces a path "discovering MTU along this path" and shows the path MTU where it changes (iputils 20250605, checked October 2026). In every trace here it stayed at 1500 from start to end, and no ping drew a "too big" message, so no hop reported a smaller MTU.

The pings check the same thing from end to end. Each 1500-byte ping reached its host and its reply came back. That covers hops that don't answer tracepath, which only the pings test. The path also starts at the home router, so the router's own settings are part of the result: nothing on these paths, the home router and Starlink's network included, cut packets below 1500 bytes at the time.

Over IPv4, the traces began with the same kinds of hops as the trace in the guide to self-hosting without a public IPv4 address, which this page doesn't repeat.

A 1472-byte ping is a 1500-byte IPv4 packet

ping's -s option sets the number of data bytes, and ICMP adds an 8-byte header to them (ping(8), iputils 20250605, checked October 2026). An ICMPv6 echo message also has 8 bytes before its data: type, code, checksum, identifier and sequence number (RFC 4443, section 4.1, checked October 2026). A minimum IPv4 header is 20 bytes, and an IPv6 header is 20 bytes longer, 40 (RFC 8200, section 8.3, checked October 2026).

IP ping data (-s), bytes ICMP header, bytes IP header, bytes Packet, bytes
IPv4 1472 8 20 1500
IPv6 1452 8 40 1500
IPv4 1473 8 20 1501
IPv6 1453 8 40 1501

A ping with don't-fragment set that gets replies with 1472 bytes of data over IPv4 means a 1500-byte packet crossed the path. 1472 is the ping's payload, and the MTU is the whole packet.

Over IPv6, routers never split a packet: "fragmentation in IPv6 is performed only by source nodes", RFC 8200 says (section 4.5). So a 1500-byte IPv6 ping either crosses whole or meets a router that must answer with a Packet Too Big message (RFC 4443, section 3.2).

To repeat the test on Linux with iputils, run these commands, shown here with one of the three hosts:

scrolls sideways
tracepath -4 -n scanme.nmap.org
ping -4 -M do -n -c 3 -W 2 -s 1472 scanme.nmap.org
tracepath -6 -n scanme.nmap.org
ping -6 -M do -n -c 3 -W 2 -s 1452 scanme.nmap.org

-M do turns don't-fragment on, -c 3 sends three pings and -W 2 sets a 2-second reply timeout (ping(8)). The Nmap page asks visitors to go easy on its host: "A few scans in a day is fine". Other systems' ping commands take different options, and this page doesn't cover them.

1501-byte packets never left the computer

Limitation

Every ping sized to make a 1501-byte packet, 1473 bytes of data over IPv4 and 1453 over IPv6, was refused by the test computer's own kernel before it was sent: 3 of 3 in every case, in both reads. The computer's link MTU is 1500 bytes, and its kernel held no cached path MTU for any host before or after either read. ping(8) says why the refusal happens: with -M do, packets are "subject to PMTU checks by kernel, packets too large will be rejected". So this half of the test checks the computer's own link, not the path, and the test can't show whether the path would carry more than 1500 bytes.

On a computer whose own link MTU is 1500 bytes, a ping with -M do and 1473 bytes of data (IPv4) or 1453 (IPv6) that fails at once, with a local error saying the message is too long for an MTU of 1500, was refused by that computer. The failure says nothing about your provider.

If the error names an MTU smaller than 1500, that reading doesn't apply. The computer is checking the packet against a lower limit than its link's, and that limit can come from the path: a sender lowers its estimate after a "too big" message from a router (RFC 1191, section 2; RFC 8201, section 3).

Tunnel tools count WireGuard's headers as 80 bytes

Limitation

No tunnel ran in this test. The tunnel numbers below are what each tool's own code sets, read from its source in October 2026, and none was measured on this connection.

Table 2. What each tool's code sets, checked October 2026. Not tested on this connection.
Tool Interface MTU its code sets Headers it counts, bytes Source On this connection
WireGuard, Linux kernel driver 1420 bytes for a new interface: 1500 minus 80 32 + 8 + 40 = 80 device.c, Linux 6.18 not tested
wg-quick on Linux, config with no MTU the route's MTU minus 80: 1420 on a 1500-byte route 80 linux.bash, wireguard-tools v1.0.20250521 not tested
Tailscale 1280 bytes unless TS_DEBUG_MTU sets another size; 1360 bytes on the wire 40 + 8 + 4 + 4 + 8 + 16 = 80 mtu.go, Tailscale v1.90.0 not tested

In the Linux kernel, a new WireGuard interface gets dev->mtu = ETH_DATA_LEN - overhead (device.c, Linux 6.18). ETH_DATA_LEN is 1500, Ethernet's maximum payload (if_ether.h). The overhead is WireGuard's smallest data message, plus an 8-byte UDP header (RFC 768) and the larger of the IPv6 and IPv4 headers, IPv6's 40 (RFC 8200). That message is 32 bytes: a 4-byte type, a 4-byte key index, an 8-byte counter and a 16-byte authentication tag (messages.h, with the tag's size in chacha20poly1305.h). So the overhead is 80 bytes, and the interface starts at 1420. All checked October 2026.

The tag comes after the encrypted data: in RFC 8439's AEAD (authenticated encryption with associated data), the output is the ciphertext, then the tag (section 2.8, checked October 2026).

The parts of three packets: IPv4 ping, IPv6 ping and WireGuard over IPv6 Each packet is 1500 bytes on the link. IPv4 ping: a 20-byte IPv4 header, an 8-byte ICMP header and 1472 bytes of data. IPv6 ping: a 40-byte IPv6 header, an 8-byte ICMPv6 header and 1452 bytes of data. WireGuard over IPv6, from its code and not tested: a 40-byte IPv6 header, an 8-byte UDP header, 16 bytes of type, key index and counter, an encrypted packet of up to 1420 bytes and a 16-byte authentication tag. IPv4 ping, -s 1472 IPv4 header ICMP header ping data 20 8 1472 1500 bytes IPv6 ping, -s 1452 IPv6 header ICMPv6 header ping data 40 8 1452 1500 bytes WireGuard over IPv6, on a 1500-byte link from WireGuard's code, not tested 1 2 3 4 5 40 8 16 1420 16 1500 bytes 1 IPv6 header 2 UDP header 3 type, key index, counter 4 encrypted packet 5 authentication tag Headers drawn to scale; long data shortened at the break. Sizes in bytes. The parts of three packets: IPv4 ping, IPv6 ping and WireGuard over IPv6 Each packet is 1500 bytes on the link. IPv4 ping: a 20-byte IPv4 header, an 8-byte ICMP header and 1472 bytes of data. IPv6 ping: a 40-byte IPv6 header, an 8-byte ICMPv6 header and 1452 bytes of data. WireGuard over IPv6, from its code and not tested: a 40-byte IPv6 header, an 8-byte UDP header, 16 bytes of type, key index and counter, an encrypted packet of up to 1420 bytes and a 16-byte authentication tag. IPv4 ping, -s 1472 IPv4 header ICMP header ping data 20 8 1472 1500 bytes IPv6 ping, -s 1452 IPv6 header ICMPv6 header ping data 40 8 1452 1500 bytes WireGuard over IPv6, on a 1500-byte link from WireGuard's code, not tested IPv6 header UDP header type, key index, counter encrypted packet authentication tag 40 8 16 1420 16 1500 bytes Headers drawn to scale; long data shortened at the break. Sizes in bytes.
Three 1500-byte packets, first byte at the left. The headers take 28 bytes over IPv4 and 48 over IPv6; WireGuard's take 80, which leaves 1420 for the packet inside. Rust marks the size that crossed every path tested in October 2026 (Table 1); the WireGuard row is from its code, not tested. Sizes as the page cites them: RFC 8200, RFC 4443, ping(8), RFC 768, WireGuard's messages.h and device.c, and the Linux kernel's chacha20poly1305.h and if_ether.h; the tag's place after the data, RFC 8439; checked October 2026. The numbers are also in the table under "A 1472-byte ping is a 1500-byte IPv4 packet" and in Table 2.

wg-quick on Linux uses the MTU line of the interface's config when there is one. Without it, the script reads the MTU of the routes to the peers' endpoints, falls back to the default route's and then to 1500, and sets the interface 80 bytes lower (linux.bash, wireguard-tools v1.0.20250521, checked October 2026). On a 1500-byte route, that is 1420.

Tailscale counts the same 80 bytes for the worst case, an IPv6 outer header. Its list is a "20-byte IPv4 header or 40-byte IPv6 header", an 8-byte UDP header, a 4-byte type, a 4-byte key index, an 8-byte nonce and a 16-byte authentication tag (mtu.go, Tailscale v1.90.0, checked October 2026). In this file the size doesn't depend on the link: DefaultTUNMTU(), which the file uses to set the interface's MTU, returns 1280, its default "safe" MTU, unless the debug setting TS_DEBUG_MTU gives another size. It returns 1280 even with TS_DEBUG_ENABLE_PMTUD, the debug setting for path MTU probing, turned on. With the 80 bytes added, 1280 is 1360 bytes on the wire. 1280 is also the smallest MTU that IPv6 allows on any link (RFC 8200, section 5).

The paths in this test carried 1500-byte packets. No tunnel ran over them, so this page doesn't show what a tunnel's packets did.

When a packet is too big for a link and the "too big" message never reaches the sender, RFC 8201 describes connections that "complete the TCP three-way handshake correctly but then hang when data is transferred" (section 1). This test didn't look for that.

Not tested here

  • A tunnel's MTU over this connection, for WireGuard, Tailscale or a work VPN. Whether changing an MTU fixes a VPN problem is untested too.
  • A maximum or a default. Nothing above 1500 bytes could leave the test computer, so this page shows no maximum. Starlink's own pages on MTU haven't been read for this page, so it shows no default either.
  • Wi-Fi. Both reads ran over a wired link.
  • Other connections and other times. The two reads were a few minutes apart, and a path's MTU "may change over time, due to changes in the routing topology" (RFC 8201, section 3).

See how this fits with the other home tests, for a homelab.

Promo: $100 off Starlink with my referral link

If you've never been a Starlink customer and you order an eligible Residential or Roam plan through my link, we both get Starlink's reward for your country. In the US, that is a $100 credit on your second monthly bill, and I get $100 too. Use my referral link

Sources

  1. RFC 8201: Path MTU Discovery for IP version 6, IETF, accessed
  2. RFC 8200: Internet Protocol, Version 6 (IPv6) Specification, IETF, accessed
  3. RFC 1191: Path MTU Discovery, IETF, accessed
  4. RFC 4443: Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, IETF, accessed
  5. RFC 768: User Datagram Protocol, IETF, accessed
  6. RFC 8439: ChaCha20 and Poly1305 for IETF Protocols, IRTF, accessed
  7. ping(8), iputils 20250605, man7.org, accessed
  8. tracepath(8), iputils 20250605, man7.org, accessed
  9. drivers/net/wireguard/device.c, Linux 6.18, Linux kernel, accessed
  10. drivers/net/wireguard/messages.h, Linux 6.18, Linux kernel, accessed
  11. include/crypto/chacha20poly1305.h, Linux 6.18, Linux kernel, accessed
  12. include/uapi/linux/if_ether.h, Linux 6.18, Linux kernel, accessed
  13. src/wg-quick/linux.bash, wireguard-tools v1.0.20250521, WireGuard, accessed
  14. net/tstun/mtu.go, Tailscale v1.90.0, Tailscale, accessed
  15. scanme.nmap.org home page, Nmap Project, accessed
  16. speedtest.newark.linode.com home page, Akamai (Linode), accessed
  17. proof.ovh.net home page, OVHcloud, accessed
  18. Does Starlink have a referral program?, Starlink, accessed
  19. Referral Program Terms (US), section 4.1, Starlink, accessed

Retest log

  1. Test Two reads, over IPv4 and IPv6, of the path MTU from a wired computer on the home network to three public test hosts.
  • Can you host a server on Starlink without a public IPv4 address?

    Not directly over IPv4: without a public IPv4 address, connections from the internet arrive at your provider's NAT, and a port forward on your own router doesn't reach it.

  • Is Starlink good for a homelab? A verdict from five tests

    On the one home Starlink connection tested, packets of 1500 bytes crossed over IPv4 and IPv6 in October 2026, and round trips over IPv4 spiked at four set seconds each minute in one of two one-hour tests, with 901 of 143,462 pings lost over both; the ways around carrier-grade NAT (CGNAT), such as a tunnel that starts inside your network, aren't tested here.