[I’m sure we have discussed this before; I’d like a recap relating to TCP especially though]
Q: In either IPv4 or IPv6, if you experience a change of path MTU on the fly, do protocols and applications normally just pick up and adjust ok ? Say you’re using TCP, what happens then - does TCP adjust an existing connection ok ?
(Background: discussed some while ago -
When I’m using my 3G USB emergency failover NIC (‘dongle’) that is connected to my router and which kicks in automatically in seconds if all the DSL lines go down, then there is unfortunately a reduced MTU/MRU of 1440 bytes max due to limitations of the stupid NIC for some reason. Also the 3G service doesn’t support IPv6 so I have to use tunnelling in IPv4, which is automatically handled by my router and ISP with proto 41 (what is it called? - 6in4 ? I keep getting 6in4/6over4 et al mixed up - ‘over’ is the more complex system which is not just using static configuration - is that right?) That means that there’s an additional 20 byte header imposed on IPv6, so a max IPv6 MTU of no more than 1420. I chose however to use IPv6 MTU of 1408 as that gives a magic number for for full ATM cell payloads to maximise protocol efficiency, assuming 32 bytes of one-off headers in my case for a total which is 32 + 1408 = 1440 = 30 * 48, so an integer multiple of 48 bytes for full ATM cell payloads. I therefore have chosen to use IPv6 MTU 1408 all the time, not just during 3G failover, but IPv4 MRU/MTU is 1500 bytes at all times. So I’m relying on hope and the power of mindless optimism, to take care of IPv4. If you’re using TCP with IPv4, is it possible that TCP might drop the link and reestablish it because of ICMP error messages regarding ‘too big’ errors or whatever it’s called in IPv4?
This means that IPv6 failover is going to work seamlessly guaranteed, but as for IPv4 - I don’t know what might happen to IPv4 flows using TCP or not when failover happens.
I don’t somehow want to permanently reduce the size of TCP packets for IPv4, but am I doing the right thing here by leaving it as is? Failover is such a rare event that I don’t want to optimise for a very rare case and disadvantage the common case. Using 1408 is in one sense better than MTU 1500 because the latter is not a full cells 48 bytes multiple (in fact 1500 + 32 bytes overhead = ADSL2 total in my case), however there is also a downside because smaller packets mean more IP and TCP headers sent to achieve a total transfer of some n bytes of payload. I should work out the effect of the latter really, which works in the opposite direction.)
Im wondering if an IPv4 flow might get permanently fragmented for the rest of the duration of the connection. If using TCP, then I suppose a new TCP connection would work out a sane lower TCP MSS ? But not sure what would happen in practice until then, especially given that some systems really hate delivering IPv4 fragments anyway.