Я отвечаю на этот старый вопрос, поскольку мы видели ту же проблему с соединениями HTTP (или любыми соединениями TCP), которые оставались открытыми в течение десятков минут без трафика через брандмауэр . Если на самом деле нет брандмауэра, мой ответ не применим.
Вы можете подтвердить эту теорию одновременным tcpdump / wireshark на клиенте и сервере и немного терпения.
Если есть брандмауэр, вам нужно будет убедиться, что пакеты ping происходят чаще, чем время простоя TCP-соединения брандмауэра, чтобы поддерживать соединение. Подумайте дважды, прежде чем увеличивать время ожидания брандмауэра, брандмауэр может быть не до него, как я объясню.
Брандмауэр между вашими клиентами и сервером может выполнять NAT или проверку некоторых пакетов. Эти функции требуют ресурсов на брандмауэре, и количество подключений, которые будет отслеживать брандмауэр, ограничено. Поэтому по умолчанию он «тихо закрывает» эти соединения после простоя, чтобы сэкономить ресурсы.
Я говорю молча, потому что после брандмауэра пакеты не будут отправляться ни одной из сторон, пока клиент или сервер не отправят трафик. В этот момент брандмауэр обычно отвечает пакетом RST. Мы проследили это с помощью tcpdump как с клиента, так и с сервера. Он показал брандмауэр, отправляющий этот пакет RST, как будто со стороны соединения. Однако tcpdump на другой стороне подтвердил, что этот пакет не был отправлен. Это должен быть брандмауэр.
Увеличение времени простоя на брандмауэре может привести к большему количеству проблем, так как брандмауэр может не справиться с количеством соединений. Это может привести к полному сбросу брандмауэра, где вы можете увидеть все сокеты tcp через брандмауэр.
Поскольку вы должны использовать TCP, избегайте использования любой функции брандмауэра, которая потребует отслеживания соединения на брандмауэре (NAT, учет, проверка пакетов). Или убедитесь, что у вас есть брандмауэр с достаточным количеством ресурсов для отслеживания всех соединений.