“ 分析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:
和其它协议一样,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的消息头格式如下:
图中红色部分为可选字段,其中:
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时,这个字段需要被解析。
当下一扩展消息头类型存在时,当然后面是跟的具体的扩展消息,格式如下:
其中:
Total length为本扩展消息总长度,长度8位,包括当前字节、内容本身以及之后的一个字节的下一扩展消息头类型,单位为字节;
Contents为本扩展消息内容,长度不固定;
Next extension header type为串联起来的下一扩展消息头类型,长度8位,当后面不存在下一扩展消息时,这个字段值为0。
GTP v2的消息头格式如下:
同样,图中红色部分为可选字段,其中:
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报文:
按GTP头逐字段解析,很容易的啦。对这种用户面数据,当然我们关心的是GTP内部承载的数据了,直接把GTP头和上层的IP协议剥离,把内层的IP协议拎出来,就可以了。
看下wireshark是如何解析的,就能搞定得很好啦。
这次对GTP协议的介绍就到这里啦,对协议还原来说,一般就足够了,对具体协议的实现,就去看3gpp相关的资料吧。
长按进行关注,时刻进行交流。
点击“在看”,与朋友一起分享↘