libpcap--GTPv2协议的cap文件解析

移动通信网络协议 — GTP 协议 目录 文章目录目录前文列表GTPGTP-C 协议(GTP 控制面)GTP-U 协议(GTP 用户面)GTP' 协议(计费传输)GTPv2 Header 前文列表 《4G EPS 中的 PDN Connection》 《4G EPS 中的 Bearer》 《4G EPS 中的 ESM 和 EMM》 GTP GTP(GPRS Tunnelling Protocol,GPRS 隧道协议)是一组基于 IP... 阅读详情
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using std::cout;
using std::endl;
using std::thread;
using std::vector;
using std::string;


void getPacket(u_char * arg,const struct pcap_pkthdr *pkthdr,const u_char * packet);


int main(int argc,char * argv [ ])
{
	if (argc < 2){
		cout << "please input test filename\n";
		return 0;
	}

	cout << "test filename= " << argv[1] << endl;
	cout << "begin time= " << time(0) << endl;

	//读取libpcap的版本
	const char *version;
	version = pcap_lib_version();
	cout << version << endl;

	//打开cap文件
	char *dev = NULL;
	char errBuff[PCAP_ERRBUF_SIZE] = {0};
	pcap_t *handle = NULL;

	handle = pcap_open_offline(argv[1], errBuff);
	if (NULL == handle){
		cout << "Error: " << errBuff << endl;
		exit(1);
	}

	cout << "running pcap_next\n";

	//读取cap文件,打印抓取到的每一个包的概要
	struct pcap_pkthdr *pktHeader = NULL;
	int status = 0;
	const u_char *pktData = NULL;
	int id = 0;

	do{		
		cout << "---------------------------------------------------------------------\n";
		cout << "status: " << status << endl;
		status = pcap_next_ex(handle, &pktHeader, &pktData);		
		getPacket((u_char *)&id, pktHeader, pktData);
	}while(status == 1);

	pcap_close(handle);
	cout << "end time=" << time(0) << endl;
	return 0;
}


