视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
volte SIP协议主要消息
2025-09-29 16:43:05 责编:小OO
文档
第一章 SIP协议主要消息

SIP消息分类

SIP协议是以层协议的形式组成的,就是说它的行为是以一套相对的处理阶段来描述的,每个阶段之间的关系不是很密切。

SIP协议将Server和User Agent之间的通讯的消息分为两类:请求消息和响应消息。

请求消息:客户端为了激活特定操作而发给服务器的SIP消息,包括INVITE、ACK、BYE、CANCEL、OPTION和UPDATE消息。

SIP请求的6种方法:

     1、 邀请(INVITE)——邀请用户加入呼叫

  2、 确认(ACK)——确认客户机已经接收到对INVITE的最终响应

  3、 可选项(OPTIONS)——请求关于服务器能力的信息

  4、 再见(BYE)——终止呼叫上的两个用户之间的呼叫

  5、 取消(CANCEL)

  6、 注册(REGISTER)——提供地址解析的映射,让服务器知道其它用户的位置

响应消息:服务器向客户反馈对应请求的处理结果的SIP消息,包括1xx、2xx、3xx、4xx、5xx、6xx响应

SIP消息结构

请求消息和响应消息都包括SIP消息头字段和SIP消息体字段;

SIP消息头主要用来指明本消息是有由谁发起和由谁接受,经过多少跳转等基本信息;

SIP消息体主要用来描述本次会话具体实现方式;

消息格式

请求消息格式

SIP请求消息的格式,由SIP消息头和一组参数行组成,如图3-1所示。通过换行符区分命令行和每一条参数行。

SIP请求消息结构

注意:参数行的顺序不是固定的。对应的参数解释见6.3  。

消息体定义:

Call-ID:头字段是用来将消息分组的唯一性标识

  From:头字段是指示请求发起方的逻辑标识,它可能是用户的注册地址。From头字段包含一个URI和一个可选的显示名称

  CSeq:头字段用于标识事务并对事务进行排序。它由一个请求方法和一个序列号组成,请求方法必须与对应的请求消息类型一致

  Max-Fowords:头字段限定一个请求消息在到达目的地之前允许经过的最大跳数。它包含一个整数值,每经过一跳,这个值就被减一。如果在请求消息到达目的地之前该值变为零,那么请求将被拒绝并返回一个483(跳数过多)错误响应消息。

  Via:头字段定义SIP事务的下层(传输层)传输协议,并标识响应消息将要被发送的位置。只有当到达下一跳所用的传输协议被选定后,才能在请求消息中加入Via头字段值。

  expires:参数指出了该值中包含的URI地址的有效期。这个参数的值是以秒为单位计算的。如果没有提供该参数,那么URI地址的有效期由Expires头字段值来确定。

SIP请求消息实例:

INVITE sip:0109@127.0.0.1:5060;User=phone SIP/2.0

Call-ID:01E04633512400000@127.0.0.1

Via:SIP/2.0/UDP 127.0.0.1:5061

From:;tag=29005358336B534F610A000

To:

Contact: sip:010203@127.0.0.1:5061

CSeq:1 INVITE

Max-Forwards:70

Content-Type: application/SDP

Content-Length:168

v=0

o=UserA 20844526 20844526 IN IP4 here.com

s=Session SDP

c=IN IP4 192.0.0.1

t=0 0

m=audio 49172 RTP/AVP 0 8

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=sendonly

INVITE消息是其中一种SIP请求消息。

第一行由消息头和对端SIP实体的URI(通用资源标识)以及SIP版本号码组成。

SIP URI是电话URI,附在IP地址上,表示对端和端点收发SIP消息的端口的域。

“From”、“To”和“Contact”这三个SIP消息头属于电话URI。

当背靠背用户代理发出呼叫时,“From”消息头中的URI填写在“Via”消息头里。

请求消息类型填写在CSeq消息头里,并且当该SIP端点发送一个请求,号码就相应递增。

SIP协议版本为SIP/2.0。其中SDP被加入到INVITE消息内容里,在消息头里的Content-Length说明了SDP内容的长度。

INVITE请求消息详解:

INVITE sip:marconi@radio.org SIP/2.0

  <= 请求方法、请求地址(Request-URI)、SIP版本号(目前都是SIP/2.0)

  <=请求地址一般就是被叫方地址,跟MSN中好友eMail地址类似

  Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b

  <=SIP版本号(2.0)、传输类型(UDP)、呼叫地址、

  <=branch是一随机码,它被看作传输标识

  <=Via字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成

  <=传输类型可以为UDP、TCP、TLS、SCTP

