操作系统 :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拆包的pcap文件

1、让sip消息超过mtu值

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

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

完整的sip消息的IP数据报有IP首部、UDP首部、UDP数据组成,具体如下:

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

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

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消息,然后解析;
运行效果如下:

拼接效果如下:

示例代码如下:

四、资源获取

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

关注微信公众号(聊聊博文,文末可扫码)后回复 20230408 获取。

sip消息拆包原理及组包流程的更多相关文章

  1. C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)

    介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...

  2. 抓包分析SIP消息

    I. 实验环境 SIP服务器: Yate服务器, IP:port=10.15.3.34:5060 SIP客户端: 移植Sipdroid的Android网络电话软件, IP: 10.15.3.73, A ...

  3. Qt Socket 收发图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  4. 流媒体学习三-------SIP消息结构详解

    SIP消息由三部分组成,即:开始行(start line).消息头(header).正文(body)Start-line:请求行Request-line  消息为 request消息时使用reques ...

  5. RocketMQ源码分析之RocketMQ事务消息实现原理上篇(二阶段提交)

    在阅读本文前,若您对RocketMQ技术感兴趣,请加入 RocketMQ技术交流群 根据上文的描述,发送事务消息的入口为: TransactionMQProducer#sendMessageInTra ...

  6. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  7. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布 来自官方日志的喜悦 被誉为全新开始的消息分析器 ...

  8. SIP消息类型和消息格式

    转自:http://blog.chinaunix.net/uid-1797566-id-2840904.html sip消息类型和消息格式 SIP是一个基于文本的协议,使用的是UTF-8字符集. SI ...

  9. Eureka 系列(05)消息广播(上):消息广播原理分析

    Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...

  10. 【RocketMQ】顺序消息实现原理

    全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...

随机推荐

  1. centos7 安装 elasticsearch 7.15

    下载 elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linu ...

  2. 链表反转,C++实现

    1 // To Compile and Run: g++ invert_list.cc -std=c++11 -Wall -O3 && ./a.out 2 3 4 #include & ...

  3. 递推(dp)纪中真题

    前言: 日月如梭,光阴似箭.大家好,我盛艺承又回来了.今天给大家讲一下纪中的DP(递推)真题. 题目描述 在网格中取一个N x 1的矩形,并把它当作一个无向图.这个图有2(N+1)个顶点,有3(N-1 ...

  4. spring中事物是怎么实现的?

    Spring容器事务 声明式和编程式 当需要用到事务操作的地方很少的时候,那么就可以使用编程方式 TransactionTemplate,它不会建立很多事务代理.但是,如果程序中用到大力的事务操作,声 ...

  5. ubuntu安装matplotlib失败:Can't rollback pillow, nothing uninstalled.

    今天在ubuntu1804上面使用pip安装matplotlib,安装失败,报错如下: ---------------------------------------- Can't rollback ...

  6. 树莓派3B+ wifi设置

    环境: 硬件:树莓派 3b+ 固件:2018-04-18-raspbian-stretch.img 一.树莓派配置 1.1.wifi配置方法一(已测试,ok) 参考: https://www.cnbl ...

  7. Qt之如何创建并显示一个柱状图

    创建一个简单的柱状图 第一步:创建一个QBarSet对象:QBarSet类代表条形图中的一组条形. QBarSet *set0 = new QBarSet("Jane"); QBa ...

  8. 无法将类 org.example.sh.utils.PageInfo<T>中的构造器 PageInfo应用到给定类型;

    是因为没有在工具类中加入构造器, @Data @NoArgsConstructor @AllArgsConstructor @ToString

  9. 关于C#的async和await

    1.async 与 await需要同时出现在方法中  如下图所示 public static async Task b() { await Task.Run(() => { //Thread.S ...

  10. 动力节点的MySQL的34题目的第7题的我的参考答案

    以下是:薪水的平均等级最低的部门的名称 select t4.t4deptno,t4.t4grade,d1.dname from( ##求出各部门平均等级begin select avg(t3.t3gr ...