notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • SIP 协议简介
  • SIP 网络单元
  • SIP 消息的两种会话模式
  • Session Model
  • Pager Model
  • SIP 消息
  • 请求行
  • 状态行
  • 消息头
  • SDP
  1. protocols

sip

Previous官方链接Nextstorage

Last updated 2 years ago

SIP 协议简介

会话发起协议(Session Initiation Protocol,缩写SIP)是一个由IETF MMUSIC工作组开发的协议,作为标准被提议用于创建,修改和终止包括视频、语音、即时通信、在线游戏和虚拟现实等多种多媒体元素在内的交互式用户会话。2000年11月,SIP被正式批准成为3GPP信号协议之一,并成为IMS体系结构的一个永久单元。SIP与H.323一样,是用于VoIP最主要的信令协议之一。

SIP 网络单元

  • 用户代理(User Agent):SIP用户代理是一个SIP逻辑网络端点,用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC(User Agent Client)和用户代理服务端UAS(User Agent Server)。UAC创建并发送SIP请求,UAS接收处理SIP请求,发送SIP响应。

  • 代理服务器(Proxy):SIP代理服务器(PROXY)在网络上位于SIP UAC和UAS之间,用于帮助UAC和UAS间的消息路由。PROXY也可以执行路由策略控制(比如,检查SIP消息的合法性,确认消息是否允许被路由)。PROXY在转发SIP消息时,可能根据需要修改SIP消息的某些部分。

  • 注册服务器(Register):SIP注册服务器用于接收SIP注册请求,并保存发送注册请求的UA的位置信息。

SIP 消息的两种会话模式

  • Session Model:会话中,对于消息体内容大于1300字节时,一般采用Session Model

  • Pager Model:在SIP消息中,对于消息体不大于1300字节时,一般采用Pager Model

Session Model

Session Model 会话流程

