У нас есть интернет-сервер, прослушивающий порт TCP, к которому пользователи должны подключаться и оставаться на связи.Сервер автоматически закрывает соединение по истечении 60 с без получения пакетов, а клиент отправляет каждые 30 с бездействия небольшой пакет поддержки активности.Этот пакет представляет собой обычный поток данных TCP очень маленького размера, всего около 10 байт.
У нас есть некоторые пользователи, которые систематически быстро отключаются после подключения.Причина на стороне сервера - это время ожидания 60-х годов, которое мы установили.Я использовал tcpdump для фильтрации сообщений от конкретного затронутого пользователя, и то, что я нашел, было довольно странным.
Соединение открывается нормально, и трафик происходит, как и ожидалось.И ожидал, что клиент перейдет в режим «поддержания активности» вскоре после завершения более значимого трафика.
В 01:21:58 клиент открыл соединение с сервером и выполнил обычную процедуру установления связи и входа в систему.
В 01:22:03 клиент отправил последний пакет, когда-либо полученный сервером.Спустя 30 с, в 01:22:33 клиент отправляет пакет поддержки активности, а сервер отвечает на него пакетом RST!
Это было странно, но тщательное изучение показывает, что ошибка не на сервере.Клиент отправил следующий TCP-пакет, который отлично сформирован, что явно является частью потока.Но пакет исходит из другого порта на стороне клиента!Стек tcp сервера видит этот неожиданный пакет и автоматически отвечает пакетом RST.
Теперь, как я полагаю, проблема заключается в том, что пользовательский интернет-маршрутизатор очень странно работает с отслеживанием соединения и неуместнооригинал как-то.Вопрос в том, видел ли кто-нибудь что-то подобное уже и могу ли я что-то сделать, чтобы этого не случилось?Если не считать переписывания всего протокола для обработки переподключений к серверу, если это необходимо.Мы попытались значительно увеличить частоту поддержания активности на тот случай, если маршрутизатор каким-то образом рассчитывал время отслеживания своего соединения, но даже с подтверждением активности каждые 5 с это, кажется, происходит.
Пользовательский маршрутизатор - TRENDNET TEW-432BRP.Если не считать просьбу прошить его прошивку до самой последней версии (которая вышла 2 года назад или около того), я немного растерялся из-за того, что делать.
Вот отфильтрованный след tcpdump соответствующего соединения,Это немного не читается здесь, поэтому я поместил это здесь: http://pastebin.com/eUnjUJTk
Проблема возникает в последних трех строках.Пакет от клиента - это точно ожидаемый пакет поддержки активности в полезной нагрузке, и информация о последовательности полностью совпадает, изменился только порт источника пакета.Затем сервер отклоняет этот пакет, а последний - сервер, активно закрывающий соединение по тайм-ауту клиента.