Sip.js: Falta el encabezado de ruta en ACK después de volver a invitar.

Creado en 17 ene. 2018  ·  7Comentarios  ·  Fuente: onsip/SIP.js

Estamos intentando actualizar nuestra biblioteca SIP.js de 0.7.5 a 0.9.1.

Tenemos un problema cuando hacemos Reinvite para agregar Video en la llamada. El problema es que nuestro servidor Kamailio no envía el encabezado Record-Route en la llamada reINVITE. Según SIP RFC, este comportamiento de Kamailio es normal.

https://tools.ietf.org/html/rfc3261#section -12.1.2

El conjunto de rutas DEBE establecerse en la lista de URI en el campo de encabezado Record-Route de la respuesta, tomado en orden inverso y conservando todos los parámetros de URI. Si no hay un campo de encabezado Record-Route presente en la respuesta, el conjunto de rutas DEBE establecerse en el conjunto vacío. Este conjunto de rutas, incluso si está vacío, anula cualquier conjunto de rutas preexistente para solicitudes futuras en este cuadro de diálogo. El objetivo remoto DEBE establecerse en el URI del campo de encabezado de contacto de la respuesta

https://tools.ietf.org/html/rfc3261#section -12.2

Las solicitudes dentro de un cuadro de diálogo PUEDEN contener los campos de encabezado Record-Route y Contact. Sin embargo, estas solicitudes no hacen que se modifique el conjunto de rutas del cuadro de diálogo, aunque pueden modificar el URI de destino remoto.

Como puedo ver en la versión 0.7.5 de sip.js, el encabezado de la ruta siempre se tomó de la solicitud (this.request) pero en la versión 0.9.1 de sip.js se toma de la última respuesta (this.response) que en nuestro caso no ' t tiene un encabezado Record-route.

Aquí está la diferencia entre las versiones:
0.7.5) https://www.dropbox.com/s/jo055zsn9286q17/Screenshot%202018-01-17%2013.40.41.png?dl=0
0.9.1) https://www.dropbox.com/s/u41kh91h3kzvt27/Screenshot%202018-01-17%2013.42.13.png?dl=0

Entonces, lo que hice fue cambiar un poco su código 0.9.1. Si la respuesta tiene encabezados Record-Route, los agregaremos a ACK, no intentaremos tomarlo de la solicitud que teníamos antes. Si no tenemos Ruta, la dejaremos vacía.

https://www.dropbox.com/s/1rrhyfnxe9sa88a/Screenshot%202018-01-17%2013.50.11.png?dl=0

Solo quiero saber por qué cambió su comportamiento. ¿Hay un error mío o tuyo?

bug

Comentario más útil

Hola Denis, miré esto y hablé con James al respecto.

Esto es un error, pero parece que el comportamiento original tampoco fue correcto, ya que permitió que el conjunto de rutas se actualizara dentro de un cuadro de diálogo.

El comportamiento de UAS al responder a una solicitud de formación de diálogo, que se describe en https://tools.ietf.org/html/rfc3261#section -12.1.1, debería ser copiar los encabezados de ruta de registro, invertirlos y guardarlos en un diálogo variable de ámbito como la ruta establecida.

Al responder a solicitudes dentro de un diálogo, el comportamiento de UAS, como se describe en https://tools.ietf.org/html/rfc3261#section -12.2, debe ser reutilizar el conjunto de rutas existente dentro del ámbito del diálogo.

El comportamiento actual de depender de la presencia de encabezados de ruta de registro en las solicitudes dentro de un cuadro de diálogo para volver a crear el conjunto de rutas no es correcto.

Arreglaremos esto en la próxima versión, pero mientras tanto, puede solucionarlo llamando a record_route () para todas las solicitudes, iniciales y secuenciales, de modo que los encabezados de ruta de registro estén en solicitudes secuenciales como https: //tools.ietf. org / html / rfc3261 # la sección -12.2 dice que es opcional.

Todos 7 comentarios

La sección que está buscando es en realidad la sección 14:

