让我们学习更多关于Sip协议的知识。以下内容大致分为以下几个部分:
协议简介:两种Sip会话模式,SessionModel和PagerModel;Sip消息体结构Sip消息示例
在SessionModelPagerModel
主叫方a呼叫被叫方b:
步骤1:主叫方A向INVITE;发送代理服务器请求步骤2:代理服务器向主叫方A;发送100-trying响应步骤3-6:代理服务器搜索被叫方B,的地址,获取地址后转发INVITE请求;步骤7-9:被叫方B生成的180响铃响应返回给主叫方A;步骤10 ~ 12:被叫方B生成的200OK响应返回给主叫方A;步骤13-17:主叫方A收到被叫方B's 200 OK响应后向被叫方B发送ACK,会话建立;步骤18-20:会话结束后,任何参与者(A或B)都可以发送BYE请求来终止会话;步骤21 ~ 23:主叫方A发送200OK响应确认BYE,会话终止。注:以上的整个流程称之为一个Dialog
body的消息体可以是任何MIME格式。但是,必须支持plain/text格式。你可以选择支持message/cpim和message/sdp格式,message/cpim可能更好,因为现有的IM系统标准是message/cpim格式。
注:想了解CPIM报文格式的同学可以参考:https://xiaxl.blog.csdn.net/article/details/104718006 CPIM报文格式注:想了解SDP报文格式的同学可以参考:https://xiaxl.blog.csdn.net/article/details/104723834. SDP报文格式
以User1向User2发送MESSAGE消息为例:
步骤1:User1发送MESSAGE请求到代理服务器;步骤2:代理服务器转发User1的MESSAGE请求给USER2;步骤3:User2收到User1的消息后,回复200OK给代理服务器;步骤7~9:代理服务器转发200OK回复给User1SIP消息体结构与Http协议结构相似,均由三部分组成:
请求行(request-line)or状态行(status-line)消息头(header)正文(body)请求行格式:MethodRequest-URISIP-VersionCRLF
请求行举例:INVITEsip:bob@zte.comSIP/2.0/r/n
Method
以下列出了几种消息Method方法:
Method | 方法说明 |
REGISTER | 注册联系信息 |
INVITE | 发起会话请求 |
ACK | INVITE请求的响应的确认 |
CANCEL | 取消请求 |
BYE | 终结会话 |
OPTIONS | 查询服务器能力 |
MESSAGE | RFC3428对Sip协议的扩展,增加了MESSAGE方法。采用PagerModel进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考“SIP-RFC3428”https://tools.ietf.org/html/rfc3428 |
Request-URI
指示请求的用户或者服务的地址信息
SIP-Version
请求和响应消息都需要包含SIP版本信息
状态行格式:SIP-VersionStatus-CodeReason-PhraseCRLF
状态行举例:SIP/2.0200OK/r/n
Status-Code状态码:
状态代码由3位数字组成,表示请求是否被理解或被满足。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
状态码 | 含义 |
1xx: | 临时响应、表示请求消息正在被处理 |
2xx | 成功响应、表示请求已被成功接收完全理解并接收 |
3xx | 重定向响应、表示需采取进一步完成请求 |
4xx | 客户机错误、表示请求消息中包含语法错误信息或服务器无法完成客户机的请求 |
5xx | 服务器错误、表示服务器无法合法完成请求 |
6xx | 全局故障、表示任何服务器都无法完成该请求 |
常用的状态码举例:
状态码 | msg | 含义 |
100 | Trying | 试呼叫 |
180 | Ringing | 振铃 |
181 | CallisBeingForwarded | 呼叫正在前转 |
200 | OK | 成功响应 |
302 | MovedTemporarily | 临时迁移 |
400 | BadRequest | 错误请求 |
401 | Unauthorized | 未授权 |
403 | Forbidden | 禁止 |
404 | NotFound | 用户不存在 |
408 | RequestTimeout | 请求超时 |
480 | TemporarilyUnavailable | 暂时无人接听 |
486 | BusyHere | 线路忙 |
504 | ServerTime-out | 服务器超时 |
600 | BusyEverywhere | 全忙 |
发送MESSAGE消息给user2
MESSAGEsip:user2@domain.comSIP/2.0Via:SIP/2.0/TCPuser1pc.domain.com;branch=z9hG4bK776sgdkseMax-Forwards:70From:sip:user1@domain.com;tag=49583To:sip:user2@domain.comCall-ID:asd88asd77a@1.2.3.4CSeq:1MESSAGEContent-Type:text/plainContent-Length:18user2,comehere.Header字段含义说明:
Header | 含义说明 | 举例 |
Call-ID | 由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变 | Call-ID:asd88asd77a@1.2.3.4 |
From | 表示请求的发起者 | From:sip:user1@domain.com;tag=49583 |
To | 表示请求的接受者 | To:sip:user2@domain.com |
Via | Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路 | Via:SIP/2.0/TCPuser1pc.domain.com;branch=z9hG4bK776sgdkse |
Max-Forwards | 用于表示这个包最多可以传送多少跳,每经过一跳都会减一档Max-Forwards==0系统会返回483。默认为70 | Max-Forwards:70 |
Contact | 包含源的URI信息,用来给响应方直接和源建立连接用 | Contact:sip:192.168.100.1:1111 |
Content-Type | 指明消息体的类型(SDP会话描述协议) | Content-Type:text/plain;Content-Type:application/sdp;Content-Type:application/cpim; |
Content-Length | 指明消息体的字节大小 | Content-Length:18 |
这里举两个例子:
MESSAGE消息(PagerMode)REGISTER消息以User1发送MESSAGE消息给user2为例:
MESSAGEsip:user2@domain.comSIP/2.0Via:SIP/2.0/TCPuser1pc.domain.com;branch=z9hG4bK776sgdkseMax-Forwards:70From:sip:user1@domain.com;tag=49583To:sip:user2@domain.comCall-ID:asd88asd77a@1.2.3.4CSeq:1MESSAGEContent-Type:text/plainContent-Length:18user2,comehere.代理服务器收到步骤1请求,到数据库中查找User2(注册过程中生成数据库),随后生成步骤2的数据。
MESSAGEsip:user2@domain.comSIP/2.0Via:SIP/2.0/TCPproxy.domain.com;branch=z9hG4bK123dsghdsVia:SIP/2.0/TCPuser1pc.domain.com;branch=z9hG4bK776sgdkse;received=1.2.3.4Max-Forwards:69From:sip:user1@domain.com;tag=49394To:sip:user2@domain.comCall-ID:asd88asd77a@1.2.3.4CSeq:1MESSAGEContent-Type:text/plainContent-Length:18user2,comehere.直接回应(200-OK)没有Body,也不携带Contact头域
SIP/2.0200OKVia:SIP/2.0/TCPproxy.domain.com;branch=z9hG4bK123dsghds;received=192.0.2.1Via:SIP/2.0/TCPuser1pc.domain.com;;branch=z9hG4bK776sgdkse;received=1.2.3.4From:sip:user1@domain.com;tag=49394To:sip:user2@domain.com;tag=ab8asdasd9Call-ID:asd88asd77a@1.2.3.4CSeq:1MESSAGEContent-Length:0代理服务器收到回复后,去掉最顶端的Via,转发如下消息给User1
SIP/2.0200OKVia:SIP/2.0/TCPuser1pc.domain.com;branch=z9hG4bK776sgdkse;received=1.2.3.4From:sip:user1@domain.com;;tag=49394To:sip:user2@domain.com;tag=ab8asdasd9Call-ID:asd88asd77a@1.2.3.4CSeq:1MESSAGEContent-Length:0首先举例一个非鉴权注册消息。
192.168.2.161机器发送注册消息给192.168.2.89服务器:
REGISTERsip:192.168.2.89SIP/2.0Via:SIP/2.0/UDP192.168.2.161:10586Max-Forwards:70From:;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931To:Call-ID:da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161CSeq:1REGISTERContact:;methods="INVITE,MESSAGE,INFO,SUBSCRIBE,OPTIONS,BYE,CANCEL,NOTIFY,ACK,REFER"User-Agent:RTC/1.2.4949(BOLSIPPhone1005)Event:registrationAllow-Events:presenceContent-Length:0 当注册成功(回送200OK)时,服务器发送的res消息参考如下:
SIP/2.0200OKVia:SIP/2.0/UDP192.168.2.161:10586From:;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931To:;tag=-00834-14d0805b62bc026dCall-ID:da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161CSeq:1REGISTERAllow:INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGEContact:sip:192.168.2.161:10586Content-Length:0Expires:3600 当需要鉴权注册时
请求端192.168.2.161发送注册消息给192.168.2.89服务器服务器对192.168.2.161发送“401Unauthorized”信息给请求端,提示请求端需要带上鉴权信息重新注册请求端带上鉴权信息后(带有“Authorization”头字段)重新向服务器注册服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送200OK消息。若失败,继续发送401消息。请求端192.168.2.161发送注册消息给192.168.2.89服务器
REGISTERsip:192.168.2.89SIP/2.0Via:SIP/2.0/UDP192.168.2.161:8021Max-Forwards:70From:;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430dTo:Call-ID:c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161CSeq:1REGISTERContact:;methods="INVITE,MESSAGE,INFO,SUBSCRIBE,OPTIONS,BYE,CANCEL,NOTIFY,ACK,REFER"User-Agent:RTC/1.2.4949(BOLSIPPhone1005)Event:registrationAllow-Events:presenceContent-Length:0 服务器对192.168.2.161发送401Unauthorized信息给请求端,提示请求端需要带上鉴权信息重新注册:
SIP/2.0401UnauthorizedVia:SIP/2.0/UDP192.168.2.161:8021From:;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430dTo:;tag=-001893-38ba013ba3dde36eCall-ID:c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161CSeq:1REGISTERAllow:INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGEContact:Content-Length:0WWW-Authenticate:Digestrealm="192.168.2.89",qop="auth",nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10",opaque="",stale=FALSE,algorithm=MD5 请求端192.168.2.161通过Authorization头字段带上鉴权头信息,发送一个新的REGISTER消息:
REGISTERsip:192.168.2.89SIP/2.0Via:SIP/2.0/UDP192.168.2.161:8021Max-Forwards:70From:;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430dTo:Call-ID:c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161CSeq:2REGISTERContact:;methods="INVITE,MESSAGE,INFO,SUBSCRIBE,OPTIONS,BYE,CANCEL,NOTIFY,ACK,REFER"User-Agent:RTC/1.2.4949(BOLSIPPhone1005)Authorization:Digestusername="01062237493",realm="192.168.2.89",qop=auth,algorithm=MD5,uri="sip:192.168.2.89",nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10",nc=00000001,cnonce="12660455546344082314666316435946",response="f57e47ce03162293b9ced07362ce2b79"Event:registrationAllow-Events:presenceContent-Length:0 服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送200OK消息。若失败,继续发送401消息
SIP/2.0200OKVia:SIP/2.0/UDP192.168.2.161:8021From:;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430dTo:;tag=-001894-a5eb977c8969aa51Call-ID:c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161CSeq:2REGISTERAllow:INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGEContact:sip:192.168.2.161:8021Content-Length:0Expires:3600(xiaxveliang)
上一篇:什么是春药(男子强奸多名女网友)