Sip.js: reInvite ν›„ ACK의 경둜 헀더가 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 01μ›” 17일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: onsip/SIP.js

SIP.js 라이브러리λ₯Ό 0.7.5μ—μ„œ 0.9.1둜 μ—…λ°μ΄νŠΈν•˜λ €κ³  ν•©λ‹ˆλ‹€.

톡화 쀑 λΉ„λ””μ˜€λ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ Reinviteλ₯Ό λ§Œλ“€ λ•Œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” Kamailio μ„œλ²„κ°€ reINVITE ν˜ΈμΆœμ—μ„œ Record-Route 헀더λ₯Ό 보내지 μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. SIP RFC에 λ”°λ₯΄λ©΄ 이 Kamailio λ™μž‘μ€ μ •μƒμž…λ‹ˆλ‹€.

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

경둜 μ„ΈνŠΈλŠ” μ‘λ‹΅μ˜ Record-Route 헀더 ν•„λ“œμ— μžˆλŠ” URI λͺ©λ‘μœΌλ‘œ μ„€μ •λ˜μ–΄μ•Ό ν•˜λ©° μ—­μˆœμœΌλ‘œ 취해지며 λͺ¨λ“  URI λ§€κ°œλ³€μˆ˜λ₯Ό 보쑴해야 ν•©λ‹ˆλ‹€. 응닡에 Record-Route 헀더 ν•„λ“œκ°€ μ—†μœΌλ©΄ 경둜 μ„ΈνŠΈλ₯Ό 빈 μ„ΈνŠΈλ‘œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€(MUST). 이 경둜 집합은 λΉ„μ–΄ μžˆλ”λΌλ„ 이 λŒ€ν™” μƒμžμ˜ ν–₯ν›„ μš”μ²­μ— λŒ€ν•΄ κΈ°μ‘΄ 경둜 집합을 μž¬μ •μ˜ν•©λ‹ˆλ‹€. 원격 λŒ€μƒμ€ μ‘λ‹΅μ˜ Contact 헀더 ν•„λ“œμ—μ„œ URI둜 μ„€μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€(MUST).

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

λŒ€ν™” λ‚΄μ˜ μš”μ²­μ—λŠ” Record-Route 및 Contact 헀더 ν•„λ“œκ°€ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€(MAY). κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ μš”μ²­μœΌλ‘œ 인해 λŒ€ν™” μƒμžμ˜ 경둜 집합이 μˆ˜μ •λ˜μ§€λŠ” μ•Šμ§€λ§Œ 원격 λŒ€μƒ URIλŠ” μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

sip.js 버전 0.7.5μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ Route ν—€λ”λŠ” 항상 request(this.request)μ—μ„œ κ°€μ Έμ™”μ§€λ§Œ sip.js 버전 0.9.1μ—μ„œλŠ” λ§ˆμ§€λ§‰ 응닡(this.response)μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€. t λ ˆμ½”λ“œ 경둜 헀더가 μžˆμŠ΅λ‹ˆλ‹€.

버전 κ°„μ˜ 차이점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
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

κ·Έλž˜μ„œ λ‚΄κ°€ ν•œ 일은 0.9.1 μ½”λ“œλ₯Ό μ•½κ°„ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. 응닡에 Record-Route 헀더가 있으면 ACK에 μΆ”κ°€ν•©λ‹ˆλ‹€. 이전 μš”μ²­μ—μ„œ κ°€μ Έμ˜€λ €κ³  ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ? Routeκ°€ μ—†λ‹€λ©΄ κ·Έλƒ₯ λΉ„μ›Œλ‘˜ κ²ƒμž…λ‹ˆλ‹€.

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

μ™œ 행동을 λ°”κΎΈμ…¨λŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚΄ λ˜λŠ” λ‹Ήμ‹ μ˜ μ‹€μˆ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이봐 Denis, λ‚˜λŠ” 이것을 μ‘°μ‚¬ν•˜κ³  James와 그것에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ²„κ·Έμ΄μ§€λ§Œ λŒ€ν™” λ‚΄μ—μ„œ 경둜 μ„ΈνŠΈλ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ ν–ˆλ‹€λŠ” μ μ—μ„œ μ›λž˜ λ™μž‘λ„ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