Max-Forwards: 70

  <=最大跳跃数,就是经过SIP服务器的跳跃次数,主要是防止循环跳跃

  <=每经过代理服务器,该整数减一

  To: G. Marconi 

  From: Nikola Tesla ;tag=76341

  <=表示请求消息的发送方和目标方

  <=如果里面有用户名标签,地址要求用尖括号包起来

  <=对于INVITE消息,可以在From字段中包含tag,它也是个随机码

  Call-ID:1234567@lab.high-voltage.org

  <=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变

  <=对于用户代理发送INVITE消息,本地将生成From tag和Call-ID全局唯一码,被叫方代理则生成To tag全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。

  CSeq: 1 INVITE

  <=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1

  * 以上几个字段是所有SIP消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须

  Subject: About That Power Outage...

  Contact: 

  <=Contact是INVITE消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA)

  Content-Type: application/sdp

  Content-Length: 158

  <=最后两位附属字段说明消息体类型以及字段长度

  v=0   <=SDP版本号,目前都是0

  o=Tesla 2084452620844526 INIP4 lab.high-voltage.org   <=主叫源地址,类型等

  s=Phone Call

响应消息格式

SIP响应消息的格式,由SIP响应消息头和一组参数行组成,如图3-2所示。通过换行符区分命令行和每一行参数。

SIP响应消息结构

注意:参数行的顺序不是固定的。对应的参数解释见6.3  。 

SIP响应消息实例:

SIP/2.0 200 OK

Content-Type:application/SDP

Via:SIP/2.0/UDP 127.0.0.1:5061

Call-ID:01EF351F8140000000000@127.0.0.1

CSeq:1 INVITE

From:;tag=29005358336B534F610A000

To:;tag=5358336B534F2900CD1B0000

Contact:

Content-Length:156

v=0

o=HuaweiSoftX3000 1073741824 1073741824 IN IP4 127.0.0.1

s=Sip Call

c=IN IP4 110.111.112.113

t=0 0

m=audio 5060 RTP/AVP 0

a=rtpmap:0 PCMU/8000

200 OK消息是SIP响应消息的一种。

第一行由SIP版本号和200响应消息组成。

SIP URI是电话URI,附在IP地址上,表示对端和端点收发SIP消息的端口的域。

“From”、“To”和“Contact”这三个SIP消息头属于电话URI。

当背靠背用户代理发出呼叫时,“From”消息头中的URI填写在“Via”消息头里。

请求消息类型填写在CSeq消息头里,并且当该SIP端点发送一个请求,号码就相应递增。

SIP协议版本为SIP/2.0。把SDP加入到INVITE消息内容里,在消息头里说明内容的长度。

第二章 SIP协议主要响应码

2.1      响应码分类

SIP响应消息用于对请求消息进行响应,指示呼叫的成功或失败状态。不同类的响应消息由状态码来区分,状态码包含三位整数,状态码的第一位用于定义响应类型,另外两位用于进一步对响应进行更加详细的说明。响应消息的分类如下所示。

1)1XX:临时响应,表示请求消息正在被处理。

2)2XX:成功响应,表示请求已被成功接收,完全理解并被接受。

3)3XX:重定向响应,表示需采取进一步以完成该请求。

4)4XX:客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机请求。

5)5XX:服务器错误,表示服务器无法完成合法请求。

6)6XX:全局故障,表示任何服务器无法完成该请求。

上述消息中,临时响应用于指示呼叫正在进行,其余最终响应用于结束请求消息。

2.2      1xx类消息(临时响应)

1xx消息表示服务器或代理正在进行处理,还未得到确定的响应。客户应该继续等待服务器的响应。当服务器预测在200毫秒之内不能得到最终响应时,它应该发送一个1xx响应。服务器可以发送多个1xx响应。下面是常见的1xx类消息列表。

常见的1xx类消息列表

100试呼(Trying)正在进行与呼叫有关的操作(例如:访问数据库),但被叫用户还没有定位。

180被叫振铃(Ringing)被叫用户代理已经得到被叫的位置,正在提醒被叫用户。该响应也可以再发起一个本地回铃

181呼叫前转(Call Is Being Forwarded)代理服务器可以用该状态码表示当前呼叫正被转移到其它目的地。(呼叫正在转发)

182呼叫排队(Queued)被叫暂时不可访问,当前呼叫被排队而不是被拒绝。当服务器有效时,可以继续响应该呼叫。 该响应的"reason phrase"可以进一步给出排队呼叫的信息,例如:“队列中有5个呼叫,期望等待时间为15分钟”。服务器可以发出多个182 响应来更新当前排队呼叫的信息。

183会话进度(session progress)应答用于提示建立对话的进度信息。Reason-Phrase(表达原因的句子)、头域或者消息体可以用于提示呼叫进度的更新消息的信息。 

2.3      2xx类消息(成功响应)

2xx消息表示请求已经被接收、处理并被成功接受;

200 :OK---请求成功。

2.4  3xx类消息(重定向响应)

