поддержание точного времени в программировании Linux / TCP / IP

как я знаю, есть два способа решения проблема полуоткрытого соединения. Одним из них является технология сердцебиения. а другой, это моя проблема: поддержания активности.

я знаю это поддержания активности иметь три свойства лайк:

tcp_keepalive_time \ tcp_keepalive_intvl \ tcp_keepalive_probes.

И я установил их

5 сек \ 1сек \ 10

Это означает, что подпрограммы keepalive ждут 5 секунд перед отправкой первого пробного сообщения keepalive, а затем отправляют его каждые 1 секунду. Если ответ ACK не получен в течение 10 раз подряд, соединение помечается как разорванное.

Я включил поддержания активности и установите эти свойства для него в моем коде Linux C ++, вызвав setsockopt (), а иногда это работает нормально следующим образом:

десять раз подряд

Но в другое время поддержания активности НЕ отправить, и сообщение о повторной передаче было отправлено и застряло вместо:

введите описание изображения здесь

Это просто отправка 7 раз (время между повторными отправлениями больше, чем 1 секунда, почти 2 ~ 5 секунд). А потом застрял надолго.

Так почему TCP поддержания активности не отправляет иногда? И как я могу убедиться, что поддержания активности Зонд всегда можно отправить. Должен ли я сделать что-то еще?

Спасибо за всю вашу помощь.

РЕДАКТИРОВАТЬ

  1. Как сказал @West, зависание происходит из-за экспоненциального отката после неподтвержденной передачи, но почему повторная передача застряла в процессе отправки поддержания активности зонд? есть ли приоритет или что-то?

0

Решение

Это выглядит как экспоненциальный откат после неподтвержденной передачи. TCP_MAXRT позволит вам установить, как долго вы хотите ждать, прежде чем отказаться от попытки передачи. TM_TCP_MAX_REXMIT позволит вам установить максимальное количество попыток.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]