【死磕opensips】sip协议解析

闲话

最近一直在跟一个关于音视频通话的项目,之前从webrtc结合coturn打洞转发思路,到现在关于opensips的思路,都是在慢慢摸索前进,当前期的研究不是没有结果的,问题是想要根据那些做成产品有点天方夜谭了;毕竟要走的路还有很远,坑还有很多,咱也不是怕折了腿的人,但是老总催的紧,咱不得不选择一个比较成熟的技术打底,毕竟无到有很难,还是要交一些学费的。
下面是我之前的笔记,有兴趣可以了解一下。

webrtc专栏

webrtc专栏
java的P2P打洞通讯学习之路(一)- 整理思路
java的P2P打洞通讯学习之路(二)- 初识webRTC
java的P2P打洞通讯学习之路(三)- coturn服务器的搭建

海思3518ev200学习记录(1)- 根据用户手册烧录系统镜像
海思3518ev200学习记录(2) - 交叉编译官方webRTC
海思3518ev200学习记录(3) - 编译 amazon-kinesis webrtc嵌入式实现
海思3518ev200学习记录(4) - 基于海思源码分段录制音频文件
海思 3518 ev 200编译 报错 collect2: 错误: ld 返回 1

opensips专栏

opensips专栏

开始

回归正题简单介绍一下sip。

sip历史

sipv1回话协议最早是在1996年由Mark Handley 和 Eve Schooler起草的,在1999年成为标准协议。后续经过多为前辈的贡献有了现在成熟sip技术。

什么是sip

SIP(Session Initiation Protocol,会话初始协议)可以支持并应用于语音、视频、数据等多媒体业务。sip提供了用户地址信息(用户终端地址),确定被叫方参与通讯的意愿,确定使用的介质和介质参数,振铃以及会话终止。sip 支持Presence(呈现)、Instant Message(即时消息)等特斯业务可以说,有IP网络的地方就有SIP协议的存在。

sip 会话协议流程

在这里插入图片描述
主叫方A呼叫被叫方B:

步骤1:主叫方A发送INVITE请求到代理服务器;
步骤2:代理服务器发送100 Trying 响应主叫方A;
步骤3~6:代理服务器搜索被叫方B的地址,获取地址后转发INVITE请求;
步骤7~9:被叫方B生成的180 振铃响应,返回给主叫方A;
步骤10~12:被叫方B生成的200 OK响应,返回给主叫方A;
步骤13~17:主叫方A收到被叫方B200 OK响应后,向被叫方B发送一个ACK,会话建立;
步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话;
步骤21~23:主叫方A发送200 OK响应来确认BYE,会话终止。
在这里插入图片描述

sip消息格式

sip的消息格式与http类似,由三部分组成:
line 请求行(request-line) or 状态行(status-line)
Several Headers 消息头(header)
Message Body 消息正文(body)

请求行

  • method: 确定请求的类型
  • SIP URI: 确定请求的目的地
  • SIP protocol version:SIP协议版本
    例如:< METHOD> < Request-URI> SIP/2.0
    SIP版本2.0中的六种基本方法INVITE,REGISTER,BYE,ACK,CANCEL,OPTIONS
    method的所有类型:
Method类型说明
INVITE启动/修改会话
ACK确认收到对邀请的最终回复
CANCEL取消挂起的邀请
UPDATE更新挂起会话的参数
BYE结束会话
OPTIONS请求支持的功能
REGISTER将IP地址附加到SIP URI
REFER请求UA访问URI或URL
SUBSCRIBE建立订阅以接收有关事件的通知
NOTIFY传达特定事件发生的信息
PRACK确认收到可靠传输的临时响应
MESSAGE使用SIP传输即时消息
INFO将呼叫信令信息发送到另一个与其建立了媒体会话的用户代理

状态行

  • SIP protocol version:SIP协议版本

例如: SIP/2.0 < Status-Code> < Reason-Phrase>

  • status-code:数字响应代码
    相应代码中第一个数字分为六种情况
状态码说明
1xx临时响应,表示消息正在处理
2xx成功响应,表示消息被成功接收
3xx重定向响应,表示临时转移或永久转移
4xx客户端错误,表示客户端请求中有服务器无法理解的信息
5xx服务器错误,表示服务器无法完成请求,或服务器不可用
6xx全局故障,表示所有服务器都无法完成请求信息

所有状态码示例:

状态码说明
100尝试呼叫
180振铃
181正在转接呼叫
182排队
183会话进度
200成功响应
202认可
300多项选择
301永久移除
302临时转移
303见其他
305使用代理
380代替服务
400错误请求
401未授权
402需要付款
403禁止
404未找到服务器
405方法不允许
406请求不被接受
407代理身份验证
408请求超时
409请求冲突
410请求不见了
411请求所需长度
413请求实体过大
414请求URL过长
415不支持的媒体类型
420错误扩展
480暂时不可用
481呼叫分支/事务不存在
482检测到环路
483跳太多了
484地址不完整
485请求不明确
486这里很忙
487请求已取消
488这里不能接受
500内部服务器错误
501未实施
502坏网关
503服务不可用
504网关超时
505不支持SIP版本
600全局故障
603拒绝
604在任何地方都不存在
606不可接受
  • reason phrase:理由短语

消息头

示例:

INVITE sip:barbara@b.com SIP/2.0
Via: SIP/2.0/UDP 10.43.122.3;branch=1
From: sip:alice@a.com;tag=4ad340f
To: sip:barbara@b.com
Contact: <sip:alice@10.43.122.3>
Call-ID: 1874630@10.43.122.3
Cseq: 12442 INVITE
v=0
o=user 14341433 14341433 IP4 10.43.122.3
s=.
t=0 0
c=IN IP4 10.43.122.3
m=audio 13222 RTP/AVP 0
a=rtpmap:0 PCMU/8000

Header 字段含义说明:

Header说明
Call-ID用于唯一标识两个用户代理之间的调用
Contact用于传递请求的原始资源或请求发起人的URL
CSeq命令序列识别顺序错误的请求和重传
From标识请求的发起人
To表示请求的收件人
Subject表示媒体会话主题的可选标题
Content-Length消息正文中的八位字节数
Content-Type表示Internet媒体类型。如果不存在,则假定应用程序/SDP
User Agent提供有关用户代理的附加信息,例如制造商
Server提供有关用户代理服务器的附加信息
Via记录请求所采用的路由,并用于路由响应
Record-Route用于强制UAs之间的所有请求通过代理路由
Route强制路由通过从记录路由头中提取的路径
Max-forwards限制一个请求在到达目的地的途中可以进行的跳数(70)
Authorization将用户代理的凭据传送到服务器
Encryption用于指定SIP消息中已加密的部分
Hide请求下一跳代理对Via头进行加密
Priority允许用户代理设置请求的优先级:例如紧急、紧急
Supported列出一个或多个在用户代理或服务器中实现的选项
Unsupported表示服务器不支持的功能

结束

在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无与伦比的傻

微信公众号:dasha500

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值