【死磕opensips】sip协议解析

  • 闲话
    • webrtc专栏
    • opensips专栏
  • 开始
    • sip历史
    • 什么是sip
    • sip 会话协议流程
    • 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 表示服务器不支持的功能

结束

【死磕opensips】sip协议解析相关推荐

  1. SIP协议解析与实现

    SIP协议解析与实现 本文将按照RFC3261逐步的介绍SIP协议,介绍了c和c++语言的实现,分析了osip库的使用和实现. 第一章 概述 一 概述 SIP协议是一个基于应用层的会话控制协议.它可以 ...

  2. 死磕 java同步系列之ReentrantReadWriteLock源码解析

    问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...

  3. java任务流程_死磕 java线程系列之线程池深入解析——普通任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了Java中 ...

  4. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  5. (SIP-1-话机注册)关于IP话机通过SIP协议注册到PBX电话交换机的全过程解析-如何看wireshark中的报文

    识别wireshark中各个报文所对应的表示含义 我们以第一个SIP包为例子. 该包发送的场景为:IP话机注册到PBX上所发送的第一个报文.我们点开可以看到,该报文一共被封装了五层.我们都知道TCP/ ...

  6. SIP协议说明以及报文字段解析

    SIP协议的概念: SIP 协议,即 会话初始协议(Session Initiation Protocol),是一个应用层的 点对点协议,用于初始.管理和终止网络中的语音和视频会话,是 GB28181 ...

  7. 死磕Java并发:深入分析volatile的实现原理

    本文转载自公众号: Java技术驿站 通过前面一章,我们了解到synchronized是一个重量级的锁,虽然JVM对它做了很多优化. 而下面介绍的volatile则是轻量级的synchronized. ...

  8. 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  9. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

最新文章

  1. mysql查看当前实时连接数
  2. codeforces 400D Dima and Bacteria 并查集+floyd
  3. oracle数据库impdp导入dmp文件功能演示,imp导入IMP-00038: Could not convert to environment character sets handle问题解决
  4. 每天一道LeetCode-----某个数在递增序列第一次和最后一次出现的位置
  5. linux终端vim底行模式点冒号,Vim基本使用方法
  6. 文件处理-写模式操作文件
  7. go语言载入json的一个坑
  8. [html] HTML采用的是RGB颜色还是CMYK颜色?为什么?
  9. Jquery 学习之基础一
  10. 使用valgrind检查内存问题
  11. 正则匹配减号_2020年这些正则应该被收藏(64条)
  12. Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)...
  13. C语言(面积计算器)不能输入负数[程序以要求]
  14. html 文字 向上滚动代码,文字向上滚动代码
  15. 日本老人租妻女,“共享家庭”能用来抵抗孤独吗?
  16. html 显示动态时间
  17. jpg怎么转换成pdf?
  18. Windows错误系统配置提权之系统服务权限配置错误 (二)
  19. 恢复出厂设置后itms注册失败_电信光纤故障OLT注册正常ITMS注册失败是怎么个情况...
  20. 数据化是什么,企业为什么要数据化管理?【Teamface企典】

热门文章

  1. Lumiprobe 活性染料丨氨基染料:花青5胺
  2. 带宽、线速、吞吐量概念
  3. 51cto python数据分析系列课程 55g_热图_ Python数据分析系列视频课程--玩转数据可视化_数据可视化视频-51CTO学院...
  4. 用python画皮卡丘画法-用python画一只可爱的皮卡丘实例
  5. QT软件开发之基础控件--2.4.4 QTextEdit文本编辑器
  6. 打印web页或文本文件时如何去掉讨厌的页眉,页脚?--暨开篇
  7. 解决Tomcat修改server.xml和content.xml后自动还原问题
  8. 多旋翼飞行器设计与控制·绪论(笔记001)
  9. 理财入门-读《小狗钱钱》有感
  10. vsCode使vue中的代码高亮