Сбрасывается ли тайм-аут для UDP-соединения через NAT каждый раз, когда пакет отправляется ИЛИ принимается клиентом, или существуют какие-либо (общие) реализации, которые требуют, чтобы клиент активно что-то отправлял, чтобы поддерживать соединение?
Я разрабатываю приложение для потоковой передачи UDP, и мне интересно, нужно ли мне заставлять клиентов отправлять периодические контрольные сообщения в дополнение к тому, которое сервер уже отправляет, если нет данных полезной нагрузки.
NAT требует таблица состояний, т. е. отображение исходного (src_ip, src_port)
кортеж в перезаписанный кортеж. В некоторых реализациях эта таблица также будет включать (dst_ip, dst_port)
.
Теоретически таймаут, по истечении которого записи удаляются из этой таблицы состояний, будет сброс каждый раз, когда новый пакет послал изнутри NAT наружу. Это может также сбрасываться каждый раз, когда новый пакет получили в обратном направлении, но RFC 3022 не является конкретным по этому поводу. Он только говорит, что состояние будет удалено после завершения сеанса, но не определяет, что составляет сеанс.
Следовательно, пока вы продолжаете отправлять исходящий трафик, он должен продолжать поступать.
Однако если основной поток трафика входящий Это может быть необходимым для периодической отправки исходящего контрольного пакета от клиента к серверу.
UDP - это протокол без установления соединения: нет тайм-аута и сообщений об инициации / завершении. Как правило, это также довольно недружелюбно к NAT, особенно потому, что нет способа узнать, когда соединение разорвано и когда устройство NAT может сбросить правило пересылки.
Итак, да, если вы используете UDP через NAT, вам нужно будет отправить контрольные сообщения, чтобы устройство NAT знало, что отображение все еще используется. Однако частота отправки контрольного сообщения будет разной для разных устройств и настроек.