Может ли домашнее соединение PPPoE получить доступ ко всем веб-сайтам, независимо от настроек MTU инфраструктуры сайта?

597
SilverlightFox

Я просто пытаюсь разобраться с MTU, MRU и MSS.

Мой интерес изначально исходил из ответа на этот пост: Угроза безопасности PING? :

НЕОБХОДИМО блокировать некоторые типы пакетов ICMP, в частности, сообщение ICMP «пункт назначения недоступен», поскольку блокирование этого сообщения нарушает обнаружение MTU пути, а симптомы состоят в том, что пользователи DSL (за уровнем PPPoE, который ограничивает MTU до 1492 байтов) не могут получить доступ к веб-сайтам, которые блокировать эти пакеты (если они не используют веб-прокси, предоставленный их провайдером).

С тех пор я нашел эту статью, которая подтверждает это:

Некоторые люди, использующие веб-серверы (особенно некоторые банки), настраивают свою сеть так, чтобы они блокировали сообщение об ошибке, которое отправляется обратно, когда пакет слишком велик. Это было бы неплохо, если бы они также не пытались отправлять 1500 байт-пакетов с установленным битом DF. В результате пакет отбрасывается, когда он попадает на канал длиной до 1500 MTU и должен повторить попытку. В конце концов он может попробовать меньший размер пакета, но это может быть через 20 секунд. Это глупая настройка сети со стороны человека, работающего с веб-сервером.

Мой вопрос: действительно ли это реальная проблема? Насколько я знаю, я никогда не видел, чтобы это произошло на моем соединении BT Infinity, которое использует PPPoE. Предположительно это имеет те же ограничения, что и упомянутые выше (мой MTU маршрутизатора установлен на 1492).

Может ли это быть мой маршрутизатор, использующий MSS-зажим ?

1
Сколько лет этим статьям? Это было довольно горячей проблемой в конце 90-х, начале 00-х годов; не так много сегодня. Nevin Williams 9 лет назад 0
@NevinWilliams: пост Sec.SE относится к 2011 году, а пример с упоминанием банковского примера - 2009 год. Мне было бы интересно узнать, почему сегодня это не проблема? SilverlightFox 9 лет назад 0
Не очень большая проблема сегодня. Корпоративные политики, общепринятые практики и даже стеки IP-адресов в конечном итоге адаптируются, хотя часто с ледяной скоростью, к решению подобных проблем. Устранение особенно распространенной проблемы может происходить на одном или нескольких уровнях: значения по умолчанию для ядра, значения по умолчанию для пакета программного обеспечения, шаблоны конфигурации, вмешательство интернет-провайдера, функции программного обеспечения маршрутизатора, альтернативные протоколы, сниженная надежность устаревших служб. Nevin Williams 9 лет назад 0

1 ответ на вопрос

5
gronostaj

MTU stands for maximum transmission unit, ie. the IP datagram size limit (in bytes). Default and maximum MTU allowed by Ethernet is 1500.

Let's imagine we have a network like the one below. C is a client; S is a server; X and Y are routers.

 ___ ___ ___ ___ | C | | X | | Y | | S | |___|========|___|--------|___|========|___| 

There are four networks between C and S. Three of them have max MTU of 1500 and one has lower MTU of 1200 (just an example). The low MTU network is marked with dashes.

C tries Path MTU Discovery on the path to S. It sends an IP datagram with 20 B header and 1480 B payload, 1500 B in total. The Don't fragment (DF) flag is set in IP header.

The datagram reaches X. X tries to pass it further to Y, but Y responds with Fragmentation needed ICMP message because its MTU is too low and the DF flag is set. C receives that message and learns that path MTU is lower than 1500. It then tries again with smaller payload, each time receiving Fragmentation needed, until payload size reaches 1180 B. 1180 + 20 = 1200, so the datagram finally reaches S successfully and path MTU is discovered.

PMTUD works only if Y replies with Fragmentation needed ICMP messages. Otherwise C won't know that the datagram was dropped.

Your router sends proper ICMP messages, everything works as intended, there's no reason for Internet to be broken for you because of lower MTU.


What happens if PMTUD doesn't work? (eg. because of ICMP blocked in either direction)

Neither end of the connection actually has to know path MTU. IP protocol can handle that. It may be sub-optimal, but it will work.

IP is capable of transmitting a payload of any size, no matter what the path MTU is. This property is enforced by the OSI model: IP works in layer 3. Layer 4 shouldn't have to care about the underlying protocol, so no size limit can be placed on the payload.