3xx消息表示响应给出有关用户新位置或其它可选服务的信息。下面表4-3是常见的3xx类消息列表。

常见的3xx类消息列表

300多个选择(Multiple Choice)请求中的地址被解析为多个位置,用户可以将请求重定向到一个合适的地址。该响应应该包含可供用户或用户代理选择的位置和资源列表,并且在Contact头域中,列出可供选择的地址。(网络协议不兼容:会话描述中的一个或多个网络协议不可用。)

301永久离开(Moved Permanently)在请求中Request-URI所指的地址找不到用户,客户应该尝试Contact头域给出的新地址。主叫收到该响应后应该更新所有的本地目录,地址簿,用户位置缓存并将以后的请求重定向到新的地址。(网络地址格式不兼容:会话描述中的一个或多个地址格式不可用。)

302暂时离开(Moved Temporarily)客户应该用Contact头域给出的新地址尝试呼叫。响应中Expire头域指出该次重定向的有效期,如果没有给出有效期,那么重定向只对当前呼叫有效。(传送协议不兼容:会话描述中的一个或多个传送协议不可用。)

303带宽单位不兼容:会话描述中的一个或多个带宽度量单位不被理解。

304媒体类型不可用:对话描述中的一个或多个媒体类型不可用。

305使用代理(Use Proxy)客户所请求的资源必须通过Contact头域中给出的代理来访问。Contact头域给出代理的URI。该响应只能由用户代理服务器发出。(媒体格式不兼容:对话描述中的一个或多个媒体格式不可用。)

306媒体特征不被理解:对话描述中的一个或多个媒体特征不被支持。

307对话描述参数不被理解:除上述几种参数之外的参数不被理解。

330组播不可用:用户站点不支持组播。

331单播不可用:用户站点不支持单播通信(通常是由于防火墙的存在)

370带宽不足:对话描述中定义的或者媒体定义的带宽超出可用带宽。

380使用其它服务(Alternate Service)呼叫不成功,但是可选其它的服务(如:电子邮件,语音信箱)。该响应的消息体给出可选服务的描述。

399混合告警:该告警表示用户存在的任意一种错误,收到该告警的系统不可以采取任何自动的动作

2.5  4xx类消息(客户机错误)

4xx消息表示请求消息中包含语法错误或者SIP服务器不能完成对该请求消息的处理。下面表4-4是常见的4xx类消息列表。

常见的4xx类消息列表

400无效请求(Bad Request)请求语法有误,不能被服务器理解。

401未授权(Unauthorized)请求需要用户认证。

402要求付费(Payment Required)该响应为将来使用保留。

403禁止(Forbidden)服务器理解请求,但拒绝完成。客户不应该再次发请求。

404未找到用户(Not Found)请求中Request-RUL给出的地址上没有要呼叫的用户。当Request-RUL给出的地址与服务器管理的域不匹配时,服务器也发送该响应。

405方法不允许(Method Not Allowed)请求行中指定的方法不被允许。该响应必须包含Allow头域,列出服务器支持的方法。

406不可接受(Not Acceptable)根据请求中的Ae头域,由请求给出的资源产生的响应实体里面的内容字符不可接受。

407需要代理认证(Proxy Authentication Required)该响应与401(未授权)类似,但它指示用户必须首先向代理认证自己。

408请求超时(Request Timeout)服务器不能在请求的Expire头域指定的时间内产生响应。客户可以过一段时间重发请求。

409冲突(Conflict)客户的请求与资源的当前状态冲突,不能完成请求。当REGISTER请求的action参数与现存的注册冲突时返回该响应。

410无可用资源(Gone)服务器上没有所请求的资源,也不知道进一步联系的地址。这种情况被认为是永久的。如果服务器不能确定该情况是否是永久的,它应该发送404(被叫未找到)响应。

411需要消息体长度(Length Required)服务器拒绝接受没有包含Content-Length头域的请求。客户何以在加入一个表示消息体长度的Cotent-Length头域后重发请求。

413请求实体过长(Request Entity Too Large)服务器拒绝处理过长的消息实体。如果这种情况是暂时的,服务器应该在响应中包含Retry-After头域指示客户何时重发请求。

414Request-URI过长(Request-URI Too Long)服务器不能解析过长的Request-URI。

415媒体类型不支持(Unsupported Media Type)服务器不支持请求消息体的格式。服务器应该在响应中用Accept,Accept-Encoding 和Accept-Language头域列出它支持的格式。

416不支持的URI方案(unsupported url scheme)服务器由于不支持Request-URI中的URI方案而终止处理这个请求。

420错误的扩展(Bad Extension)服务器不理解请求中Require头域指定的协议扩展。

