0
Я обычно просто раз в 30–60 секунд шлю пустой пакет или пинг, если протокол позволяет. В Java через ScheduledExecutorService кидаю, в Python через threading.Timer или asyncio. TCP keep-alive тоже можно включить, но на некоторых сетях он не работает или слишком долго срабатывает, так что кастомный пинг надёжнее.