https://tools.ietf.org/html/rfc3261#section -12.1.1 에 μ„€λͺ…λœ λŒ€ν™” ν˜•μ„± μš”μ²­μ— 응닡할 λ•Œ UAS λ™μž‘μ€ λ ˆμ½”λ“œ 경둜 헀더λ₯Ό λ³΅μ‚¬ν•˜κ³ , 이λ₯Ό λ°˜λŒ€λ‘œ ν•œ λ‹€μŒ λŒ€ν™” μƒμžμ— μ €μž₯ν•˜λŠ” 것이어야 ν•©λ‹ˆλ‹€. λ²”μœ„ λ³€μˆ˜λ₯Ό 경둜 μ„ΈνŠΈλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

λŒ€ν™” λ‚΄μ—μ„œ μš”μ²­μ— 응닡할 λ•Œ https://tools.ietf.org/html/rfc3261#section -12.2에 μ„€λͺ…λœ λŒ€λ‘œ UAS λ™μž‘μ€ λŒ€ν™” λ‚΄μ—μ„œ λ²”μœ„κ°€ μ§€μ •λœ κΈ°μ‘΄ 경둜 μ„ΈνŠΈλ₯Ό μž¬μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

라우트 μ„ΈνŠΈλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜κΈ° μœ„ν•œ λŒ€ν™” λ‚΄μ˜ μš”μ²­μ— λŒ€ν•œ λ ˆμ½”λ“œ 라우트 ν—€λ”μ˜ 쑴재 여뢀에 λ”°λ₯Έ ν˜„μž¬ λ™μž‘μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ 이 문제λ₯Ό μˆ˜μ •ν•  κ²ƒμ΄μ§€λ§Œ κ·Έ λ™μ•ˆ λͺ¨λ“  μš”μ²­(초기 및 순차)에 λŒ€ν•΄ record_route()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμœΌλ―€λ‘œ λ ˆμ½”λ“œ 경둜 헀더가 https://tools.ietf 와 같은 순차적 μš”μ²­μ— 있게 λ©λ‹ˆλ‹€

λͺ¨λ“  7 λŒ“κΈ€

μ°Ύκ³  μžˆλŠ” μ„Ήμ…˜μ€ μ‹€μ œλ‘œ μ„Ήμ…˜ 14μž…λ‹ˆλ‹€.

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

이 경우 μ„Ήμ…˜ 12κ°€ μ μš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•΄λ‹Ή μ„Ήμ…˜μ— λŒ€ν•΄ μ½”λ“œμ˜ κΈ°λŠ₯을 ν™•μΈν•˜μ‹­μ‹œμ˜€. 일반적으둜 reINVITE 지원은 0.7.xμ—μ„œ μ§€μ›λ˜λŠ” κ²ƒμœΌλ‘œ 간주될 만큼 μ•ˆμ •μ μ΄μ§€ μ•Šμ•˜μ§€λ§Œ 지원은 0.8.xμ—μ„œ 사양에 맞게 κ΅¬μ²΄ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ„Ήμ…˜ 14λ₯Ό μ² μ €νžˆ ν™•μΈν–ˆλŠ”λ° "λΌμš°νŒ… μ„ΈνŠΈ"의 μ‚¬μš©/μˆ˜μ •μ— λŒ€ν•΄ 아무 말도 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ„Ήμ…˜ 12둜 λŒμ•„κ°€μ„œ "경둜 집합"은 초기 INVITE 처리 쀑에 ν˜•μ„±λ˜μ–΄μ•Ό ν•˜λ©° λŒ€ν™” μƒμž λ‚΄ λ©”μ‹œμ§€ 처리 쀑에 μˆ˜μ • 없이 μž¬μ‚¬μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
RFC의 μ μ ˆν•œ 뢀뢄에 λŒ€ν•œ μΈμš©μ€ μœ„μ— λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€.

