Keepalive сокета с периодической отправкой - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть приложение C / C ++, настроенное следующим образом:

  • Неблокирующий сокет TCP-сервера на платформе Linux
  • Поток, который пишет небольшой пакет (меньше20 байтов) к сокету с частотой 1 Гц
  • Сокет настроен с включенным keepalive и с: keepidle = 5, keepintvl = 5 и keepcnt = 3

Я предполагаю, что механизм keepalive должен обнаруживать физическое отключение сетевого канала.Однако, когда связь обрывается, я не вижу пакетов нулевой длины, которые должны генерироваться механизмом keepalive (я использую tcpdump для мониторинга трафика).У меня сложилось впечатление, что происходит следующее: после отключения кабеля приложение продолжает отправлять запросы, а тот факт, что есть ожидающие отправки запросы, не позволяет активировать механизм keepalive.Это объяснение верно?

Чтобы проверить мое объяснение, я изменил свой тест следующим образом:

  • Неблокирующий сокет TCP-сервера на платформе Linux
  • Циклический потоккоторый записывает небольшой пакет (около 100 байт) в сокет с периодом 30 секунд
  • Сокет настроен с включенным keepalive и с: keepidle = 5, keepintvl = 5 и keepcnt = 2

В этом случае, если я прерву соединение, механизм поддержки активности сработает в течение 15-20 секунд (что я и ожидал).

НаВ связи с этим хотелось бы понять точную семантику tcp_keepidle.Это определяется как: «Количество секунд, в течение которых соединение должно бездействовать, прежде чем TCP начнет отправлять проверки активности».Что именно означает «холостой» в этом контексте?Означает ли это, что ничего не получено и ничто не помещено в сеть;или это означает, что ничего не получено и в сокет не отправляются запросы на отправку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...