Источник проблемы лежит в природе протокола TCP/IP. Как правило, источник сеанса TCP/IP и его приемник находятся в различных сетях, и на пути сеанса встречается несколько маршрутизаторов. Хотя бы один из них обычно выполняет NAT-преобразование адресов. Ресурсы маршрутизатора всегда ограничены, поэтому некоторые из них выполняют очистку NAT-таблиц от «мёртвых» сеансов. Сеанс считается «мёртвым», если по нему не передавались пакеты в течение некоторого заданного интервала времени (назовем его интервал очистки). Таким образом, «молчаливый» сеанс может быть принят за «мёртвый» и вычищен из NAT-таблицы.
Краткое описание NAT для понимая вышенаписанного:
NAT — используется для «транcлирования» локальных ip-адресов в глобальные. Допустим клиент, находящийся в локальной сети, обращается к серверу в интернете. Маршрутизатор определяет с какого порта пришел запрос и, зная локальные адреса, сохраняет в специальной таблице соответствие порт — лок. адрес. После маршрутизатор заменяя поля порт, ip адрес (данный маршрутизатор имеет глобальный и локальный ip адрес) — отправляет пакет в сеть. Сервер принимает пакет и отвечает, но сейчас он отвечает именно нашему маршрутизатору. Наш маршрутизатор, приняв пакет от сервера — проверяет поле порт и сверяет его с NAT таблицей. И, заменяя поля порт ip, отправляет пакет нужному локальному ip — то есть нашему клиенту.
Для устранения данной проблемы, во встраиваемых системах без ОС, можно просто слать раз в 5 минут нуль. Во встраиваемых системах с Linux существуют специальные параметр(tcp_keepalive_time), который отвечает за время проверки соединения (повторные SYN, если tcp). Linux будет сам следить за временем отсутствия трафика и проверять соединения, отправляя запросы.