Basic IP header is 20 bytes long. Included in this header are two interesting flags: Don't fragment (DF) and More fragments (MF), and also the Fragment offset field (FO). I have already mentioned 20 B header size and the DF flag before. (I'm talking about IPv4 header, IPv6 is different)

IP is capable of splitting a big payload into fragments and reassembling it at the destination.

Let's say we want to transmit a 5000 B payload from C to D which are both in the same network (ie. connected through a switch or hub). MTU of C and D's NICs is 1500. Each fragment's header is 20 B long, so max data size for a single datagram is 1480 B (1500 - 20). The payload will be sent in 4 datagrams: (MF - More fragments, FO - Fragment offset)

  1. Bytes 1-1480, MF: 1, FO: 0
  2. Bytes 1481-2560, MF: 1, FO: 1480
  3. Bytes 2561-4440, MF: 1, FO: 2560
  4. Bytes 4441-5000, MF: 0, FO: 4440

The DF flag doesn't matter in this case. MF is 0 for the last fragment, 1 otherwise. FO is the offset of the first byte in a fragment (offsets are indexed starting with 0). These datagrams will be automatically reassembled on target NIC.

Now C wants to send a 5000 B payload to S. Let's assume it magically knows path MTU (or C's NIC is configured with MTU=1200, so C sends 1200 B datagrams). It will fragment the payload like this:

  1. Bytes 1-1180, MF: 1, FO: 0
  2. Bytes 1181-2360, MF: 1, FO: 1180
  3. Bytes 2361-3540, MF: 1, FO: 2360
  4. Bytes 3541-4720, MF: 1, FO: 3540
  5. Bytes 4721-5000, MF: 0, FO: 4720

This is the most optimal fragmentation of the payload.

If C doesn't know and cannot determine path MTU, it must rely on intermediate nodes to fragment the payload correctly. C has MTU=1500, so it sends 4 datagrams as shown in the C→D example above. However, those datagrams will have to be fragmented again to be transmitted through the X—Y connection. Each of the datagrams received by Y has to be at most 1200 B long, so 1500 B-long datagrams will be split into two: 1200 B and 320 B (20 B extra for second header). This fragmentation results in 7 datagrams (and thus 7 headers) being transmitted from X to S instead of optimal 5:

  1. Bytes 1-1180, MF: 1, FO: 0
  2. Bytes 1181-1480, MF: 1, FO: 1180
  3. Bytes 1481-2260, MF: 1, FO: 1480
  4. Bytes 2261-2560, MF: 1, FO: 2260
  5. Bytes 2561-4140, MF: 1, FO: 2560
  6. Bytes 4141-4440, MF: 1, FO: 4140
  7. Bytes 4441-5000, MF: 0, FO: 4440

Note that this time fragments aren't equal. Datagrams aren't recombined and fragmented again optimally in intermediate nodes, only fragmentation is performed.

In practice intermediate routers may be configured to deny performing fragmentation themselves and require transmission endpoints to use optimal MTU, so intermediate node fragmentation shouldn't be relied upon. PMTUD is preferred.

Благодарю. В вашем примере S нужно попробовать PMTUD для ответа на C? Что, если брандмауэр (в примере с банком) настроен так, чтобы не разрешать пакеты ICMP любого типа (скажем, между X и Y)? Я предполагаю, что это сломало бы вещи, однако я не склонен слышать об этом типе проблемы очень часто. SilverlightFox 9 лет назад 0
@SilverlightFox Если в PMTUD происходит сбой в любом направлении, отправитель может попытаться использовать промежуточные маршрутизаторы для фрагментации. Пожалуйста, смотрите мои изменения для деталей. gronostaj 9 лет назад 0
это выглядит очень впечатляюще, можете ли вы предоставить какие-либо источники для изучения этого материала? barlop 9 лет назад 0
@barlop Я могу порекомендовать [Руководство по TCP / IP] (http://www.tcpipguide.com/free/index.htm), оно доступно онлайн бесплатно и охватывает множество вопросов, связанных с сетью. gronostaj 9 лет назад 0
@gronostaj: Ура, мой вопрос, кажется, был закрыт. Я сейчас отредактировал это. Есть ли шанс, что вы сможете проголосовать, чтобы открыть его, если вы думаете, что сейчас по теме? SilverlightFox 9 лет назад 0

Похожие вопросы