Что происходит при истечении SO_KEEPALIVE?

141
28 марта 2018, 05:39

Что происходит c TCP-соединением при истечении таймаута SO_KEEPALIVE?

on = 1;
::setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, 1);

В документации сказано только то, что по истечению посылается SIGPIPE.

Что происходит с самим соединением? Закрывается ли при этом сокет?

Upd: Речь про Linux

Answer 1

С точки зрения программиста ситуация после истечения таймаута и отсутствия ответа или неудовлетворительности оного обрабатывается практически также как и корректное закрытие TCP соединения клиентом:

  • Соединение закрывается, но дескриптор сокета — нет.
  • poll/select возвращают сокет как готовый для чтения
  • read/recv из оного возвращают ошибку (если верить Стивенсу, процитированному выше, то errno устанавливается в одно из значений ETIMEDOUT, ECONNRESET, EHOSTUNREACH).
  • write/send приведут к посылке сигнала SIGPIPE и/или возврату ошибки (дабы не соврать не буду утверждать какой именно)
Answer 2

Это выдержка из книги "Unix. Разработка сетевых приложений.(Стивенс)". В ней описано почти Всё.

Когда параметр SO_KEEPALIVE установлен для сокета TCP и в течение двух часов не происходит обмена данными по сокету в любом направлении, TCP автоматически посылает собеседнику проверочное сообщение (keepalive probe). Это сообщение — сегмент TCP, на который собеседник должен ответить. Далее события могут развиваться по одному из трех сценариев.

  1. Собеседник отвечает, присылая ожидаемый сегмент ACK. Приложение не получает уведомления (поскольку все в порядке). TCP снова отправит одно проверочное сообщение еще через два часа отсутствия активности в этом соединении.
  2. Собеседник отвечает, присылая сегмент RST, который сообщает локальному TCP, что узел собеседника вышел из строя и перезагрузился. Ошибка сокета, требующая обработки, устанавливается равной ECONNRESET и сокет закрывается.
  3. На проверочное сообщение не приходит ответ от собеседника. Код TCP, происходящий от Беркли, отправляет восемь дополнительных проверочных сообщений с интервалом в 75 с,пытаясь выявить ошибку. TCP прекратит попытки, если ответа не последует в течение 11 мин и15 с после отправки первого сообщения.

ПРИМЕЧАНИЕ

HP-UX обрабатывает поверочные сообщения так же, как и обычные данные, то есть второе сообщение отсылается по истечении периода повторной передачи, после чего для каждого последующего пакета интервал ожидания удваивается, пока не будет достигнут максимальный интервал (по умолчанию — 10 мин).

Если на все проверочные сообщения TCP не приходит ответа, то ошибка сокета, требующая обработки, устанавливается в ETIMEDOUTи сокет закрывается. Но если сокет получает ошибку ICMP (Internet Control Message Protocol — протокол управляющих сообщений Интернета) в ответ на одно из проверочных сообщений, то возвращается одна из соответствующих ошибок, но сокет также закрывается. Типичная ошибка ICMP в этом сценарии — Host unreachable(Узел недоступен) — указывает на то, что узел собеседника не вышел из строя, а только является недоступным. При этом ошибка, ожидающая обработки, устанавливается в EHOSTUNREACH. Это может произойти из-за отказа сети или при выходе удаленного узла из строя и обнаружении этого последним маршрутизатором.

READ ALSO
Освобождение памяти vector C++

Освобождение памяти vector C++

Доброго времени суток, возникла проблема с освобождением памятиВесь код цельный копипастить не буду,вот элементарная часть в которой уже...

137
Запуск onboard вместе с приложением

Запуск onboard вместе с приложением

Можно ли вставить system("onboard"); в приложение Qt при его запуски от root?

128
“std::out_of_range” при обращении к элементу строки

“std::out_of_range” при обращении к элементу строки

Задание: перевернуть все части строки, заключенные в скобках, начиная с самого нижнего уровня вложения, удалить сами скобкиДля строки "Code(Cha(lle)nge)"...

168