-. 301번전화(192.168.1.84) <-> 교환기1(192.168.1.75) <-> 교환기2(192.168.1.99) <-> 901번전화(192.168.1.91)
==============================================================================================
(오류를 수신하면 실패처리. 여기서는 성공흐름만 기술)
(화살표는 위 각 피어의 연결순에에 따른 흐름 방향으로 한다)
(#참조1) ---- 참고로 최초의 invite 전문을 기술한다 (SDP 구간의 IP, PORT, codec를 잘 살펴보길 바란다)
{
INVITE sip:901@192.168.1.75;user=phone SIP/2.0
Via: SIP/2.0/UDP 192.168.1.84:5665;branch=z9hG4bK2321379481070318965;rport
From: <sip:301@192.168.1.75:5060>;tag=213211572
To: "901" <sip:901@192.168.1.75;user=phone>
Call-ID: 13543225727311-28077265939338@192.168.1.84
CSeq: 1 INVITE
Contact: <sip:301@192.168.1.84:5665>
Max-Forwards: 70
Supported: replaces, join, path, 100rel
User-Agent: Fanvil X3S 2.10.2.6887 0c383e22b24a
P-Early-Media: supported
Allow-Events: talk,hold
Allow: INVITE, ACK, OPTIONS, BYE, CANCEL, REFER, NOTIFY, INFO, PRACK, UPDATE, MESSAGE
Content-Type: application/sdp
Content-Length: 390
v=0
o=sdp_admin 2590228546 861010529 IN IP4 192.168.1.84
s=A conversation
c=IN IP4 192.168.1.84
t=0 0
m=audio 10060 RTP/AVP 9 0 8 18 2 4 101
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:2 G726-32/8000
a=rtpmap:4 G723/8000
a=fmtp:4 bitrate=6.3
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
}
1. 301번전화는 교환기1에게 전화를 건다
--> INVITE sip:901@192.168.1.75;user=phone SIP/2.0 (with SDP, without nonce)
2. 교환기1은 301번전화에게 인증실패를 보낸다
<-- SIP/2.0 401 Unauthorized (with nonce) {인증실패코드가 401이다}
3. 301번전화는 교환기1에게 ack 응답을 한다
--> ACK sip:901@192.168.1.75;user=phone SIP/2.0
4. 301번전화는 교환기1로부터 인증실패와 함게 받은 nonce 값을 첨부하여 다시 전화를 건다
--> INVITE sip:901@192.168.1.75;user=phone SIP/2.0 (with SDP, with nonce)
5. 교환기1은 301번전화의 invite에 OK 응답한다
<-- SIP/2.0 100 Trying {전화를 걸고 있다는 뜻의 코드가 100 이다}
6. 교환기1은 다이알플랜(전화번호처리규칙)에 따라 901번호가 연결된 교환기2로 전화를 건다
[ Dial("PJSIP/301-00000002", "PJSIP/901@pbx99") ]
--> INVITE sip:901@192.168.1.99:5060 SIP/2.0 (with SDP, without nonce : 교환기끼리는 인증통과)
7. 교환기2는 교환기1로부터 invite를 수신하면 OK 응답한다
<-- SIP/2.0 100 Trying {전화를 걸고 있다는 뜻의 코드가 100 이다}
8. 교환기1은 (7.항목에 연계하여) invite 결과로 100을 수신하면 다음을 기다린다
9. 교환기2는 다이알플랜(전화번호처리규칙)에 따라 901번호가 등록된 장치를 찾아 전화를 건다
[ Dial("PJSIP/pbx75-0000001c", "PJSIP/901") ]
--> INVITE sip:901@192.168.1.91:5529 SIP/2.0 (with SDP, without nonce)
10. 901번전화는 교환기2의 invite에 OK 응답한다
<--- SIP/2.0 100 Trying {전화를 걸고 있다는 뜻의 코드가 100 이다}
11. 901번전화는 스피커에 전화벨을 울리고 그 내역을 교환기2로 보낸다
<-- SIP/2.0 180 Ringing {901번전화에 벨이 울리고 있다는 신호}
12. 교환기2는 180 신호를 받으면 901번전화가 벨이 울리고 있다는 것을 인지한다. 해당내역을 교환기1로 보낸다
<-- SIP/2.0 180 Ringing {901번전화에 벨이 울리고 있다는 신호}
13. 교환기1은 180 신호를 받으면 901번전화가 벨이 울리고 있다는 것을 인지한다. 해당내역을 301번전화로 보낸다
<-- SIP/2.0 180 Ringing {901번전화에 벨이 울리고 있다는 신호}
14. 301번전화는 스피커에 전화벨 소리를 낸다
[링링링링]
---------------------------------------------------------------
15. 901전화기의 수화기를 들면 901전화는 해당 내역을 교환기2로 보낸다 (invite에 포함된 sdp를 참조하여 rtp생성 : ip, port)
<-- SIP/2.0 200 OK (with SDP : 901전화기의 rtp ip, port가 포함된다 [c=IN IP4 192.168.1.91 m=audio 10328 RTP/AVP ....] )
16. 교환기2는 200 OK 를 수신하면 이에 포함된 SDP 를 참조하여 901전화와의 RTP를 생성한다
[ ip : 192.168.1.91 , port : 10328 ]
17. 교환기2는 901번전화에 ACK 응답한다
--> ACK sip:901@192.168.1.91:5529 SIP/2.0
18. 교환기2는 교환기1로부터 받는 Invite에 포함된 SDP 를 참조하여 교환기1과 통신할 rtp를 생성한다
[ 192.168.1.75:12042 ]
19. 교환기2는 901전화가 전화를 수신 했다고 교환기1에게 알린다
<-- SIP/2.0 200 OK (with SDP : 교환기2의 rtp ip, port가 포함된다 [c=IN IP4 192.168.1.99 m=audio 16074 RTP/AVP ....] )
20. 교환기2는 교환기1과의 RTP 와 901전화와의 RTP 를 연결한다 (브릿지 생성)
[
Channel PJSIP/901-0000001d joined 'simple_bridge' basic-bridge <472bd96d-84c0-4bfb-8fa9-4e6fab4b5743>
-- Channel PJSIP/pbx75-0000001c joined 'simple_bridge' basic-bridge <472bd96d-84c0-4bfb-8fa9-4e6fab4b5743>
]
21. 교환기1은 200 OK 를 수신하면 이에 포함된 SDP 를 참조하여 교환기2와의 RTP를 생성한다
[ 192.168.1.99:16074 ]
22. 교환기1은 교환기2에 ACK 응답한다
--> ACK sip:192.168.1.99:5060 SIP/2.0
23. 교환기1은 301전화로부터 받는 Invite에 포함된 SDP 를 참조하여 301전화와 통신할 rtp를 생성한다
[ 192.168.1.84:10060 ] ---> (#참조1)의 ip, port 를 확인하시라
24. 교환기1은 901전화가 전화를 수신 했다고 301전화에게 알린다
<-- SIP/2.0 200 OK (with SDP : 교환기2의 rtp ip, port가 포함된다 [c=IN IP4 192.168.1.75 m=audio 10602 RTP/AVP ....] )
25. 교환기1은 301전화와의 RTP와 교환기2의 RTP 를 연결한다 (브릿지 생성)
[
Channel PJSIP/pbx99-00000003 joined 'simple_bridge' basic-bridge <943c7171-00af-43fa-a8b6-0693a8fd2d5d>
-- Channel PJSIP/301-00000002 joined 'simple_bridge' basic-bridge <943c7171-00af-43fa-a8b6-0693a8fd2d5d>
]
26. 301전화는 200 OK 를 수신하면 이에 포함된 SDP 를 참조하여 교환기1과의 RTP를 생성한다
[ 192.168.1.75:10602 ]
27. 301전화는 교환기1에 ACK 응답한다
--> ACK sip:192.168.1.75:5060 SIP/2.0
---------------------------------------------------------------
28. 서로의 음성데이타를 RTP 프로토콜에 따라 지속적으로 주고 받으며 대화를 한다
---------------------------------------------------------------
29. 901전화가 전화를 끊으면 그 신호를 교환기 2로 보낸다
<-- BYE sip:asterisk@192.168.1.99:5060 SIP/2.0
30. 교환기2는 bye 메시지에 대하여 901전화에 응답한다
--> SIP/2.0 200 OK
31. 901전화는 교환기2와의 rtp 통신을 종료한다
32. 교환기2는 901단말과 교환기1과의 rtp 브릿지를 종료한다
[
Channel PJSIP/901-0000001d left 'simple_bridge' basic-bridge <472bd96d-84c0-4bfb-8fa9-4e6fab4b5743>
-- Channel PJSIP/pbx75-0000001c left 'simple_bridge' basic-bridge <472bd96d-84c0-4bfb-8fa9-4e6fab4b5743>
]
33. 교환기2는 교환기1에 전화가 끊겼다는 bye 메시지를 보낸다
<-- BYE sip:asterisk@192.168.1.75:5060 SIP/2.0
34. 교환기1은 교환기2로 부터 수신한 bye 메시지에 대하여 응답한다
--> SIP/2.0 200 OK
35. 교환기1은 교환기2와 301단말과의 rtp 브릿지를 종료한다
[
Channel PJSIP/pbx99-00000003 left 'simple_bridge' basic-bridge <943c7171-00af-43fa-a8b6-0693a8fd2d5d>
-- Channel PJSIP/301-00000002 left 'simple_bridge' basic-bridge <943c7171-00af-43fa-a8b6-0693a8fd2d5d>
]
36. 교환기1은 301전화에 전화가 끊겼다는 bye 메시지를 보낸다
<-- BYE sip:301@192.168.1.84:5665 SIP/2.0
37. 301전화는 교환기1로 부터 수신한 bye 메시지에 대하여 응답한다
--> SIP/2.0 200 OK
38. 301전화는 교환기1과의 rtp 통신을 종료한다
Asterisk