как я знаю, есть два способа решения проблема полуоткрытого соединения. Одним из них является технология сердцебиения. а другой, это моя проблема: поддержания активности.
я знаю это поддержания активности иметь три свойства лайк:
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 поддержания активности не отправляет иногда? И как я могу убедиться, что поддержания активности Зонд всегда можно отправить. Должен ли я сделать что-то еще?
Спасибо за всю вашу помощь.
РЕДАКТИРОВАТЬ
Это выглядит как экспоненциальный откат после неподтвержденной передачи. TCP_MAXRT позволит вам установить, как долго вы хотите ждать, прежде чем отказаться от попытки передачи. TM_TCP_MAX_REXMIT позволит вам установить максимальное количество попыток.
Других решений пока нет …