音视频处理(四):一文讲清楚VoIP语音通话SIP和RTP协议

文章目录

  • 一、语音技术的演进过程
  • 二、SIP协议
    • [2.1 服务器架构](#2.1 服务器架构)
    • [2.2 帧格式](#2.2 帧格式)
    • [2.3 register流程](#2.3 register流程)
      • [2.3.1 digest摘要认证](#2.3.1 digest摘要认证)
    • [2.4 通话流程](#2.4 通话流程)
      • [2.4.1 事务(transcation)与会话(dialog)](#2.4.1 事务(transcation)与会话(dialog))
      • [2.4.2 invite报文](#2.4.2 invite报文)
      • [2.4.3 SDP协议](#2.4.3 SDP协议)
  • 三、语音采集与RTP
    • [3.1 RTP帧格式](#3.1 RTP帧格式)
    • [3.2 PCM语音采样](#3.2 PCM语音采样)
    • [3.3 G.711 协议标准](#3.3 G.711 协议标准)
  • 四、SIP通话拓扑搭建
  • 五、总结

一、语音技术的演进过程

语音通话技术历史悠久,从爱迪生发明电话,已经发展了100多年,已经从早期的模拟电话线发展到当下的VoIP技术,全IP化是趋势。
爱迪生电话 程控交换机PBX PSTN VoIP IPPBX

语音发展的趋势:

  • 数字化

从早期的仅支持电话线通话,到ADSL电话线上网,再到电话线和网线分离,到今天的VoIP,网线上实现语音通话,基于IP的语音通话技术,多网融合,全IP化是趋势。
仅电话线 ADSL电话线上网 电话线和网线分离 网线承载语音VoIP

  • 协议信令自动化

电话转接从一开始的人工接线员,到程控交换机PBX,再到基于IP的交换机IPPBX,实现信令和路由自动化。

总的来说VoIP是趋势,当下4G移动电话VoLTE也是VoIP的一个变种,底层技术是SIP协议,本文将详细介绍语音通话的底层技术SIP和RTP协议。

二、SIP协议

SIP(Session Initial Protocol),回话控制协议,基于UDP协议,端口号5060,RF3261 。可用作如下用途:

  • 语音通话
  • 视频通话
  • 会议

语音通话中,SIP用于信令控制,实际语音流承载使用的是RTP协议。SIP和RTSP一样都是控制流,SIP用于语音电话,RTSP则用于视频流播放控制,这两者在摄像头中都有应用。

2.1 服务器架构

SIP协议中几个关键的逻辑服务器如下:

  • 注册服务器

用于SIP客户端注册,将客户端(UA)的IP和电话号码进行绑定,以及进行一些认证的作用,校验密码是否正确。

  • 代理服务器(proxy server)

代理服务器用于转发SIP协议报文,如上图客户端发来SIP协议经过代理服务器层层转发,最终到对方UA。

  • UA(user agent)

用户代理,可以理解为SIP客户端,发起SIP请求和响应,可以接一个模拟POTS话机,代理模拟话机发起SIP请求等。

  • 位置服务器

位置服务器负责向代理服务器提供服务器端的信息,其里面存储的是注册服务器收到的用户地址信息。

  • 充定向服务器

重定向服务器不负责转发请求,只负责定位服务器端当前的地址,代理服务器接收到请求,将DNS域名解析的结果发送给重定向服务器,将定位到的服务器端当前位置返回给客户端代理服务器。和HTTP的重定向服务器一样,SIP重定向也可以起到负载均衡的作用。

2.2 帧格式

SIP、RTSP都和HTTP协议类似,是文本格式的协议以CRLF为一行结尾,也分:

  • 请求行

  • message header

  • message body

  • SIP帧类型

帧类型即方法的定义如下,主要是register和通话的invite方法。

  • SIP的错误码

和HTTP协议的错误码定义类似,

  • 1xx:临时响应(处理中)
  • 2xx:成功响应
  • 3xx:重定向响应
  • 4xx:客户端错误(请求问题)
  • 5xx:服务器错误(服务端问题)
  • 6xx:全局错误(呼叫无法完成)

常见错误码如下:

SIP CODE 描述 现象 解决方法
100 Trying 临时响应,表示请求正在处理中,但未完成。 无需操作,等待后续响应即可。
180 Ringing 被叫方已收到呼叫请求并开始振铃。 等待被叫方接听或超时。
200 OK 请求已成功完成(如呼叫接通、注册成功等)。 正常流程,无需处理。
301 Moved Permanently 被叫方已永久转移到新地址。 更新联系人地址,重新发起请求至新地址。
302 Moved Temporarily 被叫方临时转移至其他地址。 根据响应中的 Contact 头字段重试请求。
401 Unauthorized 请求缺乏有效认证信息(如用户名/密码错误)。 检查认证凭证(如 SIP 账户信息),重新发送带认证头的请求。
403 Forbidden 服务器理解请求,但拒绝执行(如权限不足)。 联系管理员确认权限配置,或检查请求合法性。
404 Not Found 请求的资源(如被叫号码)不存在。 检查被叫号码是否正确,或确认用户是否已注册。
408 Request Timeout 请求未在服务器规定时间内完成(如网络延迟或服务器过载)。 检查网络连接,调整超时参数,或重试请求。
480 Temporarily Unavailable 被叫方暂时不可用(如拒接、未注册或DND模式)。 等待被叫方恢复可用状态,或检查被叫设备状态。
486 Busy Here 被叫方正忙(如正在通话中)。 等待后重试,或启用呼叫等待功能。
487 Request Terminated 请求被取消(如主叫方主动挂断)。 正常终止流程,无需处理。
500 Server Internal Error 服务器内部错误(如配置错误或软件崩溃)。 联系服务器管理员检查日志,重启服务或修复配置。
503 Service Unavailable 服务器暂时无法处理请求(如维护或过载)。 等待服务器恢复,检查负载均衡或冗余配置。
504 Server Timeout 服务器未及时收到下游响应(如网关超时)。 检查网络链路或中继设备,调整超时设置。
603 Decline 被叫方明确拒绝呼叫(如手动拒接)。 确认被叫方意愿,或检查呼叫策略(如黑名单)。
  • SIP地址信息

message header中关键的字段如下,主要路由的一些地址信息,而message body是sdp协议格式,一般通话的invite 报文中才有,SDP协议后文介绍。

message header字段 说明
call id 通话的电话号码字符串
Cseq 报文序列号
Content-Length 消息体长度
Content-Type 消息体格式,application/sdp

5个 地址信息,用于路由转发,类以太网路由转发报文处理,由于SIP协议需要在多级proxy server之间转发,proxy server和以太网报文转发中的路由器角色一样,那需要两个地址信息来表示源和目的地址信息,to和from就是目的地址,转发 中是不做改变的。uri:用来表示下一条地址信息,via是保存SIP中间转发过程中服务器列表信息,用于记录经过的路径,SIP响应报文可以根据via路径逐条返回,via字段每经过一个服务器就会加一条记录。另外多了一个conntact地址,用于响应端直接发起请求给源端,跳过中间的代理服务器。

地址信息 以太网 SIP协议
下一跳地址 dstMac URI
上一跳地址 srcMAC via
源端地址 srcIP from/conntact
目的地址 dstIP to

2.3 register流程

register流程比较简单,分为需要认证和无需认证。

  • 无需认证

对于无需认证,即不需要密码的注册流程,只需要发送两个报文,register报文后,服务器回复200 ok,表示注册成功。
UA register server register 200 ok UA register server

  • 需要认证

需要认证的情况,注册时会有4个报文,在第一次register报文是不带认证信息,服务器收到后发送401/407 报文进行质询,然后客户端再发送带认证信息的报文,服务器认证通过发送200 ok报文,注册成功。
UA register server register 401 register(with auth) 200 ok UA register server

  • register报文

如下帧格式,UA客户端:192.168.0.130;SIP服务器:192.168.0.178,注册报文详细内容如下.

  1. register报文没有message body,只有request-line和message header

  2. request-line的URI的方法是REGISTER,目的是服务器ip

  3. via和from、connctact地址都是填充UA客户端的地址。

  4. To地址是服务器地址

2.3.1 digest摘要认证

sip认证用户名和密码,使用digest摘要认证方式,这个和http认证方法类似。流程如下,服务器通过401质询报文,通过nonce发送一个随机字符串给客户端,客户端通过nonce字符串以及用户密码,使用md5摘要算法算出一个response字符串,服务器收到字符串使用同样的算法进行认证,因为md5摘要算法不可逆,密码信息使用密文在网络中传输。

2.4 通话流程

SIP通话流程如下:

1、主叫端发送invite报文,然后各proxy代理到被叫端

2、代理服务器在收到invite报文后会先回复一个临时响应100 Trying报文表示正在处理,然后发给下一跳。

3、被叫端回复180 Ring回铃音

4、被叫接听,回复200 ok

5、媒体流建立RTP流,通话建立

6、通话结束发送Bye报文

7、回复200 ok,通话正式断开。

2.4.1 事务(transcation)与会话(dialog)

语音回话管理和分层中有两个概念很重要,事务和会话。

  • 事务

一个请求的所有响应称为事务,因为一个请求可能有多个临时响应。事务是SIP管理的最小单位。

  • 会话

一次通话过程称为一个会话。

2.4.2 invite报文

invite报文格式如下,

主叫:192.168.0.130

被叫:192.168.0.178

服务器:192.168.0.178

各字段示例如下,INVITE报文的message body是SDP协议。


2.4.3 SDP协议

SDP(Session Description Protocol)会话描述协议,主要用于SIP、RTSP音视频会话建立过程传递会话信息。rfc4566文档。SDP约定格式内容如下,SDP参数格式如下,key-value对。

复制代码
 <type>=<value>

SDP定义的参数内容,如会话IP信、端口、电话号码,媒体类型、编码格式、采样率、帧率等信息。

复制代码
 Session description
         v=  (protocol version)
         o=  (originator and session identifier)
         s=  (session name)
         i=* (session information)
         u=* (URI of description)
         e=* (email address)
         p=* (phone number)
         c=* (connection information -- not required if included in
              all media)
         b=* (zero or more bandwidth information lines)
         One or more time descriptions ("t=" and "r=" lines; see below)
         z=* (time zone adjustments)
         k=* (encryption key)
         a=* (zero or more session attribute lines)
         Zero or more media descriptions

      Time description
         t=  (time the session is active)
         r=* (zero or more repeat times)

      Media description, if present
         m=  (media name and transport address)
         i=* (media title)
         c=* (connection information -- optional if included at
              session level)
         b=* (zero or more bandwidth information lines)
         k=* (encryption key)
         a=* (zero or more media attribute lines)

SDP的示例:

复制代码
   v=0
      o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
      s=SDP Seminar
      i=A Seminar on the session description protocol
      u=http://www.example.com/seminars/sdp.pdf
      e=j.doe@example.com (Jane Doe)
      c=IN IP4 224.2.17.12/127
      t=2873397496 2873404696
      a=recvonly
      m=audio 49170 RTP/AVP 0
      m=video 51372 RTP/AVP 99
      a=rtpmap:99 h263-1998/90000

SDP协议中a=可以传递扩展参数信息。语音流程中p=传递电话号码信息,ptime表示语音流打包间隔。

三、语音采集与RTP

3.1 RTP帧格式

语音流使用RTP报文传输,RTP帧格式如下,主要作用是给语音流加上播放时间戳 ,以及 序列号解决丢包乱序问题,SSRC则是用于流区分,同一个RTP报文中可以传输多条流信息。RTP载荷类型可以是G.711(SIP通话)、H.264(RTSP视频流)。

  • RTCP帧格式

RTCP和RTP使用一组端口号,RTCP主要用于QOS和报文流量控制等作用,RTP报文本身没有流量控制作用。RTCP通常几秒中发送一个,将报文丢包信息通知对方。

3.2 PCM语音采样

PCM帧采样内容可以参考:音视频处理(二): 一文讲清楚音频处理流程:采样、压缩和播放_音频采样-CSDN博客

PCM量化的关键参数

  • 采样率
  • 位深
  • 通道数

3.3 G.711 协议标准

语音通话采用的G.711标准,G.711 是一种标准格式,而非对应具体帧格式,定义了如下内容:

协议内容
采样率 8000
压缩格式 PCMA/PCMU
RTP打包间隔 20ms,根据invite报文中的ptime而定
RTP payload报文长度 160字节,8K的采样率,每个采样1Byte,20ms报文长度
RTP报文总长度 214字节,payload(160) + 54字节头部
  • PCMA和PCMU压缩格式
特性 PCMU (G.711 μ律) PCMA (G.711 A律)
压缩特性 μ律(15折线近似) A律(13折线近似)
主要使用地区 北美、日本 中国、欧洲
对小信号的处理 量化间隔相对较大 量化间隔更小,对小信号量化更精细
实现复杂度 相对简单 相对复杂
核心共同点 采样率:8 kHz;带宽需求:64 kbps;语音质量优良(MOS分约4.7)
  • 13折现近似法

其中PCMA使用13折线近似法来进行压缩,本质是非均匀量化,根据信号的大小采用不同的刻度,小信号更精准。下图的x是归一化的有音频信号。

通信原理第7章 标准PCM语音编码 - 知乎

段内编码,通过不同度量衡,8字节可以表示11字节的数据内容,不过采用近似法,属于有损编码。

  • 编码格式

3折线法将整个输入信号的动态范围(-1 到 +1)划分为了 8(段)× 2(正负) × 16(段内等分) = 256个不同的量化间隔(量化级) 。因此,每个抽样值可以用8位二进制码(2^8=256)来唯一表示。这8位码(如 C1 C2 C3 C4 C5 C6 C7 C8)的编排非常有讲究:

极性码(C1) :最高位。表示抽样值的正负。1代表正极性,0代表负极性

段落码(C2 C3 C4):这3位码用来确定信号绝对值落在13折线(正半部分)的哪一段。3位二进制数正好可以表示8种状态,对应8个段落。

段内码(C5 C6 C7 C8) :这4位码用于确定信号绝对值在其所属的段落内,具体位于16个均匀量化等级中的哪一个。由于各段长度不同,不同段落的量化间隔(Δ)是不同的。例如,第1段的量化间隔 Δ1 = (1/128) / 16 = 1/2048(定义为1个最小量化单位),而第8段的量化间隔 Δ8 = (1/2) / 16 = 1/32 = 64Δ1。这正是非均匀量化的体现。

四、SIP通话拓扑搭建

服务器:minisipserver

5个客户端可以试用30天。

MYVOIPAPP 软件下载

服务器端配置:

默认是有3个电话号码的,如下:

客户端:eyebeam

客户端配置:

五、总结

本文整体介绍语音通话的各个技术,详细介绍SIP注册、通话协议流程,简要介绍了RTP和音频编码相关技术。具体RTP和编码算法相关大家可以查找官方文档进行进一步学习,有什么问题可以评论区一起探讨。

复制代码
相关推荐
ACP广源盛1392462567314 小时前
GSV5100A@ACP#2 进 2 出 HDMI2.0 中继器 / CAT 延长器,带有音频提取和插入功能
单片机·嵌入式硬件·音视频
EasyDSS15 小时前
革新传统勘探:视频推流平台EasyDSS无人机推流如何赋能高效安全的地质考察?
安全·音视频·无人机
ACP广源盛1392462567321 小时前
GSV5100B@ACP#一种具有音频提取和插入功能的 2 进 2 出 HDMI2.0 中继器 / CAT 延长器
单片机·嵌入式硬件·音视频
红米饭配南瓜汤1 天前
WebRTC 码率预估(1) - 接收端 TransportFeedback 生成和发送流程指南
网络·音视频·webrtc·媒体
Everbrilliant891 天前
FFmpeg解码视频数据ANativeWindow播放
ffmpeg·音视频·ffmpeg视频解码·anativewindow·threadsafequeue·解码线程·渲染线程
简鹿办公1 天前
什么是 MKV 视频格式?MKV 视频怎样批量转为 MP4 格式
音视频
愚公搬代码1 天前
【愚公系列】《腾讯元宝从入门到精通》020-元宝在图片和音视频领域的应用(创作视频)
音视频
chjqxxxx1 天前
php使用ffmpeg实现视频随机截图并转成图片
ffmpeg·php·音视频
ZEGO即构开发者2 天前
WebRTC 实战:用即构 SDK 搭建 Web 端 1v1 视频通话(含完整流程与 Demo)
前端·音视频·webrtc