当前位置:首页 > 公众号精选 > C语言编程
[导读]本文的目的是通过随机截取的一段网络数据包,然后根据协议类型来解析出这段内存。学习本文需要掌握的基础知识:网络协议C语言Linux操作抓包工具的使用一、截取一个网络数据包通过抓包工具,随机抓取一个tcp数据包科莱抓包工具解析出的数据包信息如下:数据包的内存信息:数据信息可以直接拷贝...

本文的目的是通过随机截取的一段网络数据包,然后根据协议类型来解析出这段内存。

学习本文需要掌握的基础知识:

  1. 网络协议
  2. C语言
  3. Linux操作
  4. 抓包工具的使用

一、截取一个网络数据

通过抓包工具,随机抓取一个tcp数据包

科莱抓包工具解析出的数据包信息如下:数据包的内存信息:数据信息可以直接拷贝出来:

二、用到的结构体

下面,一口君就手把手教大家如何解析出这些数据包的信息。

我们可以从Linux内核中找到协议头的定义

  • 以太头:
drivers\staging\rtl8188eu\include\if_ether.h 
struct ethhdr {
 unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
 unsigned char h_source[ETH_ALEN]; /* source ether addr */
 unsigned short h_proto;  /* packet type ID field */
};
  • IP头
 include\uapi\linux\ip.h 
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)  //小端模式
 __u8 ihl:4,
  version:4;
#elif defined(__BIG_ENDIAN_BITFIELD)    //大端模式
 __u8 version:4,
  ihl:4;
#endif
 __u8 tos;
 __u16 tot_len;
 __u16 id;
 __u16 frag_off;
 __u8 ttl;
 __u8 protocol;
 __u16 check;
 __u32 saddr;
 __u32 daddr;
 /*The options start here. */
};
tcp头

include\uapi\linux\tcp.h
struct tcphdr {
 __be16 source;
 __be16 dest;
 __be32 seq;
 __be32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
 __u16 res1:4,
  doff:4,
  fin:1,
  syn:1,
  rst:1,
  psh:1,
  ack:1,
  urg:1,
  ece:1,
  cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
 __u16 doff:4,
  res1:4,
  cwr:1,
  ece:1,
  urg:1,
  ack:1,
  psh:1,
  rst:1,
  syn:1,
  fin:1;
#else
#error "Adjust your  defines"
#endif 
 __be16 window;
 __sum16 check;
 __be16 urg_ptr;
};
因为协议头长度都是按照标准协议来定义的,

所以以太长度是14, IP头长度是20, tcp头长度是20,

各个协议头对应的内存空间如下:

三、解析以太头

#define MAC_ARG(p) p[0],p[1],p[2],p[3],p[4],p[5]
 struct ethhdr *ethh;
 unsigned char *p = pkt;
 
 ethh = (struct ethhdr *)p;

 printf("h_dest:x:x:x:x:x:x \n", MAC_ARG(ethh->h_dest));
 printf("h_source:x:x:x:x:x:x \n", MAC_ARG(ethh->h_source));
 printf("h_proto:x\n",ntohs(ethh->h_proto));
注意,数据包中的数据是网络字节序,如果要提取数据一定要注意字节序问题 ethh->h_proto 是short类型,占2个字节,所以存储到本地需要使用函数ntohs 其中:n:network 网络字节序 h:host       主机字节序 s:short     2个字节 l:long       4个字节 ntohl()  :4字节网络字节序数据转换成主机字节序 htons() :2字节主机字节序数据转换成网络字节序 ntohs() :2字节网络字节序数据转换成主机字节序 htonl() :4字节主机字节序数据转换成网络字节序

当执行下面这条语句时,

ethh = (struct ethhdr *)p;
结构体指针变量eth的成员对应关系如下:

最终打印结果如下:

四、解析ip头

解析ip头思路很简单,

就是从pkt头开始偏移过以太头长度(14字节)就可以找到IP头,

解析代码如下:

#define IP_ARG(p)  p[0],p[1],p[2],p[3]
 /*
  解析IP头
 */

 if(ntohs(ethh->h_proto) == 0x0800)
 {
 
  iph = (struct iphdr *)(p   sizeof(struct ethhdr));

  q = (unsigned char *)
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

深圳市融聚汇信息科技有限公司(融聚汇)利用亚马逊云科技的技术和服务打造云原生一站式金融信息数据平台。借助亚马逊云科技,融聚汇构建了云原生一站式金融信息数据平台,快速处理来自多家主流交易所的行情、公告资讯等多元异构的海量数...

关键字: 亚马逊 SDK 数据包 MT

按照移动通信发展的规律,从2G到4G,一般正式商用3年后,都会进入到一个成熟时期,产业枝繁叶茂,应用百花齐放。但5G商用将近4年,无论是5G to B,还是5G to C,都没有达到产业界的预期。最近与产业界众多专家、行...

关键字: 5G 无人驾驶 网络数据

本篇主要讲了BLE的Link Layer,包括链路层定义的角色和状态,空中接口数据包的通信格式以及各个字段的含义,方便我们去分析LOG和定位问题。

关键字: BLE 链路层 数据包

印度班加罗尔2022年9月16日 /美通社/ -- 总部位于班加罗尔的公司Prodigy Technovations Pvt. Ltd推出了PGY-PCIeGen3/4-PA PCIe协议分析仪,支持2.5、5.0、8....

关键字: GEN PCIE 数据包 软件

全球移动网络数据流量在过去两年中翻了一番。预计到2027年,5G用户量将达到44亿 固定无线接入(FWA)在2022年占据所有移动数据网络流量的20% 预计到2027年,60%的全球移动网络数据流量将通过5G网络...

关键字: 爱立信 移动 5G 网络数据

事情从一个健身教练说起吧。李东,自称亚健康终结者,尝试使用互联网的模式拓展自己的业务。在某款新开发的聊天软件琛琛上发布广告。键盘说来就来。疯狂发送"李东",回车发送!,"亚健康终结者",再回车发送!还记得四层网络协议长什...

关键字: TCP UDP 数据包 应用层

以太网是应用最为广泛的网络传输方式,已经得到企业和用户的普遍认可,成为宽带接入的首选技术。计算机网络在传输数据时,为了保证所有共享网络资源的计算机都能公平、迅速地使用网络,通常把数据分割成若干小块作为传输单位进行发送,这...

关键字: 以太网 计算机 数据包

原文作者:dog250原文链接:https://blog.csdn.net/dog250/article/details/46666029线速问题很多人对这个线速概念存在误解。认为所谓线速能力就是路由器/交换机就像一根网...

关键字: Linux 数据包 CPU DMA

本文的目的是通过随机截取的一段网络数据包,然后根据协议类型来解析出这段内存。学习本文需要掌握的基础知识:网络协议C语言Linux操作抓包工具的使用其中抓包工具的安装和使用见下文:《一文包你学会网络数据抓包》一、截取一个网...

关键字: 代码 数据包 网络数据

对系统的运行状态进行监控,是IT工程师的一项重要工作。如果不能确保整个系统及其链路处于稳定运行的状态,那么,企业的业务稳定发展就无从谈起。21世纪以来,随着云计算的兴起,系统架构发生了显著的变化。分布式崛起,开始取代单体...

关键字: 网络数据
关闭
关闭