sip是什么意思(技术文章)
admin
2023-10-29 08:02:40

让我们学习更多关于Sip协议的知识。以下内容大致分为以下几个部分:

协议简介:两种Sip会话模式,SessionModel和PagerModel;Sip消息体结构Sip消息示例

一、Sip协议简介:

SIP(会话发起协议)是IETF(互联网工程任务组)制定的多媒体通信协议。广泛应用于CS(电路交换)、NGN(下一代网络)和IMS(IPMultimediaSubsystem)网络,可以支持并应用于语音、视频、数据等多媒体业务,也可以应用于呈现和即时消息等特殊业务。可以说,哪里有IP网络,哪里就有SIP协议。SIP是类似于HTTP, SIP可以减少应用程序的开发时间,尤其是高级应用程序。因为基于IP协议的SIP利用了IP网络,固网运营商将逐渐意识到SIP技术对他们的原始意义。

二、Sip消息的两种会话模式

在SipIM通信的应用中,一般有两种通话模式:

在SessionModelPagerModel

2.1、SessionModel

会话中,当消息体内容是大于1300字节,时通常采用SessionModel。会话建立过程如下图所示:

主叫方a呼叫被叫方b:

步骤1:主叫方AINVITE;发送代理服务器请求步骤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

2.2、PagerModel

在Sip消息中,当消息主体是不大于1300字节,时,通常使用PagerModel。Sip消息通信采用MESSAGE方法,而MESSAGE方法本身在大多数应用中不是不建立Dialog.每条IM消息都是独立的,很像寻呼消息。

2.2.1MESSAGE方法的由来

RFC3428扩展了Sip协议,并将MESSAGE请求方法添加到Sip协议中。通讯使用PagerModel,传输不超过1300字节的数据。有关消息方法的详细信息,请参阅& quotSIP-RFC 3428 & quot;https://tools.ietf.org/html/rfc3428.

2.2.2MESSAGE方法消息体

当用户1想给用户2发送一条IM消息时,只需构造一条消息并发送即可。

body的消息体可以是任何MIME格式。但是,必须支持plain/text格式。你可以选择支持message/cpimmessage/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报文格式

2.2.3PagerMod

el请求流程如下

以User1向User2发送MESSAGE消息为例:

步骤1:User1发送MESSAGE请求到代理服务器;步骤2:代理服务器转发User1的MESSAGE请求给USER2;步骤3:User2收到User1的消息后,回复200OK给代理服务器;步骤7~9:代理服务器转发200OK回复给User1

三、SIP消息体格式

SIP消息体结构Http协议结构相似,均由三部分组成:

请求行(request-line)or状态行(status-line)消息头(header)正文(body)

3.1、请求行

请求行格式: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版本信息

3.2、状态行

状态行格式: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

全忙

3.3、消息头

发送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

四、SIP消息举例

这里举两个例子:

MESSAGE消息(PagerMode)REGISTER消息

4.1、MESSAGE消息(PagerModel)

User1发送MESSAGE消息给user2为例:

步骤1:User1发送MESSAGE请求到代理服务器

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.

步骤2:代理服务器转发User1的MESSAGE请求给USER2

代理服务器收到步骤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.

步骤3:User2收到User1的消息后,回复200OK给代理服务器

直接回应(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

步骤4:代理服务器转发200OK回复给User1

代理服务器收到回复后,去掉最顶端的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

4.2、REGISTER消息

首先举例一个非鉴权注册消息。

4.2.1非鉴权注册消息

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

4.2.2鉴权注册消息

当需要鉴权注册时

请求端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)

相关内容

热门资讯

金花创建房间/微信金花房卡怎么... 1.微信渠道:(荣耀联盟)大厅介绍:咨询房/卡添加微信:88355042 2.微信游戏中心:打开微...
金花房间卡/金花房卡如何购买/... 金花房间卡/金花房卡如何购买/新超圣金花房卡正版如何购买新超圣是一款非常受欢迎的游戏,咨询房/卡添加...
牛牛创建房间/金花房卡批发/神... 微信游戏中心:神牛大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...
链接牛牛/牛牛房卡游戏代理/鸿... 鸿运大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
科技实测!牛牛房卡怎么获得/乐... 微信游戏中心:乐酷大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...