SIP呼呼叫是SIP协议最基本的功能。一个用户呼叫另外一个用户最终完成多媒体通话。此处以常见的B2BUA的服务器模式进行介绍。
环境说明:
主叫:1006 192.168.1.131
被叫:1012 192.168.0.24
SIP服务器(以下简称服务器): 192.168.0.201 主、被叫均注册在此服务器
1 主叫输入1012号码,开始呼叫
2 被叫收到1006来电,点击接听
3 主叫点击挂断结束通话
流程图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/15e4d3143bd6be5b488ca305d1319dd3.png)
信令流程:
编号1: 主叫发出INVITE到服务器
INVITE sip:1012@192.168.0.201 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-bd00a80d61174148-1--d87543-;rport
Max-Forwards: 70
Contact: <sip:1006@192.168.1.131:56980> //1006的联系地址
To: "1012"<sip:1012@192.168.0.201>
From: "1006"<sip:1006@192.168.0.201>;tag=11703172
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp //表明后面的消息体类型是SDP
User-Agent: eyeBeam release 1011d stamp 40820
Content-Length: 436
//以下为消息体部分
v=0
o=- 8 2 IN IP4 192.168.1.131
s=CounterPath eyeBeam 1.5
c=IN IP4 192.168.1.131
t=0 0
m=audio 1572 RTP/AVP 0 8 18 101 //支持的语音编码
a=alt:1 3 : YqBcv0hx k0Ir1UAh 192.168.1.131 1572
a=alt:2 2 : x3fHBmJC A3UcAV4D 192.168.197.1 1572
a=alt:3 1 : mxpdOrEC wrgtrc0h 192.168.44.1 1572
a=fmtp:18 annexb=no
a=fmtp:101 0-15
a=rtpmap:18 G729/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=x-rtp-session-id:747024EE416C401C864D1F625FC7E145
编号2: 服务器回复主叫100 Trying
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-bd00a80d61174148-1--d87543-;rport=56980
From: "1006" <sip:1006@192.168.0.201>;tag=11703172
To: "1012" <sip:1012@192.168.0.201>
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 1 INVITE
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Content-Length: 0
编号3:服务器发INVITE被叫
INVITE sip:1012@192.168.0.24:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.201;rport;branch=z9hG4bK6XZZ1QaaZjr3p
Max-Forwards: 68
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24:5060>
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
CSeq: 49245689 INVITE
Contact: <sip:mod_sofia@192.168.0.201:5060>
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 424
X-FS-Support: update_display,send_info
Remote-Party-ID: "1006" <sip:1006@192.168.0.201>;party=calling;screen=yes;privacy=off
v=0
o=- 8 2 IN IP4 192.168.1.131
s=CounterPath eyeBeam 1.5
c=IN IP4 192.168.1.131
t=0 0
m=audio 1572 RTP/AVP 0 8 18 101
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=alt:1 3 : YqBcv0hx k0Ir1UAh 192.168.1.131 1572
a=alt:2 2 : x3fHBmJC A3UcAV4D 192.168.197.1 1572
a=alt:3 1 : mxpdOrEC wrgtrc0h 192.168.44.1 1572
a=x-rtp-session-id:747024EE416C401C864D1F625FC7E145
编号4:被叫回复服务器100-Trying
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.0.201;rport=5060;received=192.168.0.201;branch=z9hG4bK6XZZ1QaaZjr3p
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24>
CSeq: 49245689 INVITE //该消息是应答序号为49245689 的INVITE(编号3)消息
Content-Length: 0
编号5: 被叫回复服务器180
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.168.0.201;rport=5060;received=192.168.0.201;branch=z9hG4bK6XZZ1QaaZjr3p
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24>;tag=3fVxEhXmI66Iss8a6YjNDWRhpIFlIEP1
CSeq: 49245689 INVITE
Contact: "1012" <sip:1012@192.168.0.24:5060>
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
User-Agent: VoIP
Content-Length: 0
编号6:服务器回复主叫180
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-bd00a80d61174148-1--d87543-;rport=56980
From: "1006" <sip:1006@192.168.0.201>;tag=11703172
To: "1012" <sip:1012@192.168.0.201>;tag=rF2y57BS0gUvQ
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 1 INVITE //该消息是应答序号为1的INVITE(编号1)消息
Contact: <sip:1012@192.168.0.201:5060;transport=udp>
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Accept: application/sdp
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer
Content-Length: 0
Remote-Party-ID: "1012" <sip:1012@192.168.0.201>;party=calling;privacy=off;screen=no
编号7:被叫接听,回复服务器200
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.201;rport=5060;received=192.168.0.201;branch=z9hG4bK6XZZ1QaaZjr3p
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24>;tag=3fVxEhXmI66Iss8a6YjNDWRhpIFlIEP1
CSeq: 49245689 INVITE
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
User-Agent: VoIP
Contact: "1012" <sip:1012@192.168.0.24:5060>
Supported: replaces, 100rel
Content-Type: application/sdp
Content-Length: 227
v=0
o=- 3856587767 3856587769 IN IP4 192.168.0.24
s=SDP
c=IN IP4 192.168.0.24
t=0 0
m=audio 10004 RTP/AVP 0 101 //协商后语音编码是0(PCMU)
c=IN IP4 192.168.0.24
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
编号8: 服务器发ACK到被叫
ACK sip:1012@192.168.0.24:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.201;rport;branch=z9hG4bK76rr3jUDvUepj
Max-Forwards: 70
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24:5060>;tag=3fVxEhXmI66Iss8a6YjNDWRhpIFlIEP1
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
CSeq: 49245689 ACK
Contact: <sip:mod_sofia@192.168.0.201:5060>
Content-Length: 0
编号9: 服务器回复主叫200
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-bd00a80d61174148-1--d87543-;rport=56980
From: "1006" <sip:1006@192.168.0.201>;tag=11703172
To: "1012" <sip:1012@192.168.0.201>;tag=rF2y57BS0gUvQ
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 1 INVITE
Contact: <sip:1012@192.168.0.201:5060;transport=udp>
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Allow-Events: talk, hold, conference, presence, as-feature-event, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 215
Remote-Party-ID: "Outbound Call" <sip:1012@192.168.0.201>;party=calling;privacy=off;screen=no
v=0
o=- 3856587767 3856587769 IN IP4 192.168.0.24
s=SDP
c=IN IP4 192.168.0.24
t=0 0
m=audio 10004 RTP/AVP 0 101
c=IN IP4 192.168.0.24
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
编号10: 主叫发ACK到服务器
ACK sip:1012@192.168.0.201:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-66782236ac1f413c-1--d87543-;rport
Max-Forwards: 70
Contact: <sip:1006@192.168.1.131:56980>
To: "1012"<sip:1012@192.168.0.201>;tag=rF2y57BS0gUvQ
From: "1006"<sip:1006@192.168.0.201>;tag=11703172
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 1 ACK
User-Agent: eyeBeam release 1011d stamp 40820
Content-Length: 0
此时双方完成通话建立,可以进行语音通话(互相发送RTP语音包)
编号11: 主叫挂断电话,发BYE到服务器
BYE sip:1012@192.168.0.201:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-0139516e9a4ac937-1--d87543-;rport
Max-Forwards: 70
Contact: <sip:1006@192.168.1.131:56980>
To: "1012"<sip:1012@192.168.0.201>;tag=rF2y57BS0gUvQ
From: "1006"<sip:1006@192.168.0.201>;tag=11703172
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 2 BYE
User-Agent: eyeBeam release 1011d stamp 40820
Reason: SIP;description="User Hung Up"
Content-Length: 0
编号12: 服务器回复200到服务器
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.131:56980;branch=z9hG4bK-d87543-0139516e9a4ac937-1--d87543-;rport=56980
From: "1006" <sip:1006@192.168.0.201>;tag=11703172
To: "1012" <sip:1012@192.168.0.201>;tag=rF2y57BS0gUvQ
Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
CSeq: 2 BYE
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Content-Length: 0
编号13: 服务器发BYE到被叫
BYE sip:1012@192.168.0.24:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.201;rport;branch=z9hG4bK8FjH5DcHS448D
Max-Forwards: 70
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24:5060>;tag=3fVxEhXmI66Iss8a6YjNDWRhpIFlIEP1
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
CSeq: 49245690 BYE
User-Agent: FreeSWITCH-mod_sofia/1.10.7-dev+git~20210720T181005Z~4c04914003~64bit
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE
Supported: timer, path, replaces
Reason: SIP;description="User Hung Up"
Content-Length: 0
编号14: 服务器发200到主叫
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.201;rport=5060;received=192.168.0.201;branch=z9hG4bK8FjH5DcHS448D
Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
From: "1006" <sip:1006@192.168.0.201>;tag=SrUQ72vvXSHFK
To: <sip:1012@192.168.0.24>;tag=3fVxEhXmI66Iss8a6YjNDWRhpIFlIEP1
CSeq: 49245690 BYE //这个200 OK是应答序号为49245690的BYE(编号13)消息的
Content-Length: 0
关键说明:
1. 1006通过服务器呼叫1012,并且服务器是背靠背模式(B2BUA),因此通话是由两段通话桥接起来的,每一段通话都有各自唯一的Call-ID
第一段通话: Call-ID: NDI2ODA4NmE4OTNlYjlhN2NlYzIxYzcxMzc0MTEzZTY.
第二段通话:Call-ID: 2ffaf428-2148-123b-649f-000c29e7aea9
2. 一段通话是1006到服务器,另一段通话是服务器到1012
3. 主叫发起INVITE(编号1)消息携带自己的媒体类型audio(语音),表明这是一个语音通话
4. 回复100 Trying(编号2和编号4)是防止请求方重传INVITE(按rfc3261协议,如果INVITE发送方未收到任何应答,则会按0.5,1,2,4,8..进行重传,直到累计重传时间达到32秒)
5. 服务器查找到被叫的地址后,发起一个新的INVITE(编号3)请求到被叫1012
6. 被叫回复180(编号5,此时被叫会开始振铃提示有来电)
7. 收到被叫180后,服务器回复主叫180(编号6),此时主叫会产生回铃音(表示被叫正在振铃)
8. 被叫用户接听,被叫回复服务器200(编号7)。服务器发送ACK到被叫。此时服务器与被叫完成对话建立。被叫开始向INVITE消息中的媒体地址(IP:192.168.1.131,端口:1572)发送rtp语音包
9. 服务器回复主叫200,主叫向服务器发ACK。此时主叫与服务器完成对话建立。主叫开始向200消息中的媒体地址(IP:192.168.0.24,端口:10004)发送rtp语音包
10. 呼叫过程中,媒体编码是通过INVITE消息体中的SDP和200消息体中的SDP进行协商的
11. 通话过程中,文中使用服务器为媒体流透传模式,即主、被叫的RTP包不经过服务器,直接发给对方。实际环境中,有的服务器需要主、被叫媒体流经过。 分析问题时注意观察SDP中的媒体地址。