SIP信令

sip(Session initialization Protocol,会话初始协议),是常用的多媒体通信协议。

sip的解析

现在IP电话的两套信令标准,一个是h.323一个是sip。sip相对较新、可扩展性更强、更简单,就是没有提供像H.323那么多的功能。
作为一个应用层协议,sip协议可以支持UDP、TCP、TLS传输

协议名特点
UDP由于UDP的无连接性,所以在牺牲可靠性的同时提高了速度。适合对实时性要求高,并且对于少量数据的丢失不敏感的场景。
TCPTCP面向连接,保证了数据传输的可靠,适于对可靠性高的场景
TLSTLS:传输层安全。sip支持TCP仅仅是保证了sip报文和语音传输的可靠性,而sip支持TLS传输则保证了SIP报文 传输的安全性

sip协议的基础学习

sip是由IETF 提 出的IP电话信令协议。SIP用于发起会话,能控制多个参与者参加的多媒体会话的建立和终结,并能动态调整和修改会话属性,如会话带宽要求、传输的媒体类型(语音、视频和数据等)、媒体的编解码格式、对多播和单播的支持等。
sip是基于文本的协议,融合了HTTP和SMTP的许多元素。在看sip协议的时候会有种看http的亲切感,都可以分为请求/响应、头域、包体三个部分

sip协议的分类
  • 请求消息
消息名描述
INVITE发起会话请求,用于邀请用户加入会话,SDP中包含会话描述。
ACK证实已经收到对于INVITE请求的最终响应
BYE结束会话
CANCEL取消尚未完成的请求,对已经完成的请求没有影响
REGISTER注册
OPTIONS查询服务器能力
SUBSCRIBE类似于无线电协议上的信息请求,要求另一方报告任何特定状态或者事件
NOTIFY类似于无限电协议上的测量报告或者信息响应。传递subscribe消息请求的信息
  • 响应消息
状态码描述功能
1xx临时响应表示收到消息,正在处理
2xx成功响应表示请求已经被成功接收、处理
3xx重定向响应表示需要进一步动作来完成该请求
4xx客户端出错表示消息中有语法错误,或者SIP服务器无法完成消息处理
5xx服务器出错表示SIP服务器故障,无法处理请求
6xx全局错误无法在任何sip服务器实现
分析一个sip信令

可以从一个基础的INVITE信令开始分析sip信令各个部分

INVITE sip:alice@192.168.16.77:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.16.115:5060;rport;branch=z9hG4bKHjCsxoyfL
Max-Forwards: 70
To: <sip:alice@192.168.16.77:5060>
From: <sip:alice@atlanta.com>;tag=7e7GixbF
Call-ID: ytTRSE1G-1709001106395@IT-202204181259
CSeq: 1 INVITE
Content-Length: 215
Content-Type: application/sdp
Contact: <sip:alice@192.168.16.115:5060;transport=UDP>

v=0
o=user1 351137207 1490907357 IN IP4 192.168.16.115
s=-
c=IN IP4 192.168.16.115
t=0 0
m=audio 5080 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv

先看下消息头:

  • Via(经由):写出消息传输的路径,包括了发送者的主机名和端口,还有一个分支参数(就是例子中的branch),用于表示唯一事务
  • From(来自):包含发送者的SIP地址,可能包括用户标识符和域名
  • To(到):包含接受者的SIP地址,可能包括用户标识符和域名
  • Call-ID(呼叫标识):一个唯一的呼叫标识符,通过这个字段可以找到某一通呼叫中全部的sip消息
  • CSeq(命令序列):指示消息的执行顺序,包括一个序列号以及一个方法