μ§€κΈˆ μ§ˆλ¬Έμ€ "경둜 μ„ΈνŠΈ"κ°€ λŒ€ν™” μƒμžμ—μ„œ μˆ˜μ •λœ μ΄μœ μž…λ‹ˆλ‹€(sip.js 버전 0.9.1은 λ§ˆμ§€λ§‰ 응닡 this.responseμ—μ„œ κ°€μ Έμ˜΄). μ΄λŠ” RFCλ₯Ό μ€€μˆ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이봐 Denis, λ‚˜λŠ” 이것을 μ‘°μ‚¬ν•˜κ³  James와 그것에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ²„κ·Έμ΄μ§€λ§Œ λŒ€ν™” λ‚΄μ—μ„œ 경둜 μ„ΈνŠΈλ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ ν–ˆλ‹€λŠ” μ μ—μ„œ μ›λž˜ λ™μž‘λ„ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

https://tools.ietf.org/html/rfc3261#section -12.1.1 에 μ„€λͺ…λœ λŒ€ν™” ν˜•μ„± μš”μ²­μ— 응닡할 λ•Œ UAS λ™μž‘μ€ λ ˆμ½”λ“œ 경둜 헀더λ₯Ό λ³΅μ‚¬ν•˜κ³ , 이λ₯Ό λ°˜λŒ€λ‘œ ν•œ λ‹€μŒ λŒ€ν™” μƒμžμ— μ €μž₯ν•˜λŠ” 것이어야 ν•©λ‹ˆλ‹€. λ²”μœ„ λ³€μˆ˜λ₯Ό 경둜 μ„ΈνŠΈλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

λŒ€ν™” λ‚΄μ—μ„œ μš”μ²­μ— 응닡할 λ•Œ https://tools.ietf.org/html/rfc3261#section -12.2에 μ„€λͺ…λœ λŒ€λ‘œ UAS λ™μž‘μ€ λŒ€ν™” λ‚΄μ—μ„œ λ²”μœ„κ°€ μ§€μ •λœ κΈ°μ‘΄ 경둜 μ„ΈνŠΈλ₯Ό μž¬μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

라우트 μ„ΈνŠΈλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜κΈ° μœ„ν•œ λŒ€ν™” λ‚΄μ˜ μš”μ²­μ— λŒ€ν•œ λ ˆμ½”λ“œ 라우트 ν—€λ”μ˜ 쑴재 여뢀에 λ”°λ₯Έ ν˜„μž¬ λ™μž‘μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ 이 문제λ₯Ό μˆ˜μ •ν•  κ²ƒμ΄μ§€λ§Œ κ·Έ λ™μ•ˆ λͺ¨λ“  μš”μ²­(초기 및 순차)에 λŒ€ν•΄ record_route()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμœΌλ―€λ‘œ λ ˆμ½”λ“œ 경둜 헀더가 https://tools.ietf 와 같은 순차적 μš”μ²­μ— 있게 λ©λ‹ˆλ‹€

λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. λ¬Έμ œκ°€ μ‹€μ œλ‘œ ν•΄κ²°λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ 이 λ¬Έμ œκ°€ μ’…λ£Œλœ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?
λŒ€ν™” μƒμžλ₯Ό μ°Ύκ³  κ±°κΈ°μ—μ„œ λ³΅μ‚¬ν•˜μ—¬ 헀더λ₯Ό 얻을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

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μ μ΄μ§€λ§Œ ν•΄κ²° 방법은 이것과 λΉ„μŠ·ν•˜μ§€ μ•Šμ„κΉŒ μƒκ°ν•©λ‹ˆλ‹€.

μ›λž˜ κΈ°μžκ°€ 문제λ₯Ό 닫은 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 λ‹€μ‹œ μ—΄μ—ˆκ³  μš°λ¦¬λŠ” 이 μ½”λ“œλ₯Ό 적극적으둜 μ‚΄νŽ΄λ³΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

@egreenmachine κ°μ‚¬ν•©λ‹ˆλ‹€. μ΄λŠ” 보λ₯˜/보λ₯˜ ν•΄μ œ(μž¬μ΄ˆλŒ€)에도 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

μš°λ¦¬κ°€ 가진 κ²½μš°λŠ” 보λ₯˜ μž¬μ΄ˆλŒ€ ν›„ μ˜¬λ°”λ₯Έ κ²½λ‘œκ°€ μ—†λŠ” BYE νŒ¨ν‚·μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