Это немного сложнее, чем ответ ChrisW.
Во-первых, уровень транзакций отфильтровывает большинство повторных передач. Для этого он, в большинстве случаев, сравнивает полученное сообщение со списком текущих транзакций. Если транзакция обнаружена, эта транзакция будет в основном поглощать повторные передачи согласно диаграммам в RFC 3261, раздел 17 . Например, транзакция UAC INVITE в состоянии «Продолжение» отбрасывает задержанную ретранслируемую команду INVITE.
Сопоставление происходит одним из двух способов, в зависимости от удаленного стека. Если это стек RFC 3261 (параметр ответвления на верхнем Via начинается с "z9hG4bK"), то все довольно просто. Раздел 17.2.3 содержит полную информацию.
Подобное совпадение отфильтровывает дубликаты / ретранслируемые опции (которые вы упоминаете как особую проблему). Сообщения OPTIONS не образуют диалогов, поэтому просмотр CSeq не будет работать. В частности, если UAS отправляет пять запросов OPTIONS, которые не являются просто ретрансляциями, вы получите пять запросов OPTIONS (и пять транзакций сервера без INVITE).
Повторно переданные предварительные ответы на транзакцию, не являющуюся INVITE, передаются на уровень Transaction-User, или ядро, как его иногда называют, но, кроме первого, окончательные ответы - нет. (Опять же, вы получите это, просто внедрив FSM для этой транзакции - окончательный ответ переводит транзакцию UAC, не являющуюся INVITE, в состояние «Завершено», что исключает дальнейшие ответы.
После этого уровень Transaction-User обычно получает несколько ответов для транзакций INVITE.
Совершенно нормально, что UAS отправляет несколько 183-х, по крайней мере, для INVITE. Например, он может немедленно отправить 100, чтобы погасить ваши повторные передачи (по крайней мере, по ненадежным транспортам), затем несколько 183, 180, может быть, еще 183 и, наконец, 200 (или больше, для ненадежных транспортов).
Важно, чтобы уровень транзакций передавал все эти ответы, потому что прокси и пользовательские агенты обрабатывают ответы по-разному.
На этом уровне ответы, в некотором роде, не передаются повторно. Я должен сказать: UAS не использует логику повторной передачи для отправки множества предварительных ответов (если только он не реализует RFC 3262 ). Повторно отправляется 200 подтверждений «ПРИГЛАСИТЬ», потому что они уничтожают транзакцию UAC. Вы можете избежать их повторной передачи, своевременно отправляя свои ACK.