Path MTU Discovery ( PMTUD ) — это стандартизированный метод в компьютерных сетях для определения максимального размера передаваемого блока (MTU) на сетевом пути между двумя хостами Интернет-протокола (IP), обычно с целью предотвращения фрагментации IP . PMTUD изначально предназначался для маршрутизаторов в Интернет-протоколе версии 4 (IPv4). [1] Однако все современные операционные системы используют его на конечных точках. В IPv6 эта функция была явно делегирована конечным точкам сеанса связи. [2] В качестве расширения стандартного обнаружения MTU пути, метод, называемый Packetization Layer Path MTU Discovery, работает без поддержки ICMP . [3]
Для пакетов IPv4 обнаружение MTU пути работает путем установки бита флага Don't Fragment (DF) в заголовках IP исходящих пакетов. Затем любое устройство на пути, MTU которого меньше пакета, отбросит его и отправит обратно сообщение ICMP Fragmentation Needed (Type 3, Code 4), содержащее его MTU, что позволяет исходному хосту соответствующим образом уменьшить MTU своего пути. Процесс повторяется до тех пор, пока MTU не станет достаточно малым, чтобы пройти весь путь без фрагментации.
Поскольку маршрутизаторы IPv6 не фрагментируют пакеты, в заголовке IPv6 нет опции «Не фрагментировать» . Для IPv6 обнаружение MTU пути работает, изначально предполагая, что MTU пути совпадает с MTU на интерфейсе канального уровня , где трафик исходит. Затем, аналогично IPv4, любое устройство на пути, MTU которого меньше пакета, отбросит пакет и отправит обратно сообщение ICMPv6 Packet Too Big (Type 2), содержащее его MTU, что позволяет исходному хосту соответствующим образом уменьшить MTU своего пути. Процесс повторяется до тех пор, пока MTU не станет достаточно малым, чтобы пройти весь путь без фрагментации. [4]
Если MTU пути изменится после установки соединения и станет ниже, чем ранее определенный MTU пути, первый большой пакет вызовет ошибку ICMP, и будет найден новый, более низкий MTU пути. Если путь изменится, а новый MTU пути больше, источник не узнает об увеличении, поскольку все маршрутизаторы вдоль нового пути смогут ретранслировать все пакеты, которые отправит источник, используя изначально определенный, более низкий MTU пути. [5] [6] [4]
Многие сетевые устройства безопасности блокируют все сообщения ICMP для предполагаемых преимуществ безопасности, включая ошибки, необходимые для правильной работы PMTUD. Это может привести к соединениям, которые правильно завершают трехстороннее рукопожатие TCP, но затем зависают при попытке передачи данных. Это состояние называется соединением типа «черная дыра» . [7]
Некоторые реализации PMTUD пытаются обойти эту проблему, делая вывод, что большие пакеты полезной нагрузки были потеряны из-за MTU, а не перегрузки канала. Одна из таких схем стандартизирована в RFC 8899, Datagram Packetization Layer Path MTU Discovery (DPLPMTUD). [3] При потере связи DPLPMTUD использует пробные пакеты контролируемых размеров для проверки MTU пути. Подтверждение пробного пакета указывает на то, что MTU пути по крайней мере равен размеру этого пакета. Использование DPLPMTUD стандартизировано в QUIC . [8] Однако для того, чтобы протоколы транспортного уровня работали наиболее эффективно, сообщения ICMP Unreachable (тип 3) все равно должны быть разрешены.
Некоторые маршрутизаторы, включая ядро Linux [9] и Cisco [10] , предоставляют возможность уменьшить максимальный размер сегмента (MSS), объявленный в TCP-рукопожатии в качестве обходного пути. Это известно как MSS clamping .
Другая проблема возникает, когда администраторы сетей не обновляют MTU должным образом между 2 соседними переходами уровня 3, если связь между этими переходами состоит из нескольких сегментов уровня 2 с коммутаторами между ними. Обычно MTU на исходящем интерфейсе L3 берется из первого сегмента L2. Но если второй или последующий сегмент имеет более низкий MTU, то коммутатор, который находится между ними, просто молча отбросит пакет, не сообщая обратно ни о каком ICMP (потому что только переходы уровня 3 могут генерировать ICMP "packet too big"). Таким образом, в этом случае администраторы должны обновить MTU для каждого исходящего интерфейса L3 до минимального MTU сегментов уровня 2, используемых до следующего перехода L3.