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 sips:Bob@TMC.com SIP/2.0
Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alicesips:Alice@TTP.com;tag = 1234567
To: Bobsips: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请求类似于NOTIFY,除了它不是在对话框中发送。
-
PUBLISH请求必须包含 Expires 头字段和 Min-Expires 头字段。
REFER
-
REFER由用户代理使用来引用另一个用户代理来访问对话框的URI。
-
REFER必须包含 Refer-To 标题。 这是REFER的必需标题。
-
REFER可以在对话框内部或外部发送。
-
接收202响应,其指示其他用户代理已接受引用。
INFO
-
INFO由用户代理用来向与其建立媒体会话的另一用户代理发送呼叫信令信息。
-
这是一个端到端的请求。代理将始终转发INFO请求。
UPDATE
-
如果会话未建立,UPDATE用于修改会话的状态。 用户可以使用UPDATE更改编解码器。
-
如果建立了会话,则使用重新邀请来改变/更新会话。
PRACK
-
PRACK用于确认接收到临时响应(1XX)的可靠传输。
-
通常,当客户端接收到包含 RSeq 可靠序列号和支持的:100rel 头部的临时响应时,PRACK就会生成。
-
PRACK方法适用于所有临时响应,除了100 Trying响应,其从未可靠地传送。
-
PRACK可以包含消息体,它可以用于提供/应答交换。
MESSAGE
-
它用于使用SIP发送即时消息。IM通常包括从事文本会话的参与者实时交换的短消息。
-
MESSAGE可以在对话框内或对话框外发送。
-
MESSAGE的内容作为 MIME 附件在邮件正文中传送。
-
通常接收到 200 OK 响应以指示消息已在其目的地传送。
SIP 响应代码
SIP响应是由用户代理服务器(UAS)或SIP服务器生成的用于回复由客户端生成的请求的消息。它可以是防止UAC重传请求的正式确认。响应可以包含UAC所需的信息的一些附加报头字段。
SIP有六个响应, 1xx到5xx已从HTTP借用,6xx已在SIP中引入。1xx被认为是临时响应,其余的是最终响应。
序号 | 功能和描述 |
---|---|
1 | 1xx: 临时/信息响应:信息响应用于指示呼叫进度。 通常响应是端到端的(除了100 Trying)。 |
2 | 2xx: 成功响应:这类响应用于指示请求已被接受。 |
3 | 3xx: 重定向响应:通常这些类响应由重定向服务器响应INVITE发送。 它们也称为重定向类响应。 |
4 | 4xx: 客户端故障响应:客户端错误响应指示无法满足请求,因为从UAC侧识别出一些错误。 |
5 | 5xx: 服务器故障响应:此类响应用于指示由于服务器错误而无法处理请求。 |
6 | 6xx: 全局故障响应:此响应类指示服务器知道请求在尝试的任何地方都将失败。 因此,请求不应发送到其他位置。 |
1xx: 临时/信息响应
-
100 (尝试)
这种特殊情况响应只是一个逐跳请求。它从不转发,并且可能不包含消息体。它用于避免重新发送 INVITE 个请求。 -
180 (振铃)
此响应用于表示用户代理已收到 INVITE ,并且正在进行警报。 -
181 (呼叫正在转发)
此响应用于指示呼叫已转发到另一个端点。它给出呼叫者的状态,因为转发操作可能导致呼叫花费更长时间来应答。 -
182 (呼叫排队)
该响应用于指示已经接收到INVITE并且将在队列中处理。 -
183 (会议进展)
它指示关于会话的进展的信息可以存在于消息主体或媒体流中。与100 Trying响应不同,183是端到端响应。它建立早期对话。该响应的典型使用是允许UAC在通过网关进入PSTN的呼叫中听到铃声记录的通知。
2xx: 成功响应
-
200 (OK)
200 OK用于接受会话邀请。它表示成功接收到请求。 -
202 (接受)
202已接受表示UAS已接收并理解请求,但请求可能未被服务器授权或处理。它通常用于响应SUBSCRIBE,REFER方法。
3xx: 重定向响应
-
300 (多种选择)
它包含多个Contact头字段,以指示位置服务已在Request-URI中为SIP URI返回了多个可能的位置。 -
301 (永久移动)
此重定向响应包含具有被叫方的新URI的Contact头字段。地址可以保存并在将来的INVITE请求中使用。 -
302 (临时移动)
此重定向响应包含当前有效但不是永久的URI。也就是说,在指定的持续时间内,位置是有效的。 -
305 (使用代理)
该响应指向具有关于呼叫方的一些权威信息的某些代理服务器。该响应可以由发出用于呼入呼叫筛选的代理的UAS发送。 -
380 (替代服务)
此响应返回指示被叫方想要的服务类型的URI。例如,呼叫可以重定向到语音邮件服务器。
4xx: 客户端故障响应
-
400 (错误请求)
这表示服务器无法理解请求。请求可能缺少必需的标题字段,例如To,From,Call-ID或CSeq。 -
401(未经授权)
它表示请求需要执行身份验证。通常由注册服务器发送REGISTER请求。响应包含WWW-Authenticate头字段,它请求来自主叫用户代理的正确凭证。后续注册将从具有正确凭据的用户代理触发。 -
402 (需要付款)
它表示需要付款以进一步处理请求。 -
403 (禁止)
403禁止发送时,服务器已经了解请求,发现请求被正确制定,但不会服务请求。当需要授权时,不使用此响应。 -
404 (未找到)
它表示服务器没有找到用户指示的SIP URI。 -
405 (方法不允许)
它表示请求包含不允许的方法列表。示例:REGISTER请求可能会发送到用户代理。它包含一个允许字段,通知UAC可以接受哪些方法。 -
406 (不接受)
此响应指示由于请求消息中的要求而无法处理请求。请求中的Accept头字段不包含UAS支持的任何选项。 -
407 (需要代理验证)
代理发送的此请求表示UAC首先必须在处理请求之前向代理验证自己。响应应包含 Proxy-Authenticate 标头,通知代理所需的凭证类型。
可以在代理授权头字段中使用正确的凭据重新发送请求。 -
408 (请求超时)
当INVITE请求的Expires头字段中提到的指定时间段过去时,此响应到来。它可以由分叉代理或用户代理发送。该请求可以由UAC在任何时间重试。 -
422 (会话计时器间隔太小)
该响应用于拒绝包含Session-Expires头字段的请求。最小允许间隔在所需的Min-SE头字段中指示。主叫方可以在没有Session-Expires头字段或者具有小于或等于指定最小值的值的情况下重试请求。 -
423 (间隔太简单)
响应由拒绝注册请求的注册器返回,因为在一个或多个联系人上请求的到期时间太短。响应必须包含一个 Min-Expires 标题字段,其中列出了注册商接受的最短到期间隔。 -
480 (暂时不可用)
此响应指示请求已到达正确的目标,但被叫方由于某种原因不可用。响应应包含一个 Retry-After 标头,指示该请求何时可以满足。 -
481 (对话框/事务不存在)
此响应指示已接收到引用现有调用或事务的响应,其中服务器没有记录或状态信息。 -
483 (错误,跳数过多)
此响应指示请求已经转发了由请求中的70为Max-Forwards标头设置的最大次数。这通过在请求中接收到最大转发:0报头来指示。 -
486 (正忙)
这表示用户代理正忙,无法接受呼叫。 -
487 (请求已终止)
该响应可以由已经接收到针对未决INVITE请求的CANCEL请求的UA发送。发送200OK以确认CANCEL,并发送487以取消INVITE事务
5xx: 服务器故障响应
-
500 (服务器内部错误)
500表示服务器遇到了某种妨碍其处理请求的错误。它是一种服务器故障,指示客户端在几秒钟后在此服务器上再次重试请求。 -
501 (未实施)
它表示服务器无法处理请求,因为它不受支持。此响应可用于拒绝包含未知方法的请求。 -
502 (错误的网关)
此响应由充当到另一网络的网关的代理发送。它指示在其他网络中的一些问题是阻止请求被处理。 -
503 (服务不可用)
此响应指示所请求的服务当时暂时不可用。可以在几秒钟后或在Retry-After报头字段过期后重试请求。 -
504 (网关超时)
当请求因网关连接到的其他网络中发生超时而失败时,会出现此响应。它是一个服务器错误类响应,因为由于服务器访问SIP网络外部资源失败,呼叫失败。 -
505 (不支持版本)
当服务器使用不同的SIP版本号时,服务器拒绝请求。 此消息中指示拒绝。目前SIP版本2.0是唯一实现的版本。 -
513 (消息太大)
UAS使用此响应表示请求大小太大,无法处理。 -
580 (前提条件失败)
此响应用于拒绝不能满足所需前提条件的SDP提议。
6xx: 全局故障响应
-
600 (全忙)
此响应指示对指定的Request-URI的调用可以在其他位置被应答。 -
603 (拒绝)
该响应可以指示被叫方正忙,或者根本不想接受呼叫。 -
604 (不存在于任何地方)
此响应类似于 404未找到响应,但表示无法在任何位置找到Request-URI中的用户。此响应应仅由能够访问有关用户的所有信息的服务器发送。 -
606 (不接受)
该响应指示所期望的会话的一些方面对于UAS是不可接受的,并且因此,不能建立会话。响应可能包含一个警告标头字段,其中有一个数字代码,用于说明什么是不可接受的。可以使用不同的媒体会话信息重试请求。