Чтобы было ясно, никто не может удалить TCP-соединение, кроме конечных точек. Это потому, что сетевой протокол IP - это все, что видит сеть, и он не имеет состояния по своему замыслу.
Однако то, что делает «конечную точку», может оказаться не тем, что вы ожидаете. Оператор может установить прозрачный прокси-сервер или маршрутизатор с NAT между ними, и в этот момент им необходимо сохранить состояние для правильной пересылки данных.
NAT - ваша самая большая проблема, потому что она более распространена, и если маршрутизатор решает сбросить состояние для соединения из-за того, что какое-то время не видит трафик, и конечная точка никогда не узнает, пока в следующий раз не попытается отправить данные.
Включение SO_KEEPALIVE
имеет значение по умолчанию 2 часа. Таким образом, маршрутизатор с хорошим поведением должен удерживать состояние как минимум в течение этого времени, но не ставьте на него ферму.
Чтобы ответить на ваш конкретный вопрос ... Если бы это был я, я бы использовал 15 минут или меньше.
Обратите внимание, что только одна сторона должна послать подтверждение активности, поскольку они работают, повторно отправив последний 1 байт потока данных, как если бы он был потерян в сети. Получатель отбрасывает его, потому что он уже видел его, но отправляет новый ACK в ответ, в результате чего трафик идет в обоих направлениях.