Sip协议

本文详细介绍了SIP(会话发起协议)的工作原理及流程,并解析了SDP(会话描述协议)的具体结构和字段含义,同时给出了构建SDP消息的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.正常呼叫流程




### SIP协议概述 SIP(Session Initiation Protocol),即会话初始化协议,是一种用于创建、修改以及终止多方通信会话的应用层控制信令协议[^2]。此协议专为互联网设计,在功能上类似于HTTP,均采用了基于文本的UTF-8字符编码方式,并通过请求/应答机制来处理客户端和服务端之间的交互操作。 #### 协议结构与工作原理 在架构层面,SIP位于OSI七层模型中的应用层,依赖于下层的网络基础设施完成数据包的有效传递。具体来说,其底层支撑由IP提供网络服务支持,而在传输层可以选择TCP或者更为常见的UDP作为载体进行消息交换。 当涉及到具体的多媒体会议场景时,除了SIP本身外,还需要配合使用SDP(Session Description Protocol)。其中,SDP用来定义参与方之间共享的各种媒体属性详情,比如音频视频流的具体编解码器类型等;与此同时,SIP则承担起发送这些配置细节的任务,并确保参与者能够顺利建立起有效的通讯链路[^1]。 #### 安全特性 针对安全方面的需求,SIP也提供了相应的保护措施以保障通话过程的安全性和隐私性。例如,可以通过TLS加密通道防止窃听攻击,利用身份验证机制阻止未授权访问尝试等等。 ```python import socket def sip_message_example(): """简单的模拟SIP INVITE消息""" invite_msg = ( "INVITE sip:user@example.com SIP/2.0\r\n" "Via: SIP/2.0/UDP host.example.com;branch=z9hG4bK776sgdkse\r\n" "From: Alice <sip:alice@host.example.com>;tag=1928301774\r\n" "To: Bob <sip:bob@example.com>\r\n" "Call-ID: a84b4c76e66710@pc33.atlanta.example.com\r\n" "CSeq: 314159 INVITE\r\n" "Content-Type: application/sdp\r\n" "\r\n" "v=0\r\n" "o=mhandley 2890844526 2890842807 IN IP4 pc33.atlanta.example.com\r\n" "s=-\r\n" "t=0 0\r\n" "m=audio 49170 RTP/AVP 0\r\n" "a=rtpmap:0 PCMU/8000\r\n" ) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_address = ('example.com', 5060) try: sent = sock.sendto(invite_msg.encode(), server_address) finally: sock.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值