翼度科技»论坛 编程开发 python 查看内容

sip消息拆包原理及组包流程

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
操作系统 :CentOS 7.6_x64     freeswitch版本 :1.10.9sofia-sip版本: sofia-sip-1.13.14 freeswitch使用sip协议进行通信,当sip消息超过mtu时,会出现拆包的情况,这里整理下sip消息拆包原理及组包流程。一、拆包的原理

 简单来说:拆包的原因是,sip消息过长,超过mtu值。 具体原理可以参考《TCP/IP详解 卷2:实现》第10章 : IP的分片与重装
这里贴下拆包的示意图:

二、生成sip拆包的pcap文件

1、让sip消息超过mtu值

这里列举两种方法让sip消息超过mtu值,具体如下:1) 添加sip消息内容,超出默认mtu值该方法和真实场景比较贴合,建议使用,可以通过在orginate时添加自定义sip头实现,具体操作步骤获取途径:关注微信公众号(聊聊博文,文末可扫码)后回复 20230402 获取。2)设置网卡的mtu为比较小的值一般网卡默认的mut值是 1500 ,可以通过以下命令修改:
  1. ifconfig enp0s3 mtu 500up
复制代码
其中,500是新的mtu值,具体效果如下:
2、抓包获取pcap文件

为了方便起见,这里以修改mtu值的方式演示下。这里使用tcpdump进行抓包,具体如下:tcpdump -i enp0s3 udp -w sipTest1-mtu.pcap具体效果如下:
上图的INVITE消息已经拆包了。
组包时,需要看ip头里面的 More fragments 标识,拆包的数据Identification字段一致,在本示例里面是 22448 这个值。
三、sip消息组包

由于拆包是IP层的行为,sip消息大多基于udp实现,拆包的数据包里面可能没有端口信息(端口数据在udp里面定义的),解析之前需要先进行组包,这里以python为例进行演示。python版本:python 3.9libpcap版本:1.11.0b7python3如何使用libpcap的具体讲解,可从如下途径获取:关注微信公众号(聊聊博文,文末可扫码)后回复 2022102901  获取。1、基于udp实现的sip协议数据报文结构

完整的sip消息的IP数据报有IP首部、UDP首部、UDP数据组成,具体如下:
 
 其中IP首部为20字节,结构如下:
UDP首部为8字节,结构如下:

2、解析IP首部及UDP首部

ip首部解析如下:
  1. ipHdr = struct.unpack('!BBHHHBBH4s4s',bytes(p[14:34]))
  2. ver = (ipHdr[0] & 0xF0) >> 4
复制代码
udp首部解析如下:
  1. udpHdr = struct.unpack('!HHHH',bytes(p[34:42]))
  2. srcPort,dstPort = udpHdr[0],udpHdr[1]
复制代码
3、拼接SIP消息

解析过程大概分为以下几个步骤:1)解析ip头及udp头;2)判断ip头是否有moreFrag标识,如果有,则进行特殊标记处理;3)根据数据包标识拼接sip消息,然后解析;运行效果如下:
拼接效果如下:

示例代码如下:

 
 四、资源获取

本文涉及文件和完整python示例代码从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230408 获取。

来源:https://www.cnblogs.com/MikeZhang/p/sipParse20230408.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具