GTP协议格式分析

article/2025/11/7 16:54:07
点击上方蓝字 [ 协议分析与还原 ] 关注我们

 分析GTP协议。

本文对比较枯燥的协议资料进行学习,有需要可继续阅读,找到自己关注的知识点,暂时无需要可直接拉到文末表示阅读结束,让微信记下热爱学习的你的痕迹。

如果说TCP/IP协议是网络世界的老大,那么,移动网络世界的扛把子一定是GTP协议无疑了。

GTP协议,即GPRS Tunnelling Protocol,翻译过来就是GPRS隧道协议的意思。

经常使用手机上网的同学,看到GPRS肯定会想,这是什么年代的玩意?确实,相对于当前炒得十分火热的5G,以及正在当家的4G,和已经过去的3G,第二点五代的GPRS技术已经很老。

但是,技术并不是跳跃式发展的,而是一小步一小步慢慢向前发展的,新的技术,总是建立在旧的技术基础上,逐渐改进提高,最终取得巨大的进步。

在久远的世纪之初的GPRS时代,GTP协议随着GPRS的出现而诞生,随着社会的发展,它并没有消逝,而是继续伴随着移动网络的大发展而继续为移动网络的互联互通而服务,发光发热。

GTP协议用于移动网络中,用来支持通用分组无线服务(GPRS)的通讯协议,位于TCP/IP或UDP/IP等协议的上层,同时,它又是基于IP的高层协议,也就是说它是由IP协议承载的,可以是TCP/IP(很早前的版本),也可以是UDP/IP。

总体的格式大概是这样,其中上方的承载协议UDP也可以是TCP:

640?wx_fmt=png

和其它协议一样,GTP协议在不同的时代也有不同的版本,最早是GTP v0,目前已经淘汰,之后先后更新为GTP v1和GTP v2。

作为移动网络的协议,GTP当然是由3GPP组织来定义的,GTP v2参考3GPP TS 29.274,GTP v1参考3GPP TS 29.060。

各个版本的差异主要是协议功能,即传输的内容的差异,新版本一般来说比旧版本承载更多的信息。

GTP协议其实是一组协议,可以分成三种独立的协议,GTP-C、GTP-U及GTP'(GTP Prime),GTP-C用于GPRS核心网内信令数据的传输,使用端口2123,GTP-U用于GPRS核心网内用户数据的传输,即手机日常的上网数据,使用端口2152,另外有GTP'用于计费数据的传输,使用端口3386。

虽然它们各自独立,但报文头的格式是统一的,每个版本都是统一定义的,且兼容旧版本。

GTP v1的消息头格式如下:

640?wx_fmt=png

图中红色部分为可选字段,其中:

version为版本号,长度3位,GTPv1值为1,即三位分别为001;

p为协议类型(Protocol type),长度1位,1表示是GTP-C或GTP-U,0表示是GTP';

R为保留位,长度1位,值为0;

e为扩展消息头标志位(Extension Header Flag),长度1位,标记是否存在一个可选的扩展消息头字段,有则值为1,无则为0;

s为序列号标志位(Sequence Number Flag),长度1位,标记是否存在一个可选的序列号字段,有则值为1,无则为0;

Pn为N-PDU号标志位(Number Flag),长度1位,标记是否存在一个可选的N-PDU号字段,有则值为1,无则为0;

Message为消息类型(Message Type),长度8位,即GTP消息的类型,消息类型参考相关标准;

Total length为消息总长度,长度16位,不包括GTP头前8字节,单位为字节;

TEID为隧道端点标识(Tunnel endpoint identifier),长度32位,用来区分GTP隧道中的不同连接;

Sequence number为序列号,长度16位,当e、s、Pn位中的任意一个值为1时,该字段存在,当s位为1时,这个字段需要被解析;

N-PDU number为N-PDU号,长度8位,当e、s、Pn位中的任意一个值为1时,该字段存在,当Pn位为1时,这个字段需要被解析;

Next extension header type为下一扩展消息头类型,长度8位,当e、s、Pn位中的任意一个值为1时,该字段存在,当e位为1时,这个字段需要被解析。

当下一扩展消息头类型存在时,当然后面是跟的具体的扩展消息,格式如下:

