参考连接 :https://www.2cto.com/kf/201609/546336.html
https://www.w3cschool.cn/session_initiation_protocol/session_initiation_protocol_introduction.html
https://www.ibm.com/developerworks/cn/opensource/os-cn-sip-intro/
专业词汇: SDP(会话描述协议)
RTP(实时传输协议)
SIP (会话发起协议)
SIP 网络元素
(1)用户代理
它是端点和SIP网络的最重要的网络元件之一。端点可以启动,修改或终止会话。 用户代理是SIP网络中最智能的设备或网络元件。它可以是软电话,移动电话或笔记本电脑。用户代理在逻辑上分为两个部分 。
-
用户代理客户端(UAC) - 发送请求并接收响应的实体。
-
用户代理服务器(UAS) - 接收请求并发送响应的实体。
SIP基于客户端 - 服务器架构,其中呼叫者的电话充当发起呼叫的客户端,并且被叫者的电话充当响应呼叫的服务器。
(2)代理服务器
它是从用户代理接收请求并将其转发给另一个用户的网络元素。
-
基本上代理服务器的作用就像一个路由器。
-
它具有一些智能来理解SIP请求并且在URI的帮助下向前发送它。
-
代理服务器位于两个用户代理之间。
-
源和目标之间最多可以有70个代理服务器。
有两种类型的代理服务器 -
-
无状态代理服务器 - 它仅转发接收的消息。这种类型的服务器不存储呼叫或事务的任何信息。
-
状态代理服务器 - 此类型的代理服务器会跟踪收到的每个请求和响应,如果需要,将来可以使用它。如果没有来自另一方的响应,它可以重传请求。
(3)注册服务器
注册服务器接受来自用户代理的注册请求。它帮助用户在网络中验证自己。它将URI和用户的位置存储在数据库中,以帮助同一域中的其他SIP服务器。请看下面的示例,显示SIP注册的过程。
这里呼叫者想要注册到TMC域。因此它向TMC的注册服务器发送注册请求,并且服务器在授权客户端时返回200 OK响应。
(4)重定向服务器
重定向服务器接收请求并在由注册器创建的位置数据库中查找请求的预期接收者。重定向服务器使用数据库获取位置信息,并以3xx(重定向响应)向用户作出响应。
(5)位置服务器
位置服务器向重定向和代理服务器提供关于呼叫者可能的位置的信息。只有代理服务器或重定向服务器可以联系位置服务器。
下图描述了每个网络元素在建立会话时所扮演的角色。
SIP 基本呼叫流程
下图显示了SIP会话的基本呼叫流程。

下面给出了上述调用流程的逐步解释 -
-
发送到代理服务器的INVITE请求负责启动会话。
-
代理服务器立即向呼叫者(Alice)发送 100 Trying 响应以停止INVITE请求的重传。
-
代理服务器在位置服务器中搜索Bob的地址。在获得地址之后,它进一步转发INVITE请求。
-
此后,由Bob产生的 180响铃(临时响应)被返回给Alice。
-
Bob在接听电话后立即生成 200 OK 响应。
-
Bob收到 200 OK 时,Bob会收到来自Alice的 ACK 。
-
同时,会话建立并且RTP分组(对话)开始从两端流动。
-
在对话之后,任何参与者(Alice或Bob)可以发送 BYE 请求以终止会话。
-
BYE 直接从Alice到Bob绕过代理服务器。
-
最后,Bob发送 200 OK 响应以确认BYE并且会话终止。
-
在上述基本呼叫流程中,三个事务(标记为1,2,3)可用。
完整的呼叫(从INVITE到200 OK)称为 Dialog 。
SIP梯形
代理如何帮助将一个用户与另一个用户连接? 让我们在下面图的帮助下找出。

图中所示的拓扑称为SIP梯形。该过程如下进行 -
-
当呼叫者发起呼叫时,向代理服务器发送INVITE消息。在接收到INVITE时,代理服务器尝试在DNS服务器的帮助下解析被调用者的地址。
-
在获得下一个路由之后,呼叫者的代理服务器(代理1,也称为出站代理服务器)将INVITE请求转发到被叫者的代理服务器,该代理服务器充当被叫者的入站代理服务器(代理2)。
-
入站代理服务器与位置服务器联系以获取有关用户注册的被叫方地址的信息。
-
在从位置服务器获取信息之后,它将呼叫转发到其目的地。
一旦用户代理知道他们的地址,他们可以绕过呼叫,即对话直接传递。
SIP 消息
SIP消息有两种类型 - 请求和响应。
-
请求的开始行包含定义请求的方法,以及定义请求发送位置的Request-URI。
-
类似地,响应的开始行包含响应代码。
请求方法
SIP请求是用于建立通信的代码。为了补充它们,存在 SIP响应,其通常指示请求是成功还是失败。
这些称为方法的SIP请求使得SIP消息可行。
-
方法可以被认为是SIP请求,因为它们请求由另一个用户代理或服务器采取的特定动作。
-
方法分为两种类型 -
-
核心方法
-
扩展方法
-
核心方法
下面讨论六种核心方法。
INVITE
INVITE用于发起与用户代理的会话。换句话说,INVITE方法用于在用户代理之间建立媒体会话。
-
INVITE可以在消息正文中包含呼叫者的媒体信息。
-
如果INVITE已经接收到成功响应(2xx)或者已经发送了ACK,则认为会话被建立。

