Какая была бы лучшая реализация для обнаружения повторяющегося сообщения SIP?

StackOverflow https://stackoverflow.com/questions/3155940

  •  01-10-2019
  •  | 
  •  

Вопрос

Я написал SIP UAC, и я попробовал несколько способов обнаруживать и игнорировать повторение входящих сообщений от UAS, но с каждым подходом я пытался, что-то пошло не так, моя проблема в том, что все сообщения, связанные с Один и тот же вызов имеет одну и ту же подпись, и сравнить все текст сообщения слишком много, поэтому мне было интересно, какой параметр, который составляют сообщение, я должен рассматривать при попытке обнаружить эти повторяющиеся сообщения.

ОБНОВИТЬ:

У меня была проблема с входящими вариантами, которые я обрабатывал с отправкой сервера пустой ОК. (ОБНОВЛЕНИЕ: Через некоторое время тестирования я заметил, что я все еще получаю каждый сейчас, а затем получаю еще один запрос на опции, мало каждые несколько секунд, поэтому я пытаюсь ответить с плохой просьбой, и теперь я только получаю запрос на опции один раз только каждая регистрация / перерегистрация)

В настоящее время у меня есть повторение сообщений SecurityInpogress, а также разные сообщения об ошибках, таких как занятые здесь, и недоступны, я получаю так много из них, и он поправляет мой журнал, я хотел бы отфильтровать их.

Любая идея, как это добиться?

ОБНОВИТЬ:

Я попробую свою технику, прежде чем отправлять обратно, возможно, это решит мои проблемы

Вот что я использовал, это работает красиво:

private boolean compare(SIPMessage message1, SIPMessage message2) {
    if (message1.getClass() != message2.getClass())
        return false;
    if (message1.getCSeq().getSeqNumber() != message2.getCSeq().getSeqNumber())
        return false;
    if (!message1.getCSeq().getMethod().equals(message2.getCSeq().getMethod()))
        return false;
    if (!message1.getCallId().equals(message2.getCallId()))
        return false;
    if (message1.getClass()==SIPResponse.class)
        if(((SIPResponse)message1).getStatusCode()!=((SIPResponse)message2).getStatusCode())
            return false;
    return true;
}

Спасибо, Адам.

Это было полезно?

Решение

Это немного сложнее, чем ответ Chrisw.

Во-первых, слой транзакции фильтрует большинство повторных передач. Это делает это по большинству вещей, сравнивая принятое сообщение против списка текущих транзакций. Если найденная транзакция, эта транзакция будет в основном проглатывает повторные передачи согласно диаграммам в RFC 3261, раздел 17. Отказ Например, транзакция INCITINE UAC в судебном состоянии будет отбросить задержку ретрансляционного приглашения.

Соответствие происходит одним из двух способов, в зависимости от удаленного стека. Если это стек RFC 3261 (параметр ветвления в верхней части через начнутся с «Z9HG4BK»), то вещи довольно просты. Раздел 17.2.3 охватывает полную информацию.

Подобное совпадение отфильтровывает дублирующие / повторные параметры (которые вы упоминаете как конкретную проблему). Параметры сообщений не образуют диалоги, поэтому глядя на CSEQ не будет работать. В частности, если UAS отправляет пять запросов на опции, которые не просто повторные передачи, вы получите пять запросов на опции (и пять не приглашенных серверов).

Регистрация Временные ответы на незаметную транзакцию передаются вплоть до слоя транзакций-пользователей, или ядра, поскольку его иногда называют, но кроме первого, конечных ответов нет. (Опять же, вы получаете это просто путем внедрения ФСМ для этой транзакции - окончательный ответ ставит UAC не приглашенную транзакцию в завершенное состояние, которая падает любые дополнительные ответы.

После этого слой транзакции-пользователей обычно получат несколько ответов для приглашенных транзакций.

Это прекрасно нормально для UA, чтобы отправить несколько 183-х, по крайней мере, для приглашения. Например, можно сразу же отправить 100, чтобы утолить повторные передачи (по крайней мере, над ненадежными транспортировками), затем несколько 183-х, 180, может быть, еще несколько 183, и, наконец, 200 (или более, для ненадежных транспортных средств).

Важно, чтобы слой транзакции забивает все эти ответы, поскольку прокси и пользовательские агенты обрабатывают ответы по-разному.

На этом уровне ответы не так, повторно передаются. Я должен сказать: UAS не использует логику повторной передачи для отправки нагрузок предварительных ответов (если это не реализует RFC 3262.). 200 ОК для приглашений обижается, потому что они разрушают транзакцию UAC. Вы можете избежать их ретрансляции, отправив свои ACKSS.

Другие советы

Я думаю, что сообщение является дубликатом / идентичным, если его ...

  • Cseq.
  • Вызов-идентификатор
  • и имя метода (например, «приглашение»)

... Значения соответствуют другому сообщению.

Обратите внимание, что ответное сообщение имеет то же CSEQ, что и запрос, к которому он отвечает; И, что один запрос вы получаете несколько, временных, но не дублирующихся ответов (например, звон, а затем OK).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top