Sip协议

Sip定义

SIP 通信其实就是两个 SIP 用户端( UNC )通过服务器端( UNS )建立起通信,由一方用户端发起通信的请求,服务器端接受通信的请求并通知另一用户端,最终建立通信。完成通信后,一方用户端发起结束通信的请求,服务器端回应该请求并向另一用户端发起结束通信的请求,结束通信。

Sdp的结构

An example SDP description is:

v=0

o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4

s=SDP Seminar

i=A Seminar on the session description protocol

u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps

e=mjh@isi.edu (Mark Handley)

c=IN IP4 224.2.17.12/127

t=2873397496 2873404696

a=recvonly

m=audio 49170 RTP/AVP 0

m=video 51372 RTP/AVP 31

m=application 32416 udp wb

a=orient:portrait

 

StringBuilder builder = new StringBuilder();

builder.append("v=0\n");

builder.append(String.format("o=%s 1 1 IN IP4 %s\n""userName",XTUtils.getLocalIpAddress()));

builder.append("s=Play\n");

builder.append("i=2?videoCodecType=H.264\n");

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("b=AS:1024\n");

builder.append("t=0 0\n");

 

if(source.getActionType() == Session.CALL_VIDEO)//视频

{

builder.append(String.format("m=video %d RTP/AVP 96\n",source.sipClientLinkOpt[0].rtp_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=rtpmap:96 H264/90000\n");

builder.append("a=control:track1\n");

builder.append("a=recvonly\n");

builder.append(String.format("m=audio %d RTP/AVP 100 100\n",source.sipClientLinkOpt[1].rtp_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=rtpmap:100 MPEG4-GENERIC/8000\n");

builder.append("a=rtpmap:100 PCMA/8000\n");

builder.append("a=control:track2\n");

builder.append("a=recvonly\n");

builder.append(String.format("m=video %d RTP/AVP 96\n",CreatePort.send_opt[0].rtp_send_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=control:track1\n");

builder.append("a=rtpmap:96 H264/90000\n");

builder.append("a=sendonly\n");

builder.append(String.format("m=audio %d RTP/AVP 100\n",CreatePort.send_opt[1].rtp_send_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=control:track2\n");

builder.append("a=rtpmap:100 MPEG4-GENERIC/8000\n");

builder.append("a=sendonly\n");

}

else//音频

{

builder.append(String.format("m=audio %d RTP/AVP 100\n",source.sipClientLinkOpt[0].rtp_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=rtpmap:100 MPEG4-GENERIC/8000\n");

builder.append("a=control:track1\n");

builder.append("a=recvonly\n");

builder.append(String.format("m=audio %d RTP/AVP 100\n",CreatePort.send_opt[0].rtp_send_port));

builder.append(String.format("c=IN IP4 %s\n",XTUtils.getLocalIpAddress()));

builder.append("a=control:track\n");

builder.append("a=rtpmap:100 MPEG4-GENERIC/8000\n");

builder.append("a=sendonly\n");

}

v line 即协议的版本号,在 SDP 里面可以为 O 或者是一个字符串,是可以省略的 t ,。图中 SDP 的 v 1 ine 是 0。

o line 即主叫方,在 SDP 里面可以为 O 或者是一个字符串。当它作为一个字符串的时候,结构是这样的: 

o = < username > < sessionID > < version > < networkType > < addressType > < address > 

图 中 SDP 的o line的 username是alice ; sessionID 是 2890844526 ; version 是 2890844526 ; networkType是 IN : addressType 是 IP4 : address 是 host . anywhere.com。

o line 的一个比较重要的特点是 sessionID 在整个 Session 里面是不会改变的,而 version 随着 SDP Request 的增加会逐次增 l 。对一个 Session 里面的第一条 SDP Request , version 等于 sessionID .

s line 即当前 Session 的名字,在 SDP 里面可以为 O 或者是一个字符串,在 ATM-base 的 Session 里面,它应该被设为‘一‘, 。图 中 SDP 的 5 line 即为‘一’,。 

c line 即连接信息,在 SDP 里面为一个字符串阁,它的结构是这样的: c = = < net . orkType > < addressType > < address >

 图 中 SDP 的 c 1ine 的 net , networkType为 IN ; addressType 为 IP4 ; address 为 host . anywhere . com . 

t line 即时隙,在 SDP 里面可以为 O 或者是一个字符串 ,它的结构是这样的:

 t=< startTime> < stopTime> 

在ATM-base 的 SDP 描述里面, startTime和stopTime都被设为 0 。图中 SDP 的 t  line 的 startTime 和 stopTime 就都被设为 0 .

b line 即带宽,在 SDP 里面可以为 0 ,可以是一个字符串或者多个字符串, b line 是可以省略的 。图中 SDP 的 b line 被设为 0 .

  k line 即密钥,在 SDP 里面可以为 0 ,可以是一个字符串或者多个字符串, k line 是可以省略的。图中 SDP 的 k line 被设为 0 .

m line 即多媒体的信息,在 SDP 里面可以是一个字符串或者多个字符串。 m line 用的环境不一样,格式也不一样。在从AAL1 和从AAL5上应用的m line 格式为:

m<media > < virtua1ConnectionId > < transport > < format list > 

在AAL2 上应用的 m line 格式为: m = < media > < virtua1Connectionld > < transport# l > < format list #l > < transport #2 > < format list #2 > … < transport #m> < forat list #m>

图中SDP 的m 1ine 使用的是AAL5的格式。media 为 audio ; virtualConnectionld 为 49170 : transport 为 RTP / AVP ; format list 这里只有一个是0。

m line 在 SDP 里面是一个比较重要的 line , Codec信息就在m line 里面的 format 1 ist 里面。 format list 即所有的 Codec 的 payload type 集合。图中SDP 的一条 m 1ine ‘m= audio 49170 RTP/ AVP 0’就列出PCMU的 payload type 为 0 . 

a line 即多媒体属性,在 SDP 里面可以为 0 ,可以是一个字符串或者多个字符串。 a line 的格式有两种: 

a = = < attribute > : < value >或者 a = < value > 

一般第一种格式用得比较多。以第一条 a line 为例, attribute 为 rtpmap ; value 为‘0PCMU/8000 ’。a line 在 SDP 里面是可以有也可以没有的。对每一个 Codec 一定有 m 1ine 里面的一个 payload type ,同时也对应 T的一条a line ,但是有时候这条 a line 可以省略的。

 

Sip的消息

INVITE 消息,是发起 SIP 通信的第一条消息,所有的 sIP 消息都必须由这条消息发起。它携带发起通信用户端的地址信息:用户端发起本次通信选择的协议类型和版本号:用户端与服务器端的整个通信的 Call 一 ID 号:此次 Request 和 Response 在整个通信中的顺序号,即 CSeq ,这个顺序号,随着 Request 的增多,逐次加一递增;此次 Request 的 Request 一 URI ,对两条不同的消息, Request 一 URI 是不同的,如果一条消息连续发了两次,它的 Request 一 URI 就不会变。

SIP 通信中,第一条 INVITE 消息,是用来建立 SIP 通信的。 SIP 通信建立好之后,用户端和服务器端都可能再发起 INVITE 消息,用于修改当前通话的 Codec 信息。 

UPDATE 消息,在 SIP 通信中不是必须的。在 sIP 通信建立的过程中或者建立之后,用户端要修改 Codec 信息,就必须用 UPDATE 消息携带用户端期望的 Codec 信息给服务器端.服务器端收到一方用户端修改 Codec 信息的要求之后,也会根据情况,选择是否发 UPDATE 消息给另外一方用户端,要求其也做相应的修改。

 PRACK 消息,在完整的 SIP 通信中是必须的。在用户端或者服务器端收到 183 或者 180 消息的时候,都会发一条 PRAcK 消息给对端,作为建立通信请求的确认。 

BYE 消息,在完整的 SIP 通信中是必须的。当用户端或者服务器端要求终止通信的时候,都会发一条 BYE 消息给对端,作为终止通信的请求。 

OPTIONS消息,在 SIP 通信中不是必须的。 SIP 通信中, O 阿 IONS 消息主要是服务器端或者用户端用于询问对端的容最问题。

CANCEL 消息,在 SIP 通信中也不是必须的,只有当通信建立之前,服务器端对用户端发起的一条 Request 消息一直没有相应,因此会发 CANCEL 消息告诉用户端取消这条 Request 消息。 

INFO 消息,在 SIP 通信中也不是必须的,它是用来在用户端和服务器端传递一些通信的辅助信息,主要是容量方面的信息。

响应请求的 Response 消息有: lxx Responses , 2xx Responses , , 3xx Responses , 4xx Responses , 5xx Responses , 6xx Responses , ACK Responses 消息。

Sip通信协商流程



3.正常呼叫流程




  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值