TCP MSS в Linux должно быть не менее 88 (включая / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Мой вопрос: откуда они взяли «60 + 60 + 8» и почему? Я получаю, что 20 + 20 исходит из заголовка IP + заголовок TCP.
РЕДАКТИРОВАТЬ: После более пристального взгляда на заголовки, формула выглядит для меня следующим образом:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
Вопрос все еще стоит: почему ? Почему ядро Linux использует эту формулу, тем самым запрещая (принудительный поток) сегменты TCP, скажем, 20 байтов? Подумайте, что здесь.
EDIT2: вот мой вариант использования. При принудительном снижении MSS для сокета / соединения все пакеты, отправляемые стеком, будут иметь небольшой размер. Я хочу установить низкий MSS при работе с iperf для пакетов / секунду тестирования. Я не могу получить IP-пакеты размером менее 128 байт (кадры Ethernet 142 байт) по проводам из-за этого нижнего предела для MSS! Я хотел бы получить максимально приближенный к размеру кадра Ethernet 64 байта согласно RFC 2544. Теоретически это должно быть возможно: 18 + 20 + 20 <64.
источник
TCP_MIN_MSS
.TCP_MIN_MSS
. Почему это не может быть 1? Какой RFC это нарушит? Какую теоретическую / практическую проблему это вызовет? Вы уверены, что это "за пределами спецификации"? "Разные минимумы"? Здесь есть только один минимум интереса: самый маленький MSS, разрешенный ядром.Ответы:
Реализация должна поддерживать заголовки TCP и IP максимального размера, каждый из которых составляет 60 байтов.
Реализация должна поддерживать 576-байтовые дейтаграммы, что даже с максимальными заголовками означает более 8 байтов данных в дейтаграмме. Чтобы отправить дейтаграммы с более чем 8 байтами данных, IP-фрагментация должна поместить как минимум 8 байтов данных как минимум в один из пакетов, представляющих фрагменты дейтаграммы. Таким образом, реализация должна поддерживать не менее 8 байтов данных в пакете.
Собирая это вместе, реализация должна поддерживать пакеты 60 + 60 + 8 байтов.
Когда мы отправляем пакеты, которые являются частью потока TCP, они имеют 20-байтовый заголовок IP (плюс параметры) и 20-байтовый заголовок TCP (плюс параметры). Это оставляет минимум (60 + 60 + 8) - (20 + 20) байтов, оставшихся для данных и опций. Следовательно, это максимум, который мы можем смело предположить для реализации TCP MSS.
источник
60
шоу появляется дваждыЯ не знаю, откуда взялась эта цифра, но могу сказать, что она выходит за рамки спецификации. Минимальный MTU, поддерживаемый для IP-сетей, составляет 576 байтов, что составляет 512 байтов данных плюс до 64 байтов для заголовков IP + TCP и параметров TCP. Это значение было выбрано для того, чтобы дать достаточно низкие накладные расходы в типичном случае.
Мое чтение фрагментов кода ядра показывает, что отображаемое вами значение не является произвольным. Была более старая практика, чтобы просто использовать необработанную константу 64 вместо
TCP_MIN_MSS
. Поэтому я предполагаю, что есть какая-то странная сеть IP-over-Foo, с которой столкнулись разработчики ядра, и они решили, что могут повысить ценность того, что вы видите, как.Что это за нестандартный тип сети, однако, я не могу сказать.
источник