640?wx_fmt=png

其中:

Total length为本扩展消息总长度,长度8位,包括当前字节、内容本身以及之后的一个字节的下一扩展消息头类型,单位为字节;

Contents为本扩展消息内容,长度不固定;

Next extension header type为串联起来的下一扩展消息头类型,长度8位,当后面不存在下一扩展消息时,这个字段值为0。

GTP v2的消息头格式如下:

640?wx_fmt=png

同样,图中红色部分为可选字段,其中:

version为版本号,长度3位,GTP v2值为2,即三位分别为010;

p为捎带消息标志位(Piggybacking flag),长度1位,标记在这条消息后面会有另外一条带有完整消息头的GTP消息,有则值为1,无则值为0;

T为TEID标志位(TEID flag),长度1位,标记TEID字段是否存在,有则值为1,无则值为0,只有Echo Request和Echo Response消息不携带TEID字段;

两个Spare均为剩余位,第一个长度3位,第二个长度8位;

Message为消息类型(Message Type),长度8位,即GTP消息的类型,消息类型参考相关标准;

Total length为消息体长度,长度16位,不包括GTP头前4字节,单位为字节;

TEID为隧道端点标识(Tunnel endpoint identifier),长度32位,在T为1时存在,用来区分GTP隧道中的不同连接;

Sequence number为序列号,长度16位。

对协议分析还原而言,知道如何识别,再知道如何解析协议格式,那么,就可以去实现解析了。

例如下面这个GTP v1报文:

640?wx_fmt=png

按GTP头逐字段解析,很容易的啦。对这种用户面数据,当然我们关心的是GTP内部承载的数据了,直接把GTP头和上层的IP协议剥离,把内层的IP协议拎出来,就可以了。

看下wireshark是如何解析的,就能搞定得很好啦。

这次对GTP协议的介绍就到这里啦,对协议还原来说,一般就足够了,对具体协议的实现,就去看3gpp相关的资料吧。


640?wx_fmt=jpeg

长按进行关注,时刻进行交流。

点击“在看”,与朋友一起分享↘


http://chatgpt.dhexx.cn/article/gnAF6nue.shtml

相关文章

关于GTPv1协议解析

概述: ***(简单说一下,不重点讲述啦) GPRS 隧道协议 (GTP) 是一种隧道协议,用于 GPRS、UMTS、LTE 和 5G 网络。它分为两个独立的协议:GTP-C 和 GTP-U。GTP-C用于GPRS核心网络中,用于不同网络节…

GTP-U协议总结

1、​参考资料 3gpp TS 29.060 V17.1.0-GPRS Tunnelling Protocol (GTP) TS 29.281 V17.1.0-GPRS Tunnelling Protocol User Plane (GTPv1-U) 2、GTP协议 GTP(GPRS隧道协议(GPRSTunnelingProtocol)),可以分解成三种独立的协议&#xff0…

【5G核心网】 GTP协议

GTP 可以提供移动性的功能。 使用 GTP,网络的终端能够在网络中移动位置,各个端点集之间可以建立多个隧道,从而根据业务不同可以提供不同的 Qos,可以隐藏 IP,安全性更高。 1. 定义概念 GTP-U Message: GTP-U&#xff…

GTP协议的分析

一、 引言 在GPRS系统的GSN(GPRS Support Node,包括SGSN和GGSN)之间采用GTP(GPRS Tunnel Protocol)协议,GTP在整个GPRS协议栈中起着举足轻重的作用,GTP协议承载在TCP或UDP协议之上,分…

JS JQuery添加、替换、删除元素class属性

1、先声明一个div和两个class样式&#xff0c;用来测试&#xff1a; <html><head><meta charset"utf-8"><title></title><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><s…

jquery动态添加和删除class属性

在用jquery时&#xff0c;遇到一个问题&#xff0c;就是如何动态得添加和删除class的属性&#xff0c;下面是我的解决代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio…

用jQuery的.addClass()方法给元素加class

Target Elements by Class Using jQuery 你看到我们是怎么给所有的按钮做弹回效果了吗&#xff1f;我们用 $("button")来选中按钮&#xff0c;然后用.addClass("animated bounce")给按钮加CSS class。 你只需要用jQuery的.addClass()方法&#xff0c;就可…

