При работе над серверным приложением, которое работает на 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.
Обоснование включения проверки активности по умолчанию было дано здесь: 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));
, но исправить это непросто.
Я думаю, что настраиваемая ручка должна существовать, но, возможно, было бы лучше не использовать ее по умолчанию.
Я считаю, что разработчик приложения может принять такие решения неправильно и в конечном итоге сисадмин,должен контролировать такую сетевую политику, а не разработчик приложения.