-
成功的INVITE请求在两个用户代理之间建立对话,其继续,直到发送BYE以终止会话。
-
在已建立的对话中发送的INVITE被称为 re-INVITE 。
-
Re-INVITE用于更改会话特征或刷新对话框的状态。
INVITE示例
以下代码显示如何使用INVITE。
INVITE sips:Bob@TMC.com SIP/2.0 Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9 Max-Forwards: 70 From: Alice<sips:Alice@TTP.com>;tag = 1234567 To: Bob<sips:Bob@TMC.com> Call-ID: 12345601@192.168.2.1 CSeq: 1 INVITE Contact: <sips:Alice@client.ANC.com> Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Content-Type: application/sdp Content-Length: ... v = 0 o = Alice 2890844526 2890844526 IN IP4 client.ANC.com s = Session SDP c = IN IP4 client.ANC.com t = 3034423619 0 m = audio 49170 RTP/AVP 0 a = rtpmap:0 PCMU/8000
BYE
BYE是用于终止已建立的会话的方法。 这是一个SIP请求,可以由主叫方或被叫方发送以结束会话。
-
它不能由代理服务器发送。
-
BYE请求通常绕过代理服务器端到端路由。
-
BYE不能发送到挂起的INVITE或未建立的会话。
REGISTER
REGISTER请求执行用户代理的注册。此请求由用户代理发送到注册服务器。
-
REGISTER请求可以被转发或代理,直到它到达指定域的权威注册器。
-
它在正在注册的用户的 To 头中携带AOR(记录地址)。
-
REGISTER请求包含时间段(3600秒)。
-
一个用户代理可以代表另一个用户代理发送REGISTER请求。 这称为第三方注册。 这里, From 标签包含代表 To 标头中标识的一方提交注册的一方的URI。
CANCEL
CANCEL用于终止未建立的会话。用户代理使用此请求取消之前发起的待处理呼叫尝试。
-
它可以由用户代理或代理服务器发送。
-
CANCEL是逐跳请求,即,它通过用户代理之间的元素并接收由下一个有状态元素产生的响应。

ACK
ACK用于确认对INVITE方法的最终响应。ACK总是向着INVITE的方向。如果在INVITE中不可用,ACK可以包含SDP主体(媒体特性)。

-
ACK可以不被用于修改已经在初始INVITE中发送的媒体描述。

-
接收ACK的状态代理必须确定ACK是否应当向下游转发到另一个代理或用户代理。
-
对于2xx响应,ACK是端到端的,但是对于所有其他最终响应,当涉及状态代理时,其工作在逐跳基础上。
OPTIONS
OPTIONS方法用于向用户代理或代理服务器查询其功能,并发现其当前可用性。 对请求的响应列出了用户代理或服务器的功能。 代理永远不会生成OPTIONS请求。
扩展方法
Subscribe
用户代理使用SUBSCRIBE来建立订阅,以获得关于特定事件的通知。
-
它包含一个 Expires 头字段,用于指示订阅的持续时间。
-
在该时间段过去之后,订阅将自动终止。
-
订阅在用户代理之间建立对话。
-
您可以在到期时间之前在对话框中发送另一个SUBSCRIBE再次重新订阅。
-
将收到来自用户的订阅的200 OK。
-
用户可以通过发送另一个SUBSCRIBE方法取消订阅,Expires值为0(零)。

NOTIFY
NOTIFY用于由用户代理获取特定事件的发生。通常,当订阅者和通知者之间存在订阅时,NOTIFY将在对话框中触发。
-
每个NOTIFY将得到200 OK响应,如果它被通知器接收。
-
NOTIFY包含指示事件的 Event 头字段和指示订阅当前状态的 subscriptionstate 头字段。
-
NOTIFY总是在订阅的开始和终止时发送。
PUBLISH
PUBLISH由用户代理用于向服务器发送事件状态信息。

-
当有多个事件信息来源时,PUBLISH是最有用的。
-
PUBLISH请求类似于NOTIFY,除了它不是在对话框中发送。
-
PUBLISH请求必须包含 Expires 头字段和 Min-Expires 头字段。
REFER
REFER由用户代理使用来引用另一个用户代理来访问对话框的URI。
-
REFER必须包含 Refer-To 标题。 这是REFER的必需标题。
-
REFER可以在对话框内部或外部发送。
-
A 202已接受将触发REFER请求,其指示其他用户代理已接受引用。
INFO
INFO由用户代理用来向与其建立媒体会话的另一用户代理发送呼叫信令信息。
-
这是一个端到端的请求。
-
代理将始终转发INFO请求。
UPDATE
如果会话未建立,UPDATE用于修改会话的状态。 用户可以使用UPDATE更改编解码器。

如果建立了会话,则使用重新邀请来改变/更新会话。
PRACK
PRACK用于确认接收到临时响应(1XX)的可靠传输。
-
通常,当客户端接收到包含 RSeq 可靠序列号和支持的:100rel 头部的临时响应时,PRACK就会生成。
-
PRACK在 rack 标题中包含(RSeq&amp; plus; CSeq)值。
-
PRACK方法适用于所有临时响应,除了100 Trying响应,其从未可靠地传送。
-
PRACK可以包含消息体; 它可以用于提供/应答交换。
MESSAGE
它用于使用SIP发送即时消息。IM通常包括从事文本会话的参与者实时交换的短消息。

-
MESSAGE可以在对话框内或对话框外发送。
-
MESSAGE的内容作为 MIME 附件在邮件正文中传送。
-
通常接收到 200 OK 响应以指示消息已在其目的地传送。
来源:https://www.cnblogs.com/yz123/p/11929256.html