SIP协议及与Freeswitch的关系
转载自:http://www.voip88.com/article-1154-1.html
在继续学习 FreeSWITCH 之前我们有必要来学习一下 SIP 协议,因为它是 FreeSWITCH 的核心。但即使如此,讲清楚 SIP 必然需要很大篇幅,本书是关于 FreeSWITCH 的,而重点不是 SIP。因此,我将仅就理解 FreeSWITCH 必需的一些概念加以通俗的解释,更严肃一些的请参阅其它资料或 RFC(Request For Comments)。
SIP 的概念和相关元素
SIP 是一个基于文本的协议,在这一点上与 HTTP 和 SMTP 相似。我们来对比一个简单的 SIP 请求与 HTTP 请求:
GET /index.html HTTP/1.1 INVITE sip:seven@freeswitch.org.cn SIP/2.0
SIP 注册
Alice FreeSWITCH | | | REGISTER | |------------------------------->| | SIP/2.0 401 Unauthorized | |<-------------------------------| | REGISTER | |------------------------------->| | SIP/2.0 200 OK | | |
------------------------------------------------------------------------ recv 584 bytes from udp/[192.168.4.4]:5090 at 12:30:57.916812: ------------------------------------------------------------------------ REGISTER sip:192.168.4.4;transport=UDP SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d8754z-;rport Max-Forwards: 70 Contact: To: From: ;tag=9c709222 Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE. CSeq: 1 REGISTER Expires: 3600 Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE User-Agent: Zoiper rev.5415 Allow-Events: presence Content-Length: 0
recv 表明 FreeSWITCH 收到来自 alice 的消息。我们前面已经说进,SIP 是纯文本的协议,类似 HTTP,所以很容易阅读。
- 第一行的 REGISTER 表示是一条注册消息。
- Via 是 SIP 的消息路由,如果 SIP 经过好多代理服务器转发,则会有多条 Via 记录。
- Max-forwards 指出消息最多可以经过多少次转发,主要是为了防止产生死循环。
- Contact 是 alice 家的地址,本例中,FreeSWITCH 应该能在 192.168.4.4 这台机器上的 5090 端口找到她。
- To 和 From 先不管。
- Call-ID 是本次 SIP 会话(Session)的标志。
- CSeq 是一个序号,由于 UDP 是不可靠的协议,在不可靠的网络上可能丢包,所以有些包需要重发,该序号则可以防止重发引起的消息重复。
- Expires 是说明本次注册的有效期,单位是秒。在本例中,alice 应该在一小时内再次向 FreeSWITCH 注册,防止 FreeSWITCH 忘掉她。实际上,大部分 UA 的实现都会在几十秒内就重新发一次注册请求,这在 NAT 的网络中有助于保持连接。
- Allow 是说明 alice 的 UA 所能支持的功能,某些 UA 功能丰富,而某些 UA 仅有有限的功能。
- User-Agent 是 UA 的型号。
- Allow-Events 则是说明她允许哪些事件通知。
- Content-Length 是消息体(Body)的长度,在这里,只有消息头(Header),没有消息体,因此长度为 0 。
------------------------------------------------------------------------ send 664 bytes to udp/[192.168.4.4]:5090 at 12:30:57.919364: ------------------------------------------------------------------------ SIP/2.0 401 Unauthorized Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d9ed3bbae47e568b-1---d8754z-;rport=5090 From: ;tag=9c709222 To: ;tag=QFXyg6gcByvUH Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE. CSeq: 1 REGISTER User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces WWW-Authenticate: Digest realm="192.168.4.4", nonce="62fb812c-71d2-4a36-93d6-e0008e6a63ee", algorithm=MD5, qop="auth" Content-Length: 0
------------------------------------------------------------------------ recv 846 bytes from udp/[192.168.4.4]:5090 at 12:30:57.921011: ------------------------------------------------------------------------ REGISTER sip:192.168.4.4;transport=UDP SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-dae1693be9f8c10d-1---d8754z-;rport Max-Forwards: 70 Contact: To: From: ;tag=9c709222 Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE. CSeq: 2 REGISTER Expires: 3600 Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE User-Agent: Zoiper rev.5415 Authorization: Digest username="alice",realm="192.168.4.4", nonce="62fb812c-71d2-4a36-93d6-e0008e6a63ee", uri="sip:192.168.4.4;transport=UDP",response="32b5ddaea8647a3becd25cb84346b1c3", cnonce="b4c6ac7e57fc76b85df9440994e2ede8",nc=00000001,qop=auth,algorithm=MD5 Allow-Events: presence Content-Length: 0
alice 收到带有摘要的 401 后,后新发起注册请求,这一次,加上了根据收到的摘要和它自己的密码生成的认证信息(Authorization)。并且,你可以看到,CSeq 序号变成了 2。
------------------------------------------------------------------------ send 665 bytes to udp/[192.168.4.4]:5090 at 12:30:57.936940: ------------------------------------------------------------------------ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-dae1693be9f8c10d-1---d8754z-;rport=5090 From: ;tag=9c709222 To: ;tag=rrpQj11F86jeD Call-ID: NmFjNzA3MWY1MDI3NGViMjY1N2QwZDlmZWQ5ZGY2OGE. CSeq: 2 REGISTER Contact: ;expires=3600 Date: Tue, 27 Apr 2010 12:30:57 GMT User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Content-Length: 0
FreeSWITCH 收到带有认证的注册消息后,核实 alice 身份,认证通过,回应 200 OK。 如果失败,则回应 403 Forbidden 或其它失败消息,如下。
------------------------------------------------------------------------ send 542 bytes to udp/[192.168.4.4]:5090 at 13:22:49.195554: ------------------------------------------------------------------------ SIP/2.0 403 Forbidden Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-d447f43b66912a1b-1---d8754z-;rport=5090 From: ;tag=c097e17f To: ;tag=yeecX364pvryj Call-ID: ZjkxMGJmMjE4Y2ZiNjU5MzM5NDZkMTE5NzMzMzM0Mjc. CSeq: 2 REGISTER User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Content-Length: 0
你可以看到,alice 的密码是不会直接在 SIP 中传送的,因而一定程序上保证了安全(当然还是会有中间人,重放之类的攻击,我们留到后面讨论)。
SIP 呼叫流程
UA 间直接呼叫
bob alice | | | INVITE | |-------------------->| | 100 Trying | |<--------------------| | 180 Ringing | |<--------------------| | 200 OK | |<--------------------| | ACK | |-------------------->| | | |<---RTP------------->| |<---RTP------------->| |<---RTP------------->| | ... | | | | BYE | |<--------------------| | 200 OK | |-------------------->| | |
反过来也一样,alice 可以直接呼叫 bob 的地址: sip:bob@192.168.4.4:26000。
通过 B2BUA 呼叫
------------------------------------------------------------------------ recv 1118 bytes from udp/[192.168.4.4]:26000 at 13:31:39.938891: ------------------------------------------------------------------------ INVITE sip:alice@192.168.4.4 SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport Max-Forwards: 70 Contact: To: "alice" From: "Bob";tag=15c8325a Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO Content-Type: application/sdp User-Agent: X-Lite release 1014k stamp 47051 Content-Length: 594
------------------------------------------------------------------------ send 345 bytes to udp/[192.168.4.4]:26000 at 13:31:39.940278: ------------------------------------------------------------------------ SIP/2.0 100 Trying Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport=26000 From: "Bob";tag=15c8325a To: "alice" Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 1 INVITE User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Content-Length: 0
FreeSWITCH 通过 100 Trying 消息告诉 bob “我已经收到你的消息了,别着急,我正在联系 alice 呢...” 该消息称为呼叫进展消息。
------------------------------------------------------------------------ send 826 bytes to udp/[192.168.4.4]:26000 at 13:31:39.943392: ------------------------------------------------------------------------ SIP/2.0 407 Proxy Authentication Required Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport=26000 From: "Bob";tag=15c8325a To: "alice" ;tag=B4pem31jHgtHS Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 1 INVITE User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Accept: application/sdp Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Allow-Events: talk, presence, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer Proxy-Authenticate: Digest realm="192.168.4.4", nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8", algorithm=MD5, qop="auth" Content-Length: 0
------------------------------------------------------------------------ recv 319 bytes from udp/[192.168.4.4]:26000 at 13:31:39.945314: ------------------------------------------------------------------------ ACK sip:alice@192.168.4.4 SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-56adad736231f024-1---d8754z-;rport To: "alice" ;tag=B4pem31jHgtHS From: "Bob";tag=15c8325a Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 1 ACK Content-Length: 0
bob 回送 ACK 证实消息向 FreeSWITCH 证实已收到认证要求。并重新发送 INVITE,这次,附带了验证信息。
------------------------------------------------------------------------ recv 1376 bytes from udp/[192.168.4.4]:26000 at 13:31:39.945526: ------------------------------------------------------------------------ INVITE sip:alice@192.168.4.4 SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport Max-Forwards: 70 Contact: To: "alice" From: "Bob";tag=15c8325a Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 2 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO Content-Type: application/sdp Proxy-Authorization: Digest username="bob",realm="192.168.4.4", nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8", uri="sip:alice@192.168.4.4",response="327887635344405bcd545da06763c466", cnonce="c164b74f625ff2161bd8d47dba3a0ee2",nc=00000001,qop=auth, algorithm=MD5 User-Agent: X-Lite release 1014k stamp 47051 Content-Length: 594
------------------------------------------------------------------------ send 345 bytes to udp/[192.168.4.4]:26000 at 13:31:39.946349: ------------------------------------------------------------------------ SIP/2.0 100 Trying Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000 From: "Bob";tag=15c8325a To: "alice" Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 2 INVITE User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Content-Length: 0
FreeSWITCH 重新回 100 Trying,告诉 bob 呼叫进展情况。
接下来 FreeSWITCH 要建立另一条腿,称为 b-leg。它通过查打本地数据库,得到了 alice 的位置,接着启动一个 UA(用作 UAC),向 alice 发送 INVITE 消息。如下:
------------------------------------------------------------------------ send 1340 bytes to udp/[192.168.4.4]:5090 at 13:31:40.028988: ------------------------------------------------------------------------ INVITE sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKey90QUyHZQXNN Route: ;rinstance=e7d5364c81f2b879;transport=UDP Max-Forwards: 69 From: "Bob" ;tag=Dp9ZQS3SB26pg To: Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 130069214 INVITE Contact: User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Allow-Events: talk, presence, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer Content-Type: application/sdp Content-Disposition: session Content-Length: 313 X-FS-Support: update_display Remote-Party-ID: "Bob" ;party=calling;screen=yes;privacy=off
------------------------------------------------------------------------ recv 309 bytes from udp/[192.168.4.4]:5090 at 13:31:40.193634: ------------------------------------------------------------------------ SIP/2.0 100 Trying Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN To: From: "Bob" ;tag=Dp9ZQS3SB26pg Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 130069214 INVITE Content-Length: 0
跟上面的流程差不多,alice回的呼叫进展。此时,alice 的 UA 开始振铃。
------------------------------------------------------------------------ recv 431 bytes from udp/[192.168.4.4]:5090 at 13:31:40.193816: ------------------------------------------------------------------------ SIP/2.0 180 Ringing Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN Contact: To: ;tag=3813e926 From: "Bob";tag=Dp9ZQS3SB26pg Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 130069214 INVITE User-Agent: Zoiper rev.5415 Content-Length: 0
180也是呼叫进展消息,它说明,我这边已经准备好了,alice 的电话已经响了,她听到了一会就会接听。
send 1125 bytes to udp/[192.168.4.4]:26000 at 13:31:40.270533: ------------------------------------------------------------------------ SIP/2.0 183 Session Progress Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000 From: "Bob";tag=15c8325a To: "alice" ;tag=cDg7NyjpeSg4m Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 2 INVITE Contact:User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Accept: application/sdp Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Allow-Events: talk, presence, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer Content-Type: application/sdp Content-Disposition: session Content-Length: 267 Remote-Party-ID: "alice"
------------------------------------------------------------------------ recv 768 bytes from udp/[192.168.4.4]:5090 at 13:31:43.251980: ------------------------------------------------------------------------ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKey90QUyHZQXNN Contact: To: ;tag=3813e926 From: "Bob";tag=Dp9ZQS3SB26pg Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 130069214 INVITE Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE Content-Type: application/sdp User-Agent: Zoiper rev.5415 Content-Length: 226
alice 接听电话以后,其 UA 向 FreeSWITCH 送 200 OK,即应答消息。
------------------------------------------------------------------------ send 436 bytes to udp/[192.168.4.4]:5090 at 13:31:43.256692: ------------------------------------------------------------------------ ACK sip:alice@192.168.4.4:5090;rinstance=e7d5364c81f2b879;transport=UDP SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKF72SSpFNv0K8g Max-Forwards: 70 From: "Bob" ;tag=Dp9ZQS3SB26pg To: ;tag=3813e926 Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 130069214 ACK Contact: Content-Length: 0
FreeSWITCH 向 alice 回送证实消息,证实已经知道了。至此,b-leg已经完全建立完毕,多半这时 alice 已经开始说话了:“Hi, bob,你好……”
------------------------------------------------------------------------ send 1135 bytes to udp/[192.168.4.4]:26000 at 13:31:43.293311: ------------------------------------------------------------------------ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-87d60b47b6627c3a-1---d8754z-;rport=26000 From: "Bob";tag=15c8325a To: "alice" ;tag=cDg7NyjpeSg4m Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 2 INVITE Contact: User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Allow-Events: talk, presence, dialog, line-seize, call-info, sla, include-session-description, presence.winfo, message-summary, refer Session-Expires: 120;refresher=uas Min-SE: 120 Content-Type: application/sdp Content-Disposition: session Content-Length: 267 Remote-Party-ID: "alice"
------------------------------------------------------------------------ recv 697 bytes from udp/[192.168.4.4]:26000 at 13:31:43.413025: ------------------------------------------------------------------------ ACK sip:alice@192.168.4.4:5060;transport=udp SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:26000;branch=z9hG4bK-d8754z-ef53864320037c04-1---d8754z-;rport Max-Forwards: 70 Contact: To: "alice";tag=cDg7NyjpeSg4m From: "Bob";tag=15c8325a Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 2 ACK Proxy-Authorization: Digest username="bob",realm="192.168.4.4", nonce="31c5c3e0-cc6e-46c8-a661-599b0c7f87d8", uri="sip:alice@192.168.4.4",response="327887635344405bcd545da06763c466", cnonce="c164b74f625ff2161bd8d47dba3a0ee2",nc=00000001,qop=auth, algorithm=MD5 User-Agent: X-Lite release 1014k stamp 47051 Content-Length: 0
bob 在收到应答消息后也需要回送证实消息。至此 a-leg 也建立完毕。双方正常通话。
[][][][][][] 此处省略 5000 字 [][][][][]
------------------------------------------------------------------------ recv 484 bytes from udp/[192.168.4.4]:5090 at 13:31:49.949240: ------------------------------------------------------------------------ BYE sip:mod_sofia@192.168.4.4:5060 SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-2146ae0ddd113efe-1---d8754z-;rport Max-Forwards: 70 Contact: To: "Bob";tag=Dp9ZQS3SB26pg From: ;tag=3813e926 Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 2 BYE User-Agent: Zoiper rev.5415 Content-Length: 0
------------------------------------------------------------------------ send 543 bytes to udp/[192.168.4.4]:5090 at 13:31:49.950425: ------------------------------------------------------------------------ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.4.4:5090;branch=z9hG4bK-d8754z-2146ae0ddd113efe-1---d8754z-;rport=5090 From: ;tag=3813e926 To: "Bob";tag=Dp9ZQS3SB26pg Call-ID: 0d74ac35-cca4-122d-81a2-2990e5b2bd3e CSeq: 2 BYE User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Content-Length: 0
------------------------------------------------------------------------ send 630 bytes to udp/[192.168.4.4]:26000 at 13:31:50.003165: ------------------------------------------------------------------------ BYE sip:bob@192.168.4.4:26000 SIP/2.0 Via: SIP/2.0/UDP 192.168.4.4;rport;branch=z9hG4bKggvjUH0rS99tc Max-Forwards: 70 From: "alice" ;tag=cDg7NyjpeSg4m To: "Bob" ;tag=15c8325a Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 130069219 BYE Contact: User-Agent: FreeSWITCH-mod_sofia/1.0.trunk-16981M Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE Supported: timer, precondition, path, replaces Reason: Q.850;cause=16;text="NORMAL_CLEARING" Content-Length: 0
接下来 FreeSWITCH 给 bob 发送 BYE,通知要拆线了。出于对 bob 负责,它包含了挂机原因(Hangup Cause),此处 NOMAL_CLEARING 表示正常释放。
------------------------------------------------------------------------ recv 367 bytes from udp/[192.168.4.4]:26000 at 13:31:50.111765: ------------------------------------------------------------------------ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.4.4;rport=5060;branch=z9hG4bKggvjUH0rS99tc Contact: To: "Bob";tag=15c8325a From: "alice";tag=cDg7NyjpeSg4m Call-ID: YWEwYjNlZTZjOWZjNDg3ZjU3MjQ3MTA1ZmQ1MDM5YmQ. CSeq: 130069219 BYE User-Agent: X-Lite release 1014k stamp 47051 Content-Length: 0
bob 回送 OK,a-leg 释放完毕,通话结束。从下图可以很形象地看出 FreeSWITCH 的两条“腿”-- a-leg 和 b-leg。
bob (UAC) [ UAS-UAC ] (UAS) alice | | | | | INVITE | | | |-------------------->| | | | 100 Trying | | | |<--------------------| | | | 407 Authentication Required | |<--------------------| | | | ACK | | | |-------------------->| | | | INVITE | | | |-------------------->| | | | 100 Trying | | INVITE | |<--------------------< >-------------------->| | | | 100 Trying | | | |<--------------------| | 183 Progress | | 180 Ringing | |<--------------------< |<--------------------| | | | 200 OK | | | |<--------------------| | 200 OK | | ACK | |<--------------------< >-------------------->| | ACK | | | |-------------------->| | | | | | Call Connected | | | | | | BYE | | | |<--------------------| | BYE | | 200 OK | |<--------------------< >-------------------->| | 200 OK | | | |-------------------->| | | | | | |
从流程图可以看出,右半部分跟上一节“UA间直接呼叫”一样,而左半部分也类似。这就更好的说明了实际上有 4 个 UA (两对)参与到了通信中,并且,有两个 Session。
再论 SIP URI
上面我们介绍了一些 FreeSWITCH 的基本概念,并通过一个真正的呼叫流程讲解了一下 SIP。由于实验中所有 UA 都 运行在一台机器上,这可能会引起迷惑,如果我们有三台服务器,那么情况可能是:
/---------------\ | FreeSWITCH | | 192.168.0.1 | \ --------------/ sip:bob@192.168.0.1 / \ sip:alice@192.168.0.1 / \ / \ /-----------------\ /-----------------\ | bob | | alice | | 192.168.0.100 | | 192.168.0.200 | \-----------------/ \-----------------/ sip:bob@192.168.0.100 sip:alice@192.168.0.200
SIP URI 除使用 IP 地址外,也可以使用域名,如 sip:alice@freeswitch.org.cn。更高级也更复杂的配置则需要 DNS 的 SRV 记录,在此就不做讨论了。
SIP协议及与Freeswitch的关系相关推荐
- freeswitch系列四 通过实例学习sip协议的注册、呼叫、挂断流程
1. 概述 本文通过tcpdump对真实环境里的软电话的注册.呼叫.挂断流程进行抓包,通过真实的例子学习SIP协议.本文主要包括以下方面: A. 详解软电话的注册时的SIP包和流程图 B. 详解软电话 ...
- 基于SIP协议的视频通讯
1.sip协议及其发展 sip(session initiation protocal)称为会话发起协议,是由ietf(internet engineering task force)组织于1999年 ...
- SIP协议详解(中文)-6
由于MIME包体是在"inner"消息中的,实现中通常会加密MIME指定的头域,包括:MIME-Version,Content-Type,Content-Length, Conte ...
- SIP协议简介(一)之SIP基本的概述
本篇文章主要是对RFC3261翻译进行的,也包含着自己的一些理解.希望能给需要的人带来一些帮助 补充说明:RFC即Request For Comments(RFC),是一系列以编号排定的文件.文件收集 ...
- sip协议呼叫流程详解
1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...
- SIP 协议的系统构架
SIP协议是一种分层的协议,换句话说,SIP的应用实现,可以划分为一组不同的,相互独立的处理阶段,每个阶段间只有一些松散的耦合关系.如上图所示,从架构上划分,我们一般可以抽象出四个层:语法/编码层.T ...
- 国标28181:什么是SIP协议
前言 对讲设备作为一种专业无线通信工具,能进行一对一,多对多的群组即时通信,在应急调度和突发事故处理中是其他通信工具所不能替代的,在城市治理.公安.运输等行业有广泛的应用. 对讲机按照通信方式分模拟对 ...
- SIP协议详解(中文)-1
原文 1.SIP协议介绍 Internet的许多应用都需要建立和管理一个会话,会话在这里的含义是在参与者之间的数据的交换.由于考虑到参与者的实际情况,这些应用的实现往往是很复杂的:参与者可能是在代理间 ...
- VoIP通话之SIP协议
一.前言 作为一名VoIP产品职业开发者,SIP可以说是我工作中接触最多的一种协议,是时候好好总结一下了. 二.概要 SIP(Session Initiation Protocol)属于应用层的控制协 ...
- SIP协议详解(中文)-3
7.3.2 头域分类. 有一些头域是仅仅在请求(或者应答)中有效的.这些头域叫做请求头域或者应答头域.如果消息中的头域与这个消息的类型不匹配(比如在应答消息中出现的请求头域),这个头域必须被忽略.20 ...
最新文章
- linux python版本_linux下更新Python版本并修改默认版本
- 这款笔记本写代码真爽,包邮送一台!
- c++ class struct同名_第二课C到C++的关系
- 让网站具有生命与活力不仅仅是说说而已
- struts2拦截器遇到的问题
- jenkins 手动执行_我常用的SpringBoot+Jenkins自动化部署技巧,贼好用,推荐给大家...
- af_netlink_2、netlink简介
- C++设计模式-备忘录模式
- Ubuntu 11.04下编译kernel
- 计算机课程在线作业,计算机科学与技术作业答案
- ubuntu linux 搭建 webssh 网页ssh远程登录其他服务器
- 统计表中有无数据并发送邮件
- VMware centos7配置以及SecureCRT连接
- 什么是servlet?servlet的运行原理?如何自定义一个servlet?
- PHP连接MYSQL没有反应
- 计算机网络组成两大部分组成,计算机网络的组成部分
- NVIDIA Jetson Xavier NX部署VINS-fusion-GPU
- Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】
- SEO像艺术,为自己做站最划算
- 怎么用生活照制作一寸证件照片
热门文章
- 小杯子微信多开 双开共存版 ios8.0微信版本6.0免费获取了
- 50k热敏电阻温度对照表c语言,50K热敏电阻温度表..doc
- Win7 Hotfix KB2685811 (64-bit)疑难杂症状之解药
- 关于jar文件打不开的解决方法
- vscode安装 Fira Code 编程字体,编程符号更精致美观
- linux snmp 命令oid,snmpwalk命令_Linux snmpwalk命令使用详解:通过SNMP GET-NEXT类型PDU
- 广州天河租房随笔记录
- 微信小程序图片固定宽度,高度自适应处理方法及相关API介绍
- cmmi分为哪几个等级?
- oracle客户端 PLSQL安装配置教程