421需要扩展支持(extension required)UAS需要特定的扩展来处理这个请求,但是这个扩展并没有在请求的Supported头域中列出。具有这个应答码的应答必须包含一个Require头域列出所需要的扩展。 

UAS不应当使用这个应答除非它真的不能给客户端提供有效的服务。相反,如果在Support头域中没有列出需要的扩展,服务器应当根据基准的SIP兼容的方法和客户端支持的扩展来进行处理。 

423间隔太短(interval too brief)服务器因为在请求中设置的资源刷新时间(或者有效时间)过短而拒绝请求。这个应答可以用于注册服务器来拒绝那些Contact头域有效期过短的注册请求。

480暂时不可访问(Temporarily Unavailable)被叫的终端系统已经成功连接,但用户暂时不可访问(例如:用户未登录,或登录为免打扰)。服务器可以在Retry-After头域中另外指定一个访问时间。

481呼叫支路/事务不存在(Call leg/Transaction Does Not Exist)在两种情况下服务器返回该响应:服务器收到一个BYE请求但找不到匹配的呼叫支路;或是收到一个CANCEL请求但找不到匹配的事务;或是收到与原来TAG标志不一样的INVITE请求。(对于无匹配的ACK请求,服务器直接将它丢弃,不响应)。

482检测到循环呼叫(Loop Detected)请求消息的Via头域中包含接收服务器自身的地址。

483跳数过多(Too Many Hop)请求的Via头域包含的条目数(跳数)超过Max-Forwards头域指定的值。

484地址不全(Address Incomplete)请求的To或Request-RUL所指的地址不全。

485地址不明确(Ambiguous)请求中提供的被叫地址不明确。该响应可以在Contact头域中列出不明确的地址。

486被叫忙(Busy Here)被叫的终端系统已经成功连接,但用户暂时不愿意或不能够接收更多的呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。客户也可能通过其它方式访问,如:语音邮箱,因此该响应并不终止一个查询。如果我们知道没有其他终端系统能够接听这个呼叫,那么应当返回一个状态码600(Busy Everywhere)。

487请求被拒绝(Request Cancelled)原来的请求消息被一个CANCEL请求所取消。

488此处请求不接受(not acceptable here)这个应答和606(Not Acceptable)有相同的含义,但是只是应用于Request-URI所指出的特定资源不能接受,在其他地方请求可能可以接受。 包含了媒体兼容性描述的消息体可以出现在应答中,并且根据INVITE请求中的Accept头域进行规格化(如果没有Accept头域,那么就是application/sdp)。这个应答就像给OPTIONS请求的200(OK)应答的消息体一样。

491未决请求(request pending)在同一个对话中,UAS接收到的请求有一个依赖的请求正在处理。

493无法解密(undecipherable)不可辨识,UAS接收到了一个请求,包含了一个加密的MIME,并且不知道或者没有提供合适的解密密钥。这个应答可以包含单个包体,这个包体包含了合适的公钥,这个公钥用于给这个UAS通讯中加密包体使用的。

2.6  5xx类消息(服务器错误)

5xx消息表示SIP服务器故障不能完成对正确消息的处理。下面表4-5是常见的5xx类消息列表。

常见的5xx类消息列表

500服务器内部错误(Server Internal Error)服务器出现异常情况,不能处理请求。

501功能未实现(Not Implemented 不可执行)服务器不支持完成请求所必需的功能。

502网关错误(Bad Gateway)作为网关或代理的服务器在处理请求时从其它服务器接收到一个无效响应。

503服务不可用(Sevice Unavailable)由于临时超载或正在维护,服务器当前不能处理请求。

504网关超时(Gateway Timeout / service Time-out 服务器超时)作为网关的服务器在处理呼叫的过程中没有及时收到其它服务器(例如:定位服务器)的响应。

505版本不支持(Version Not Supported)服务器不能或拒绝支持请求消息所用的版本。

513消息过大(message too large)

2.7  6xx类消息(全局错误)

6xx消息表示请求不能在任何SIP服务器上实现。下面表4-6是常见的5xx类消息列表。

常见的5xx类消息列表

600 全忙(Busy Everywhere)被叫的终端系统已经成功连接,但用户正忙,不愿够接受当前呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。该响应仅用于客户不能通过其它方式(如:语音邮箱)访问的情况。如果用户可通过其它方式访问,则应返回486(Busy Here)响应。

603拒绝(Decline)被叫的终端系统已经成功连接,但用户明确不愿接受当前呼叫。服务器可以在响应的Retry-After头域中另外指定一个访问时间。

604 被叫不存在(Does Not Exist Anywhere)请求的To头域指定的用户不存在。

606不可接受(Not Acceptable)用户代理已经成功连接,但某些会话描述如媒体类型、带宽或地址风格不能接受。该响应表示用户希望建立通信,但不能充分支持请求所描述的会话。

下载本文
显示全文
专题