//解析数据包
void getPacket(u_char * arg,const struct pcap_pkthdr *pkthdr,const u_char * packet){
	char src_mac[18] = "";
	char dst_mac[18] = "";
	char src_addr[20] = "";	
	char dst_addr[20] = "";
	
	vector split_vector;
	char *p = NULL;
	const char *split = "|";

	int *id = (int *)arg;
	cout << "id: " << ++(*id) << endl;
	cout << "Packet length: " << pkthdr->len << endl;
	cout << "Number of bytes: " << pkthdr->caplen << endl;
	cout << "Recieved time: " << ctime((const time_t *)&pkthdr->ts.tv_sec);

	if (pkthdr->len < 42)
	{
		cout << "wifi TanZhen message length error." << endl;
		exit(1);
	}
	

	sprintf(dst_mac, "%02x:%02x:%02x:%02x:%02x:%02x", *(packet + 0), *(packet + 1), *(packet + 2), *(packet + 3), *(packet + 4), *(packet + 5));	
	sprintf(src_mac, "%02x:%02x:%02x:%02x:%02x:%02x", *(packet + 6), *(packet + 7), *(packet + 8), *(packet + 9), *(packet + 10), *(packet + 11));	

	//消息头
	if (*(packet + 12) == 0x08 && *(packet + 13) == 0x00)
	{
		printf("____________________IP Protocol____________________\n");
		printf("MAC:%s >> %s\n", src_mac, dst_mac);
		sprintf(src_addr, "%02d.%02d.%02d.%02d", *(packet + 26), *(packet + 27), *(packet + 28), *(packet + 29));	
		sprintf(dst_addr, "%02d.%02d.%02d.%02d", *(packet + 30), *(packet + 31), *(packet + 32), *(packet + 33));
		printf("IP:%s >> %s\n", src_addr, dst_addr);

		if (*(packet + 23) == 0x01)
		{
			printf("____________________ICMP____________________\n");
		}
		else if (*(packet + 23) == 0x02)
		{
			printf("____________________IGMP____________________\n");
		}
		else if (*(packet + 23) == 0x06)
		{
			printf("____________________TCP____________________\n");
		}		
		else if (*(packet + 23) == 0x11)
		{
			printf("____________________UDP____________________\n");
		}

		printf("Port: %d >> %d\n", ntohs(*(unsigned short *)(packet + 34)), ntohs(*(unsigned short *)(packet + 36)));
	}

	//GTPv2消息解析
	printf("________________GPRS Tunneling Protocol________________\n");
	printf("Flag:%02x\n", *(packet + 42));
	if (*(packet + 43) == 0x01){
		printf("type: Echo Request\n");
	}
	else if (*(packet + 43) == 0x02){
		printf("type: Echo Response\n");
	}
	else if (*(packet + 43) == 0x10){
		printf("type: Create PDP context request\n");
	}
	else if (*(packet + 43) == 0x11){
		printf("type: Create PDP context response\n");
	}
	else if (*(packet + 43) == 0x12){
		printf("type: Update PDP context request\n");
	}
	else if (*(packet + 43) == 0x13){
		printf("type: Update PDP context Response\n");
	}
	else if (*(packet + 43) == 0x14){
		printf("type: Delete PDP context request\n");
	}
	else if (*(packet + 43) == 0x15){
		printf("type: Delete PDP context Response\n");
	}
	else if (*(packet + 43) == 0x20){
		printf("type: Create Session Request\n");
	}
	else if (*(packet + 43) == 0x21){
		printf("type: Create Session Response\n");
	}
	else if (*(packet + 43) == 0x22){
		printf("type: Modify Bearer Request\n");
	}
	else if (*(packet + 43) == 0x23){
		printf("type: Modify Bearer Response\n");
	}
	else if (*(packet + 43) == 0x24){
		printf("type: Delete Session Request\n");
	}
	else if (*(packet + 43) == 0x25){
		printf("type: Delete Session Response\n");
	}
	else if (*(packet + 43) == 0x30){
		printf("type: Identification request\n");
	}
	else if (*(packet + 43) == 0x31){
		printf("type: Identification Response\n");
	}
	else if (*(packet + 43) == 0x32){
		printf("type: SGSN context request\n");
	}
	else if (*(packet + 43) == 0x33){
		printf("type: SGSN context reponse\n");
	}
	else if (*(packet + 43) == 0x34){
		printf("type: SGSN context acknowledegment\n");
	}
	else if (*(packet + 43) == 0x40){
		printf("type: Modify Bearer Command\n");
	}
	else if (*(packet + 43) == 0x46){
		printf("type: Downlink Data Notification Failure Indication\n");
	}
	else if (*(packet + 43) == 0x61){
		printf("type: Update Bearer Request\n");
	}
	else if (*(packet + 43) == 0x62){
		printf("type: Update Bearer Response\n");
	}
	else if (*(packet + 43) == 0x63){
		printf("type: Delete Bearer Request\n");
	}
	else if (*(packet + 43) == 0x64){
		printf("type: Delete Bearer Response\n");
	}
	else if (*(packet + 43) == 0x82){
		printf("type: Context Request, Tracking area update request\n");
	}
	else if (*(packet + 43) == 0x83){
		printf("type: Context Response\n");
	}
	else if (*(packet + 43) == 0x84){
		printf("type: Context Acknowledge\n");
	}
	else if (*(packet + 43) == 0x85){
		printf("type: Forward Relocation Request\n");
	}
	else if (*(packet + 43) == 0x8d){
		printf("type: Configuration Transfer Tunnel\n");
	}
	else if (*(packet + 43) == 0xa6){
		printf("type: Create Indirect Data Forwarding Tunnel Request\n");
	}
	else if (*(packet + 43) == 0xa7){
		printf("type: Create Indirect Data Forwarding Tunnel Response\n");
	}
	else if (*(packet + 43) == 0xa8){
		printf("type: Delete Indirect Data Forwarding Tunnel Request\n");
	}
	else if (*(packet + 43) == 0xa9){
		printf("type: Delete Indirect Data Forwarding Tunnel Response\n");
	}
	else if (*(packet + 43) == 0xaa){
		printf("type: Release Access Bearers Request\n");
	}
	else if (*(packet + 43) == 0xab){
		printf("type: Release Access Bearers Response\n");
	}
	else if (*(packet + 43) == 0xb0){
		printf("type: Downlink Data Notification\n");
	}
	else if (*(packet + 43) == 0xb1){
		printf("type: Downlink Data Notification Acknowledgement\n");
	}

	
	printf("Length: %d\n", ntohs(*(unsigned short *)(packet + 44)));
	printf("TEID:0x%02x%02x%02x%02x\n", *(packet + 46), *(packet + 47), *(packet + 48), *(packet + 49));	
	printf("Sequence Number:0x00%02x%02x%02x\n", *(packet + 50), *(packet + 51), *(packet + 52));
}