js 关于动态添加class样式的学习

如果&#xff0c;我这里有一个需求。如下的页面代码 <body> <input type"button" value"红" id"btn1"/> <p id"p1"> 2016年圣诞前的一个星期天下午&#xff0c;我推开窗&#xff0c;加州明媚的阳光洒在街道上&…

jQuery通过id属性来获取元素,通过.addClass()方法来添加class.

Target Elements by ID Using jQuery 你还可以根据id属性来获取元素 首先用$("#target3")来选择id为target3的button元素。 注意&#xff0c;就像CSS一样&#xff0c;在id的名字前加上 #。 然后使用jQuery的.addClass()方法来添加 animated和fadeOutclass. 例如…

js给元素添加class样式

图中&#xff0c;左侧和右侧都需要添加不同的class类样式 结构&#xff1a; <div class"left"><div class"img_bg leftOne" click"clickLeft(企业文化)">企业文化</div><div class"img_bg leftTwo" click"…

jq获取和设置标签的css样式、jq给标签增加或移除class属性

1、jQuery获取和设置标签的css样式 jQuery既可以直接获取标签的css样式&#xff0c;也可以设置样式&#xff0c;包括行内、内部、外部样式&#xff1b;思路&#xff1a;先要选取这个标签&#xff0c;然后再获取或者设置样式&#xff1b;获取css属性&#xff1a; console.log(…

JavaScript给元素添加class属性

注意&#xff1a;element.classList.remove()、element.classList.add() — ie9及以下不兼容 // 移除div的class属性 obj.classList.remove(active);// 添加class属性值 // 方式一 obj.className new active;// 方式二 // obj.className new active;// 方式三&#xff1a;属…

jq中的addClass()方法与样式冲突

添加类样式方法 addClass()&#xff1a;向被选元素添加指定的类名 注意&#xff1a;该方法仅仅只是在原有基础上添加属性&#xff0c;不会覆盖已存在的 class 属性 提示&#xff1a;如需添加多个类&#xff0c;使用空格分隔类名 一、添加一个class属性 <style>.div {wid…

Dubbo原理简单分析

1.Dubbo原理分析 alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf),jms消息服务(napoli、notify),KV数据库(tair)等。 这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西…

dubbo解析-介绍服务端和客户端启动和服务调用步骤

本文基于dubbo 2.7.5版本代码 前面的文章介绍了很多dubbo的各个组件&#xff0c;本文将对通过介绍启动和服务调用过程梳理一下这些组件&#xff0c;也让大家对dubbo的全局有一个了解。 文章目录 一、服务端启动二、客户端启动三、服务调用 一、服务端启动 1、spring启动调用后…

面试杀手锏之Dubbo服务调用过程

点赞再看&#xff0c;养成习惯&#xff0c;微信搜一搜【三太子敖丙】关注这个喜欢写情怀的程序员。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 前言 前面我已经带着大家过了服务暴露和服务引入两个流程了…

dubbo的服务调用原理

一、前言 在我们使用dubbo进行远程服务消费时&#xff0c;可以通过Reference注解或dubbo:reference来配置引用的接口&#xff0c;最终会生成远程服务的代理类&#xff0c;转化成ReferenceBean&#xff0c;这样我们就可以像调用本地接口方法一样使用远程服务提供的功能&#xf…

18. Dubbo原理解析-服务调用

服务消费方发起请求 当服务的消费方引用了某远程服务&#xff0c;服务的应用方在spring的配置实例如下&#xff1a; <dubbo:referenceid"demoService"interface"com.alibaba.dubbo.demo.DemoServ ice" /> demoService实例其实是代理工厂生产的代理…

Dubbo 原理和机制详解

Dubbo 是一款Java RPC框架&#xff0c;致力于提供高性能的 RPC 远程服务调用方案。作为主流的微服务框架之一&#xff0c;Dubbo 为开发人员带来了非常多的便利。 1. Dubbo核心功能 Dubbo主要提供了3大核心功能&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均…

从源码全面解析 dubbo 服务端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…