整个流程称之为一个 Dialog。

  1. 主叫 发送 INVITE 请求到 代理服务器

  2. 代理服务器 返回 100 Connecting/Trying 响应到 主叫

  3. 代理服务器 返回 183 振铃响应到 主叫

  4. 代理服务器 请求传输 RTP 媒体流给 主叫

  5. 代理服务器 返回 200 OK 响应到 主叫

  6. 主叫 返回 ACK 请求到 代理服务器,会话建立

  7. (代理服务器 发送“请输入分机号,以#键结束”音频流给 主叫)

  8. 主叫 输入分机号(DTMF)给 代理服务器

  9. 主叫 请求传输 RTP 媒体流给 代理服务器

  10. (主叫 与 代理服务器 之间传输媒体流)

  11. 主叫 发送 BYT 请求到 代理服务器 终止会话

  12. 代理服务器 发送 200 OK 响应给 主叫,会话终止

Pager Model

在SIP消息中,对于消息体不大于1300字节时,一般采用Pager Model。SIP消息通信中采用MESSAGE方法,MESSAGE方法本身并不建立Dialog,在多数应用中,每条IM消息都是独立的。

SIP 消息

分三部分组成:

  1. 请求行 (request-line) or 状态行 (status-line)

  2. 消息头 (header)

  3. 正文 (body)

INVITE 请求示例

INVITE sip:017821589701@10.224.0.92:5060 SIP/2.0
Via: SIP/2.0/UDP 10.38.17.11:5080;rport;branch=z9hG4bKFUmH6FKDBU8HQ
Max-Forwards: 70
From: <sip:59333141@10.38.17.11>;tag=DUSpe36F2ZH1K
To: <sip:017821589701@10.224.0.92:5060>
Call-ID: a3f93810-eec3-123a-0ca9-0242ac110002
CSeq: 46468446 INVITE
Contact: <sip:59333141@10.38.17.11:5080>
User-Agent: FreeSwitch
Allow: INVITE
Supported: linknat
Allow-Events: talk, hold, conference, refer
Content-Type: application/sdp
Content-Disposition: session
Content-Length: 242
X-FS-Support: update_display,send_info
Remote-Party-ID: <sip:59333141@10.38.17.11>;party=calling;screen=yes;privacy=off

v=0
o=FreeSWITCH 1642028306 1642028307 IN IP4 10.38.17.11
s=FreeSWITCH
c=IN IP4 10.38.17.11
t=0 0
m=audio 16170 RTP/AVP 8 0 101
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20

100 Connecting 响应示例

SIP/2.0 100 Connecting
Via: SIP/2.0/UDP 10.38.17.11:5080;rport=5080;branch=z9hG4bKFUmH6FKDBU8HQ
From: <sip:59333141@10.38.17.11>;tag=DUSpe36F2ZH1K
To: <sip:017821589701@10.224.0.92:5060>
Call-ID: a3f93810-eec3-123a-0ca9-0242ac110002
CSeq: 46468446 INVITE
Content-Length: 0

183 Session Progress 响应示例

SIP/2.0 183 Session Progress
Via: SIP/2.0/UDP 10.38.17.11:5080;rport=5080;branch=z9hG4bKFUmH6FKDBU8HQ
From: <sip:59333141@10.38.17.11>;tag=DUSpe36F2ZH1K
To:  <sip:017821589701@10.224.0.92:5060>;tag=727C7DE6-61DF9C3C00036919-A6BFD700
Call-ID: a3f93810-eec3-123a-0ca9-0242ac110002
CSeq: 46468446 INVITE
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,PRACK,SUBSCRIBE,NOTIFY,UPDATE,MESSAGE,REFER
Contact: <sip:017821589701@10.224.0.92:5060;transport=udp>
Content-Type: application/sdp
Content-Length: 216

v=0
o=- 290046927 290046927 IN IP4 10.224.0.92
s=-
c=IN IP4 10.224.0.92
t=0 0
m=audio 10082 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=direction:both

请求行

格式:Method Request-URI SIP-Version CRLF

请求方法

  • REGISTER:注册联系信息

  • INVITE:发起会话请求

  • ACK:INVITE请求的响应的确认

  • CANCEL:取消请求

  • BYE:终结会话

  • OPTIONS:查询服务器能力

  • MESSAGE:RFC3428对 SIP 协议的扩展,增加了MESSAGE方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428

状态行

格式: SIP-Version Status-Code Reason-Phrase CRLF

状态码

  • 1xx:临时响应,表示请求消息正在被处理

  • 2xx:成功响应,表示请求已被成功接收完全理解并接收

  • 3xx:重定向响应,表示需采取进一步完成请求

  • 4xx:客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机的请求

  • 5xx:服务器错误,表示服务器无法合法完成请求

  • 6xx:全局故障,表示任何服务器都无法完成该请求

常用状态码

  • 100 试呼叫(Trying)

  • 180 振铃(Ringing)

  • 181 呼叫正在前转(Call is Being Forwarded)

  • 200 成功响应(OK)

  • 302 临时迁移(Moved Temporarily)

  • 400 错误请求(Bad Request)

  • 401 未授权(Unauthorized)

  • 403 禁止(Forbidden)

  • 404 用户不存在(Not Found)

  • 408 请求超时(Request Timeout)

  • 480 暂时无人接听(Temporarily Unavailable)

  • 486 线路忙(Busy Here)

  • 504 服务器超时(Server Time-out)

  • 600 全忙(Busy Everywhere)

消息头

  • Call-ID:由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变

  • From:表示请求的发起者

  • To:表示请求的接收者

  • Via:Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路

  • Max-Forwards:用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70

  • Contact:包含源的URI信息,用来给响应方直接和源建立连接用

  • Content-Type:指明消息体的类型(SDP会话描述协议)

  • Content-Length:指明消息体的字节大小

SDP

https://leaderli.github.io/2020/09/04/sip/ // TODO

以拨打AXE模式隐私号为例

Pager Model 会话流程
Session Mode 数据包发送流程