У меня есть приложение 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 начнет отправлять проверки активности».Что именно означает «холостой» в этом контексте?Означает ли это, что ничего не получено и ничто не помещено в сеть;или это означает, что ничего не получено и в сокет не отправляются запросы на отправку?