(Почему) FreeBSD 'сеть inet.tcp.always_keepalive' нарушает RFC1122?

При работе над серверным приложением, которое работает на FreeBSD и использует TCP, я заметил, что датчики проверки активности TCP отправляются даже при том, что мое приложение явно отключает SO_KEEPALIVE на сокетах TCP.

Согласно разделу RFC1122 4.2.3.6 (сообщения проверки активности TCP):

"Если сообщения проверки активности включены, приложение ДОЛЖНО смочь включить или выключить их для каждого соединения TCP, и они ДОЛЖНЫ принять значение по умолчанию к прочь".

Я нашел, что tuneable сеть inet.tcp.always_keepalive параметра была включена (набор к 1), и что отключение его будет мешать датчикам проверки активности быть отправленным.

Каково обоснование позади включения этого поведения в FreeBSD? Из того, что я могу сказать, Linux и Windows не имеют такой опции, но FreeBSD и Mac OS X делают, таким образом, они нарушают RFC.

Чтобы быть точнее, под каким обстоятельством имело бы смысл игнорировать пожелания приложения?

Это - простая фиксация в моем случае, поскольку я могу отключить опцию, но я хотел бы понять, почему это там.

Этот вопрос показывает, что Linux ведет себя согласно RFC.

6
задан 13 April 2017 в 15:14
2 ответа

Обоснование включения проверки активности по умолчанию было дано здесь: https: //svnweb.freebsd .org / base? view = revision & revision = 47752

Добавьте дескриптор для управления глобальными сообщениями поддержки активности TCP и включите их как по умолчанию.

Несмотря на свое название, он не поддерживает работу TCP-сессий, а убивает их если другой конец ушел в самоволку. Это часто случается с клиентами, которые использовать NAT, динамическое назначение IP или 2 ^ 32 * Верхняя граница времени безотказной работы 10 ^ -3 секунд.

Из-за этого не наблюдается заметного увеличения сетевого трафика: два минимальное количество TCP-пакетов каждые два часа для активного TCP-соединения.

Многие серверы уже включают поддержку активности.

Требования к хосту RFC существуют 10 лет назад, и он не знает о потеря клиентов сегодняшней сети Интернет.

В любом случае лучше отключить поддержку активности по запросу приложения, например (в C):

int val = 0;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));

, но исправить это непросто.

7
ответ дан 3 December 2019 в 00:25

Я думаю, что настраиваемая ручка должна существовать, но, возможно, было бы лучше не использовать ее по умолчанию.

Я считаю, что разработчик приложения может принять такие решения неправильно и в конечном итоге сисадмин,должен контролировать такую ​​сетевую политику, а не разработчик приложения.

0
ответ дан 3 December 2019 в 00:25

Теги

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