基于FPGA的PCIe 2.0 DMA高速数据传输系统设计与实现 htmltable {th, td {th {pre {简介:PCIe 2.0 DMA是一种高效的直接内存访问技术,广泛应用于FPGA平台以实现高速数据传输。该技术通过支持5Gbps/通道的传输速率和高达16GBps的x16配置带宽,显著提升系统性能。DMA机制使FPGA可绕过CPU直接访问主机内存,降低处理器负载并提高吞吐量。 阅读详情

相关推荐

gtpv2:用于golang的GPRS隧道协议库

总览 该软件包为GPRS隧道协议(GTP)版本2提供了一个模块。GTPv2在。 安装 go get github.com/blorticus/gtpv2 基本用法 package main import ( gtpv2 "github.com/blorticus/gtpv2" "net" "fmt" ) func main () { modifyBearerRequest := gtpv2 . NewPDU ( gtpv2 . ModifyBearerRequest , 0x00001acc , [] * gtpv2. IE { gtpv2 . NewIEWithRawData ( gtpv2 . UserLocationInformation , [] byte { 0x18 , 0x00 , 0x11 ,

GTP协议格式分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “分析GTP协议。” 本文对比较枯燥的协议资料进行学习,有需要可继续阅读,找到自己关注的知识点,暂时无需要可直接拉到文末表示阅读结束,让微信记下热爱学习的你的痕迹。 如果说TCP/IP协议是网络世界的老大,那么,移动网络世界的扛把子一定是GTP协议无疑了。 GTP协议,即GPRS T...

协议分析与还原 3万+

GTPv2通信协议详解(英文版)

详细的介绍了GTPv2的数据包类型、数据包格式、表达的含义、包含的元素类型、以及通信方式等,总的来讲,是学习GTPv2协议非常有帮助的资料

对于GTPv2协议头部的解析

参考3GPP TS 29.060 GTP的头部是可变的,GTP-C(control)和GTP-U(user)共同使用一个头部。 GTP Header头部: -Version 用来标识GTP协议的版本,在这里应该设置为1。 -Protocol Type(PT)。这一位用来标识是GTP(PT为1)还是GTP'(PT为0)。GTP'在3GPP TS 32.295中定义,并且它的头部的含义和G...

weixin_34216107的博客 2407

3gpp GTPv2-c

3GPP TS 29.274 V12.6.0 (2014-09) Technical Specification 3rd Generation Partnership Project; Technical Specification Group Core Network and Terminals; 3GPP Evolved Packet System (EPS); Evolved General Packet Radio Service (GPRS) Tunnelling Protocol for Control plane (GTPv2-C); Stage 3 (Release 12) 百度文库里下载的文件损坏打不开了,这是从官网下载的

Surface Go 2 变身 Linux 开发本:保姆级 Ubuntu 20.04 双系统安装与驱动配置全攻略

本文详细介绍了如何将 Surface Go 2 变身为高效的 Linux 开发本,涵盖 Ubuntu 20.04 双系统安装、专用内核配置、驱动优化等全流程。通过 linux-surface 内核安装和硬件驱动优化,确保 Surface Go 2 的触控、笔输入、摄像头等功能完美运行,适合开发者打造便携生产力工具。

weixin_30596165的博客 616

GPRS核心网-GTP-C协议解析

GPRS隧道协议(GTP)是3GPP标准定义的隧道协议,用于在3G / 4G网络中承载通用分组无线服务(GPRS)。 GTP用于在服务网关(S-GW)和分组数据网络网关(P-GW)以及S-GW和移动性管理实体(MME)之间为用户设备建立GTP隧道。如图-EPC架构: GTP包含哪些单独的协议? GTP包括在UDP / IP上传输的控制平面(GTP-C),用户平面(GTP-U)和计费(从GTP-C派生的GTP)流量。 GTP-C-在核心GPRS网络中的S-GW和P-GW之间执行信令,以激活和停用用户会话,调

chen1415886044的博客 4万+

Jetson Orin Nano Super开发板实战:视觉模型部署与性能优化指南

本文详细介绍了Jetson Orin Nano Super开发板在边缘AI视觉模型部署与性能优化的完整实战指南。内容涵盖JetPack 6.1环境配置、Docker容器化部署、YOLO11及Transformer模型的TensorRT优化技巧,并通过实测数据展示了性能提升与功耗管理策略,为开发者提供高效的视觉AI部署解决方案。

7h6j5k4l3的博客 1196

23060

1) RRC连接已经建立,如果没有先建立。MS 向新的SGSN发送路由区更新请求(P‑TMSI, old RAI, old P‑TMSI Signature, Update Type, follow on request, Classmark, DRX Parameters, MS Network capability)。如果有未确定的上行链路数据流(signalling or...

weixin_30533797的博客 309

Globus数据下载全攻略:从零配置到批量下载大文件(附常见问题解决)

本文详细介绍了Globus数据下载的全流程,从零配置到批量下载大文件的实用技巧,包括环境准备、高级传输策略、性能优化及常见问题解决方案。Globus作为科研数据的高效传输工具,通过并行流传输和自动校验技术,显著提升大规模数据传输的效率和可靠性。

u9v0w的博客 663

PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册

本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。

weixin_29306875的博客 343

WCDMA信令流程(非常详细)

非常实用 在WCDMA系统中具有的各种各样的信令流程中,从协议栈的层面来说,可以分为接入层的信 令流程和非接入层的信令流程;从网络构成的层面来说,可以分为电路域的信令流程和分 组域的信令流程。 所谓接入层的流程和非接入层的流程,实际是从协议栈的角度出发的。在协议栈中,RRC和 RANAP层及其以下的协议层称为接入层,它们之上的MM、SM、CC、SMS等称为非接入层。简 单地说,接入层的流程...

司马如风 9577

Unlocking Decoding-time Controllability: Gradient-FreeMulti-Objective Alignment with Contrastive Pr

将基于庞大网络语料库训练的大型语言模型(LLMs)(OpenAI,2023;Touvron 等,2023;Google,2023)与人类偏好对齐,是减少产生不安全(Wei 等,2023)、幻觉(Zhang 等,2023b)和有偏见(Gallegos 等,2023)内容的重要一步。随着偏好学习技术(如 PPO(Schulman 等,2017)、DPO(Rafailov 等,2023)及其他变体(Azar 等,2023;Ethayarajh 等,2024;

qq_52053775的博客 1169

3G时会有两次 Activate PDP context request消息

展锐平台为ATTACH_REQUEST建立的RRC不会用来发送ACTIVATE_PDP_CONTEXT_REQUEST,因为ATTACH_REQUEST和ACTIVATE_PDP_CONTEXT_REQUEST需要建立RRC的原因是不一样的;展锐平台为ATTACH_REQUEST建立的RRC不会用来发送ACTIVATE_PDP_CONTEXT_REQUEST,因为ATTACH_REQUEST和ACTIVATE_PDP_CONTEXT_REQUEST需要建立RRC的原因是不一样的,具体见下面日志分析。...

modem 1076

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2087

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

我的所有基于`RV1126`的机器人项目都是在`Ubuntu22.04`下进行开发的,在`Ubuntu18.04 Docker`容器中实现`RV1126`的`SDK`编译,详细可参考我之前的博客[《Ubuntu20.04/22.04下Docker方案实现多平台SDK编译》第2章](https://blog.youkuaiyun.com/w1820020635/article/details/147342689),`RV1126`的`ROS1`部署没什么难度,可以参考我之前的博客,这里记录了`ROS2`交叉编译及问题解决

w1820020635的博客 1143

APN 建立PDP流程

GsmDataConnectiontracker.java中:         private class ApnChangeObserver extends ContentObserver {         public ApnChangeObserver () {             super(mDataConnectionTracker);         }

但求成长,不求成功,让成功成为成长的必然结果,这就是成功最正确的道路 5028

基于STM32单片机智能循迹小车毕业设计

本文介绍了一种利用STM32F103C8T6单片机为控制核心,结合多种传感器以及PID算法实现循迹避障功能的智能小车。随着我国高科技水平的不断提高和工业自动化进程的不断推进,智能小车被广泛应用于各种玩具和其他产品的设计中,极大地丰富了人们的生活。本次设计利用反射式红外光电传感器探测路面黑线实现小车循迹,利用超声波测距传感器探测路径上的障碍,控制小车自动避障,整个系统具有自动循迹、自动避障、速度检测和无线遥控功能。其中,控制部分采用STM32F103C8T6单片机,STM32F103C8T6单片机是一

qq_48771816的博客 3974

流程总结

1.Create Session Request GTP HeaderIMSI:MCC(460)+MNC(00中移动)+MSIN(10位)MSISDN:CC(86)+NDC(133)+SN    MEI ULI:Flags(ECGI/TAI/RAI/SAI/CGI) + TAI(MCC+MNC+Tracking Area Code) + ECGI(MCC+MNC+ECI)Serving

通信,3GPP 1289

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

牢牢掌握一个完整呼叫的信令流程

1.概述 作为一名网优工程师, 需要牢牢掌握一个完整呼叫的信令流程. 我们做GSM优化, 主要是对Um口要把握的更深些. 尤其是Layer3信令-也就是我们平常做路测的工程师说的层3信令。关于层3信令,可以参考GSM规范04.08. 对层3信令的准确理解,可以帮助我们快速分析和定位网络问题. 2. 理论部分 2.1一次完整的主叫流程(含切换) IDLE: DL: SYSTEM INF

Amao_come_on 的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Overview of PDP Contexts and Bearers

two。

maimang1001的专栏 611

gtp.h源码

/*   *  OpenGGSN - Gateway GPRS Support Node  *  Copyright (C) 2002, 2003, 2004 Mondru AB.  *   *  The contents of this file may be used under the terms of the GNU  *  General Public License Vers

百尺竿头 2106

发包真香之:scapy工具

本期介绍发包工具scapy--python工具

m0_51451952的博客 3290

计算机各层网络协议

计算机各层网络协议   应用层: (典型设备:应用程序,如FTP,SMTP ,HTTP)    DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配 IP 地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。实 现即插即用连网。   

huaxia520sun的专栏 1442

GTP协议的分析

一、 引言 在GPRS系统的GSN(GPRS Support Node,包括SGSN和GGSN)之间采用GTP(GPRS Tunnel Protocol)协议,GTP在整个GPRS协议栈中起着举足轻重的作用,GTP协议承载在TCP或UDP协议之上,分为信令平面和传输平面,其信令平面定义了多种消息,涉及到GPRS许多重要方面,传输平面则提供了GSN之间数据包传送的隧道。另外以GTP为基础的GT

stephen_yin的专栏 2万+

9.2 PDP Context Activation, Modification, and Deactivation Functions

https://itectec.com/spec/9-2-pdp-context-activation-modification-and-deactivation-functions/ These functions are only meaningful at the NSS level and in the MS, and do not directly involve the BSS. An MS in STANDBY or READY state can initiate these functi

maimang1001的专栏 1630
上一篇: libpcap的简单使用--抓取特定类型和端口的网络数据
下一篇: c++11新特性的简单介绍
书灯
博客等级 码龄11年 29粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值