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

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

一、拆包的原理

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

这里贴下拆包的示意图:

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

二、生成sip拆包的pcap文件

1、让sip消息超过mtu值

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

其中,500是新的mtu值,具体效果如下:

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

2、抓包获取pcap文件

为了方便起见,这里以修改mtu值的方式演示下。
这里使用tcpdump进行抓包,具体如下:
tcpdump -i enp0s3 udp -w sipTest1-mtu.pcap
具体效果如下:
sip消息拆包原理及组包流程

上图的INVITE消息已经拆包了。

组包时,需要看ip头里面的 More fragments 标识,拆包的数据Identification字段一致,在本示例里面是 22448 这个值。

三、sip消息组包

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

1、基于udp实现的sip协议数据报文结构

完整的sip消息的IP数据报有IP首部、UDP首部、UDP数据组成,具体如下:
sip消息拆包原理及组包流程

 

 其中IP首部为20字节,结构如下:

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

UDP首部为8字节,结构如下:

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

2、解析IP首部及UDP首部

ip首部解析如下:
ipHdr = struct.unpack('!BBHHHBBH4s4s',bytes(p[14:34]))
ver = (ipHdr[0] & 0xF0) >> 4
udp首部解析如下:
udpHdr = struct.unpack('!HHHH',bytes(p[34:42]))
srcPort,dstPort = udpHdr[0],udpHdr[1]

3、拼接SIP消息

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

拼接效果如下:

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

示例代码如下:

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

 

 四、资源获取

本文涉及文件和完整python示例代码从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20230408 获取。
sip消息拆包原理及组包流程

原文链接:https://www.cnblogs.com/MikeZhang/p/sipParse20230408.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:sip消息拆包原理及组包流程 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 如何用C语言、Python实现栈及典型应用

    如何用C语言、Python实现栈及典型应用 什么是栈 在计算机科学中,栈是一种实现了一端插入与删除、后进先出(LIFO)操作的有序集合。它就像是一个被限定了插入和删除操作的列表,在这里,插入操作称为推入操作,而删除操作则被称为弹出操作。只有最后插入的数据才能被弹出,想象一下备胎储备仓库或者图书馆书籍储藏室,可以帮助我们更好地理解栈数据结构的本质。 如何实现栈…

    python 2023年5月18日
    00
  • python写一个md5解密器示例

    在Python中,我们可以使用hashlib库来计算字符串的MD5值。本攻略将介绍如何使用hashlib库编写一个MD5解密器示例,并提供两个示例。 1. 使用hashlib库计算MD5值 使用hashlib库可以计算字符串的MD5值。以下是一个示例代码,演示如何使用hashlib库计算字符串的MD5值: import hashlib def md5(str…

    python 2023年5月15日
    00
  • Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例

    Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例 今日头条是一个非常流行的新闻和娱乐内容聚合应用程序,它可以从全球各地的各种来源获取新闻和娱乐内容。它是这样一个流行的应用程序,因为它为用户提供了一个简介且易于使用的接口,并且可以快速找到他们最感兴趣的内容。但是,有些内容无法直接在页面上找到,例如用户想要获取今日头条的街拍图集,这时候就需要通过…

    python 2023年6月3日
    00
  • python根据url地址下载小文件的实例

    下面是Python根据URL地址下载小文件的实例攻略: 步骤一:导入必要的模块 首先需要导入Python中的urllib.request模块,该模块可以使用HTTP/HTTPS协议访问 Internet 上的资源。 import urllib.request 步骤二:指定下载的URL地址 需要下载的文件需要指定其URL地址,例如: url = ‘http:/…

    python 2023年6月3日
    00
  • Python list列表删除元素的4种方法

    在Python中,List是一种常用的数据类型,它可以用来存储多个元素。在实际开发中,我们需要对List进行删除元素的操作。本文将深入讲解Python中List列表删除元素的4种方法,包括使用del语句、remove()函数、pop()函数和切片操作,并提供两个示例说明。 方法一:使用del语句 可以使用del语句从List中删除指定位置的元素。例如: my…

    python 2023年5月13日
    00
  • 详解Python 计算卡方值

    计算卡方值可以使用Python中的SciPy库来实现。本文将详细介绍如何使用SciPy库计算卡方值的完整攻略。 1. 计算公式 卡方值用于比较观察值和期望值之间的差异,其公式为: $$X^{2}=\sum_{i=1}^{n}\frac{(O_{i}-E_{i})^{2}}{E_{i}}$$ 其中 $O_{i}$ 表示观察到的频数,$E_{i}$ 表示期望的频…

    python-answer 2023年3月25日
    00
  • 你们要的Python绘画3D太阳系详细代码

    下面我将为你详细讲解如何实现 Python 绘画 3D 太阳系,并提供两条示例说明。 1. 准备工作 首先,需要安装以下依赖库: numpy matplotlib mpl_toolkits.mplot3d time 可以通过以下命令进行安装: !pip install numpy matplotlib mpl_toolkits.mplot3d 2. 代码实现…

    python 2023年5月18日
    00
  • 为codemirror python selenium输入文本到textarea

    【问题标题】:Input text into textarea for codemirror python selenium为codemirror python selenium输入文本到textarea 【发布时间】:2023-04-06 23:49:02 【问题描述】: 我是 selenium 的新手,正在尝试将文本输入到 CodeMirror 生成的文…

    Python开发 2023年4月7日
    00
合作推广
合作推广
分享本页
返回顶部