再看消息体:

  • m=
    m=:是SDP中媒体行开始的标记,表示接下来是媒体描述
    audio:表示媒体流为音频流
    5080:RTP使用的端口号
    RTP/AVP:指定了传输协议和有效载荷类型,RTP表示实时传输协议,AVP(音频/视频轮廓)表示该SDP描述遵循RTP音频/视频轮廓,并使用静态有效载荷类型
    0 8 101:表示编解码器支持的有效载荷类型,一般0代表G711U,8代表G711A
  • a=
    描述了audio音频流的具体信息,比如a=rtpmap:0 PCMU/8000,就说G711U的音频流采样率是8000Hz。这里的101在描述里看着是电话事件类型–振铃,拨号,a=rtpmap:101 telephone-event/8000,采样率也是8000Hz
    下面是例子中没有,但是见过的一些消息体信息
  • v=
    版本,指定了SDP的版本号通常为0
  • o=
    指定了来源,会在信息里给出会话发起者的信息
  • s=
    会话名,-符号表示没有特定的会话名
  • c=
    连接信息,指定用于媒体传输的网络类型和地址类型以及ip
  • b=
    表示传输的瞬时最大带宽,例如b=TIAS:64000(单位可能是kbps或者bps)
分析sip信令在多种使用场景下的流程
注册(REGISTER)

REGISTER是SIP协议中的一个请求方法,用于用户代理(如电话,软电话等)向注册服务器(也称为位置服务器或者重定向服务器)注册当前位置消息。
按我的理解,就是当其他用户代理想要进行sip通信时,可以通过SIP服务器找到对方的用户代理,通常一个注册流程如下
在这里插入图片描述

用户向代理服务器发送register注册信令
一般这个信令包括两部分:请求行(Request-Line)和消息头(Message Header)
请求行包括:

  1. 方法(Method):REGISTER
  2. 请求(Request-URI):通常指向SIP注册服务器地址
    消息头一般包括(与分析一个SIP信令相同部分不重复写了):
  3. From、To
    发起注册请求的用户代理的SIP地址
  4. Max-Forwards:最大被转发次数
  5. Supported:用户代理支持的可选拓展
  6. Allow:列出了此用户代理可以理解和接受的方法
  7. Contact:是REGISTER请求的关键!!!包含用户代理希望接收呼叫和其他 SIP 请求的 URI。其中字段expire为注册有效期,以及reg-id为注册标识符
    发完注册信令后,如果需要令牌就回401状态码信令
    终端输入密码后,再次REGISTER发送给注册服务器
    服务器验证后,返回200OK
    有的注册没有验证就不需要401和再次注册了
注销流程

就是REGISTER信令中的expire注册有效期设置为0

基本呼叫建立过程

在这里插入图片描述

  1. 用户A摘机发起一路呼叫,将INVITE信令发送给代理服务器
  2. 代理服务器先检查via字段,看下是否发生环回,如果没有环回,在via头域插入代理地址,然后将INVITE信令转发给正确的用户代理B
  3. 代理服务器先向用户A返回代表正在处理中的消息码,100Trying
  4. 用户B向代理服务器发送代表正在处理中的消息码,100Trying
  5. 用户代理B指示被叫用户振铃,用户振铃后向代理服务器发送180Ringing振铃信息
  6. 代理服务将180消息转发给用户代理A
  7. 被叫用户摘机,用户代理B向代理服务器返回200OK
  8. 代理服务器将200OK信令转发给代理用户A
  9. 用户代理A收到消息后返回ACK
  10. 代理服务器将ACK消息转回给B
  11. 主被叫用户建立通信,开始通话
    注意:INVITE信令中会带有主叫方的媒体信息,被叫方的返回我实际见过在180以及在200里都有,大部分被叫的媒体服务信息会带在200OK里。实际使用的时候可以抓包看看。
正常呼叫释放

在这里插入图片描述

呼叫没有什么特别的,就是发送Bye,然后返回200OK

会话更改流程

在这里插入图片描述

会话更新流程就是重发INVITE进行重新协商

其他 场景基本都是这几个基础场景的组合,或者是一些特殊的状态码信息,具体问题可以分析抓包内容。那么怎么分宜抓包内容与如何进行抓包呢?

SIP信令抓包–tcpdump、sngrep、tshark