https://tools.ietf.org/html/rfc3261#section -14

Verifique la funcionalidad de su código con esa sección, ya que la sección 12 no se aplica en este caso. En términos generales, el soporte de reINVITE no fue lo suficientemente estable en 0.7.x para siquiera considerarse compatible, pero el soporte se completó según las especificaciones en 0.8.x.

Revisé minuciosamente la sección 14 y no dice nada sobre el uso / modificación del "conjunto de enrutamiento"

Pero volviendo a la sección 12 - "conjunto de rutas" - tiene que formarse durante el procesamiento inicial de INVITE y reutilizarse sin modificaciones mientras se procesan los mensajes en el diálogo.
Más arriba se citan las partes apropiadas de RFC.

Por ahora, la pregunta es por qué el "conjunto de rutas" se modifica en el diálogo (sip.js versión 0.9.1 toma de la última respuesta this.response), ya que no cumple con RFC.

Hola Denis, miré esto y hablé con James al respecto.

Esto es un error, pero parece que el comportamiento original tampoco fue correcto, ya que permitió que el conjunto de rutas se actualizara dentro de un cuadro de diálogo.

El comportamiento de UAS al responder a una solicitud de formación de diálogo, que se describe en https://tools.ietf.org/html/rfc3261#section -12.1.1, debería ser copiar los encabezados de ruta de registro, invertirlos y guardarlos en un diálogo variable de ámbito como la ruta establecida.

Al responder a solicitudes dentro de un diálogo, el comportamiento de UAS, como se describe en https://tools.ietf.org/html/rfc3261#section -12.2, debe ser reutilizar el conjunto de rutas existente dentro del ámbito del diálogo.

El comportamiento actual de depender de la presencia de encabezados de ruta de registro en las solicitudes dentro de un cuadro de diálogo para volver a crear el conjunto de rutas no es correcto.

Arreglaremos esto en la próxima versión, pero mientras tanto, puede solucionarlo llamando a record_route () para todas las solicitudes, iniciales y secuenciales, de modo que los encabezados de ruta de registro estén en solicitudes secuenciales como https: //tools.ietf. org / html / rfc3261 # la sección -12.2 dice que es opcional.

Estoy teniendo el mismo problema, ¿por qué este problema está cerrado mientras el problema no está realmente solucionado?
Me las arreglé para obtener los encabezados buscando el cuadro de diálogo y copiándolos desde allí.

diff --git a/src/SIPMessage.ts b/src/SIPMessage.ts
index a95e8ee..3226160 100644
--- a/src/SIPMessage.ts
+++ b/src/SIPMessage.ts
@@ -755,6 +755,9 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
     if (!contact || !contact.uri) {
       throw new Error("Failed to parse contact header.");
     }
+
+    const dialog = this.ua.dialogs[this.callId + this.fromTag + this.toTag];
+
     const ruri = contact.uri;
     const request = new OutgoingRequest(
       C.ACK,
@@ -767,7 +770,7 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
         fromTag: this.fromTag,
         toUri: this.to.uri,
         toTag: this.toTag,
-        routeSet: this.getHeaders("record-route").reverse()
+        routeSet: (dialog ? dialog.routeSet : this.getHeaders("record-route").reverse())
       },
       options ? options.extraHeaders : undefined,
       options ? options.body : undefined

0 puntos para el estilo, creo, pero creo que la solución será similar a esta.

Parece que el reportero original cerró el problema. Lo he vuelto a abrir y estamos examinando activamente este código.

Gracias @egreenmachine. Esto también afecta a mantener / retirar (volver a invitar).

El caso que tuvimos fue que el paquete BYE no tenía las rutas correctas después de una nueva invitación en espera.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

josephfrazier picture josephfrazier  ·  26Comentarios

raphaelhovsepyan picture raphaelhovsepyan  ·  6Comentarios

diegoteixeir4 picture diegoteixeir4  ·  5Comentarios

Juli0GT picture Juli0GT  ·  5Comentarios

seanbright picture seanbright  ·  3Comentarios