Рейтинг:2

Что такое уменьшение ПСС на 42?

флаг jp

Я запускаю несколько виртуальных машин в Azure. Виртуальные машины работают в подсети с NSG. Сетевые карты не используют NSG, мы не используем ускоренную сеть.

Я заметил, что когда виртуальная машина взаимодействует с другой виртуальной машиной в той же подсети, используя TCP, значение MSS в пакетах SYN уменьшается на 42. Это означает, что если я отправлю TCP SYN с MSS=876 на другую виртуальную машину в той же сети, другая виртуальная машина захватит TCP SYN с MSS=834:

Клиент:

18:49:27.526527 IP 10.56.142.25.49614 > 10.56.142.108.ssh: флаги [S], seq 3092614737, win 17520, параметры [mss 876,sackOK,TS val 2936204423 ecr 0,nop,wscale 7], длина 0
18:49:27.528398 IP 10.56.142.108.ssh > 10.56.142.25.49614: флаги [S.], seq 1710658781, ack 3092614738, win 28960, параметры [mss 1418, sackOK, TS val 3901957431, wopscale, 3901957431 ecr ], длина 0
18:49:27.528430 IP 10.56.142.25.49614 > 10.56.142.108.ssh: Flags [.], ack 1, win 137, options [nop,nop,TS val 2936204425 ecr 390195731], длина 0

Сервер:

18:49:27.527362 IP 10.56.142.25.49614 > 10.56.142.108.ssh: флаги [S], seq 3092614737, win 17520, параметры [mss 834,sackOK,TS val 2936204423 ecr 0,nop,wscale 7], длина 0
18:49:27.527682 IP 10.56.142.108.ssh > 10.56.142.25.49614: Флаги [S.], seq 1710658781, ack 3092614738, win 28960, параметры [mss 1460, sackOK, TS val 3901957431, val 3901957431 ecr ], длина 0
18:49:27.529167 IP 10.56.142.25.49614 > 10.56.142.108.ssh: Flags [.], ack 1, win 137, options [nop,nop,TS val 2936204425 ecr 390195731], длина 0

Мы используем несколько NVA, и наши SYN-пакеты проходят через несколько переходов, и мы фактически видим, что MSS уменьшается несколько раз, мы первоначально измеряли сокращение на 84, в некоторых случаях мы также измеряли снижение на 138 (действительно, не кратное 42), то есть мы снижаем эффективность нашей сети более чем на 10%.

Я провел некоторое время, наблюдая, как различные сетевые устройства взаимодействуют с MSS. В большинстве случаев для MSS устанавливается фиксированная величина либо путем фиксирования статического значения, либо до MTU пути. PaloAlto будет использовать «корректировку» относительно MTU сетевого интерфейса, который является фиксированным значением. Arista позволит вам установить максимальное значение для входящего или исходящего трафика, опять же абсолютные значения. Некоторые поставщики брандмауэров, такие как PaloAlto, будут уменьшать MSS в случае DoS-атаки и активации файлов cookie SYN, но в этом случае MSS будет одним из 8 возможных значений.

Я считаю, что этот механизм MSS = 42 ломает TCP: если клиент поддерживает большие кадры и отправляет MSS 8860, сервер в Azure получает 8876, сам отвечает 1330, но клиент получает 1246, клиент согласится, что пакеты должны иметь 1246 байт. полезной нагрузки, в то время как сервер отправит 1330 байт полезной нагрузки.

Самая большая проблема в том, что у нас есть случаи, когда трафик работает «случайно».Зажим не выполняется должным образом на стороне экспресс-маршрута, но из-за этого -42 здесь и там MSS фактически уменьшается до значения, которое «подходит», до тех пор, пока не произойдет небольшое изменение в способе маршрутизации пакетов, и вы обнаружите вдруг где-то была неправильная конфигурация.

Есть идеи, как объяснить это сокращение? Я считаю, что это поведение нигде не задокументировано.


РЕДАКТИРОВАТЬ

Просто читаю RFC879

MSS может использоваться совершенно независимо в каждом направлении потока данных. В результате могут быть совершенно разные максимальные размеры в двух направлениях.

Так что это выглядит законно в соответствии с RFC. Все-таки странное поведение.

Massimo avatar
флаг ng
Меня это заинтриговало настолько, что я протестировал его, создав новую виртуальную сеть и различные виртуальные машины с разными операционными системами Windows (2012R2, 2016, 2019) и WireShark. Та же виртуальная сеть, та же подсеть, прямая связь, без маршрутизации и брандмауэров. Я могу подтвердить, что это действительно происходит. Виртуальная машина отправляет SYN с MSS 1460, а другая получает SYN с MSS 1418. Вторая отвечает отправкой ACK с MSS 1460, а первая получает ACK с MSS 1418.
Massimo avatar
флаг ng
Хорошо известно, что сеть Azure довольно... *своеобразна*. Если вы хотите настоящего шока, взгляните на таблицу ARP на виртуальной машине Azure.
флаг cn
`Я считаю, что этот механизм MSS = 42 нарушает TCP`. Я не. Но это было бы легко проверить и предоставить фактические данные.
Ken W MSFT avatar
флаг gb
Это может помочь https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-tcpip-performance-tuning#tcp-mss-window-scaling-and-pmtud
Рейтинг:4
флаг in

В отличие от физической сети, сеть SDN использует дополнительные «байты» для заголовков инкапсуляции (GRE). Видимыми IP-адресами являются CA (адрес клиента), но есть также PA (адрес поставщика), который требует маршрутизации в облачном провайдере. Следовательно, вы увидите меньше доступных MSS, поскольку облачный провайдер применяет дополнительное ограничение TCP в инфраструктуре для выполнения внутренней маршрутизации.

Объяснение CA-PA (hyper-V SDN)

https://docs.microsoft.com/en-us/windows-server/networking/sdn/technologies/hyper-v-network-virtualization/hyperv-network-virtualization-technical-details-windows-server

frigo avatar
флаг jp
Благодарю. Для пакетов, которые уже подходят, зачем зажимать снова и снова? А для пакетов, которые не подходят, почему уменьшение на 42 может помочь? Я думаю, что это уменьшение на 42 является обходным путем для учета неправильного MTU (1500) — возможно, установка MSS на 1418 — это то, что предпочитает SDN, в этом случае при необходимости следует установить 1418 и не меньше.
frigo avatar
флаг jp
Я принимаю этот ответ, потому что он отвечает на вопрос «что», но я все еще считаю, что он не работает.
флаг fr
Это может быть: 20 байтов заголовка IPv4, 8 байтов заголовка GRE (4 обязательных байта + 4 необязательных байта с контрольной суммой), 14 байтов внутреннего заголовка Ethernet => что дает точные 42 байта.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.