Windows
windows环境或者mac环境抓包,首选wireshark,这几个东西看都不用看,还是wireshark舒服,过滤条件可以直接写sip,或者需要过滤一整路就用sip.Call-ID,如果需要过滤某个方法就用sip.Method。
如果想要通过图形直观的看到sip信令流程,可以在工具栏中点击 电话-> SIP流,选中需要分析的流后,点击FlowSquence,可以打开图形化页面
Linux
接下来说下在linux环境下如何进行sip抓包和分析,通常使用两种方法

  • 想要看SIP信令以及RTP包,使用tcpdump进行抓包
  • 只想看SIP信令,可以使用sngrep进行抓包
    tcpdump进行抓包
    需要注意的是使用tcpdump进行抓包好像无法再通过过滤条件–sip进行sip信令的过滤。如果需要,可以使用端口进行过滤(通常为5060)
    抓完包之后有条件的直接拿到本地环境用wireshark进行分析,我推荐这种,看着就方便。如果实在无法这么搞,可以使用tshark分析,或者使用之后介绍的sngrep进行分析。顺带说一下,虽然tshark也能抓包,但是这个总感觉用的不舒服,可能还是适应linux下用tcpdump抓包了。
    tshark需要下载wireshark,
yum/apt install wireshark -y

简单说下tshark参数:

  • -r:读取文件不做任何过滤,后接文件名
  • -n:禁止反向解析
  • -d:这个就是wireshark上的decode as,具体写法是 -d ‘tcp.port ==80,ssh’,表示将80端口的tcp包解析为ssh
  • -e:输出报文指定字段
  • -Y:筛选过滤报文,即wireshark的过滤器
    sngrep进行抓包
    如果在linux环境下你只想要看SIP信令,那么sngrep是一个好的选择。
    sngrep安装:可以参考这个文章# 【Centos7-Sngrep】sngrep安装
    但是Centos系列已经停止维护了,现在大多数的都切换了操作系统,我大概说下AlmaLinux安装sngrep遇到的问题,我的解决方案都不是最优解,如果有大手子会搞可以教一下QAQ
    第一个问题就是,在yum换了阿里源以及安装了epel之后仍然无法下载libpcap-devel库。使用的repo文件更新语句为
# 配置
# 注意:“# baseurl” 中间有个空格(AlmaLinux 专有)
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^# baseurl=https://repo.almalinux.org|baseurl=https://mirrors.aliyun.com|g' \
    -i.bak \
    /etc/yum.repos.d/almalinux*.repo

# 恢复 (sysin)
sed -e 's|^#mirrorlist=|mirrorlist=|g' \
    -e 's|^baseurl=https://mirrors.aliyun.com|# baseurl=https://repo.almalinux.org|g' \
    -i.bak \
    /etc/yum.repos.d/almalinux*.repo

epel的repo更新

sed -e 's|^metalink=|#metalink=|g' \
    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|g' \
    -e 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|g' \
    -i.bak \
    /etc/yum.repos.d/epel*.repo
# 注意 (sysin):
# CentOS 8、AlmaLinux 9 与 Rocky Linux 8/9 中 #baseurl=https://download.example/pub
# 而 AlmaLinux 8 早期版本是:#baseurl=https://download.fedoraproject.org/pub
# 故增加一句上述地址的替换

# 恢复
sed -e 's|^#metalink=|metalink=|g' \
    -e 's|^baseurl=https://mirrors.aliyun.com|#baseurl=https://download.example/pub|g' \
    -i.bak \
    /etc/yum.repos.d/epel*.repo

重新makecache也不好使,powertools更是找不到。
所以最后在这里pkgsorg找了一个wget的rpm包,localinstall的,不知道Alma9的那个Powertools的源在哪里能找到。
除了这个库,其他都可以参照上面的那个安装文章搞,一般都没啥问题,用./configure找出来少啥,yum或者dnf安装就行
sngrep常用命令:

  1. 抓包
sngrep -d 网卡名

通过命令进行抓包,就进入到一个可视化页面,想要看哪一路SIP,直接上下,移动到sip上,enter查看详情
2. 分析现有抓包

sngrep -I 抓包文件名

这个只能查看抓包中的sip信令,操作相同,非常简单


参考链接

sip协议呼叫流程详解SIP协议
一文读懂网络报文分析神器Tshark: 100+张图、100+个示例轻松掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值