得到IP包的数据意义(简单实现例子)

1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <linux/if_ether.h>
  4 #include <linux/ip.h>
  5 #include <linux/udp.h>
  6 #include <linux/types.h>
  7
  8 void show_mac(const unsigned char *data);
  9 void show_ip(const unsigned char *data);
 10 void show_arp(const unsigned char *data);
 11 void show_udp(const unsigned char *data);
 12 void show_tcp(const unsigned char *data);
 13 void show_app(const unsigned char *data);
 14
 15 int main()
 16 {
 17         unsigned char data[1024] = {
 18         0x00, 0x26, 0xc6, 0x41, 0x06, 0xb2, 0x00, 0x26,
 19         0xc6, 0x39, 0x8c, 0x36, 0x08, 0x00, 0x45, 0x00,
 20         0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 21         0x7a, 0x90, 0xc0, 0xa8, 0x1f, 0x72, 0xc0, 0xa8,
 22         0x1f, 0x7a, 0x94, 0x2b, 0x25, 0x37, 0x00, 0x0c,
 23         0xa0, 0x6d, 0x77, 0x61, 0x6e, 0x67
 24         };
 25
 26         show_mac(data);
 27
28 }
 29
 30 void show_mac(const unsigned char *data)
 31 {
 32         struct ethhdr *eth = (struct ethhdr *)data;
 33         printf("-------------物理层-------------\n");
 34         printf("目的MAC地址:  %02x:%02x:%02x:%02x:%02x:%02x\n",
 35                 eth->h_dest[0], eth->h_dest[1],
 36                 eth->h_dest[2], eth->h_dest[3],
 37                 eth->h_dest[4], eth->h_dest[5]
 38                 );
 39         printf("源端MAC地址:  %02x:%02x:%02x:%02x:%02x:%02x\n",
 40                 eth->h_source[0], eth->h_source[1],
 41                 eth->h_source[2], eth->h_source[3],
 42                 eth->h_source[4], eth->h_source[5]
 43                 );
 44         printf("使用的协议:   %04x\n\n", ntohs(eth->h_proto));
 45         if(ntohs(eth->h_proto) == 0x0800)
 46         show_ip(data);
 47         if(ntohs(eth->h_proto) == 0x0806)
 48         show_arp(data);
 49 }
 50 void show_ip(const unsigned char *data)
 51 {
 52         printf("-------------网络层-------------\n");
53
 54         struct iphdr *ip = (struct iphdr *)(data + sizeof(struct ethhdr));
 55         printf("版本号:       %d\n", ip->version);
 56         printf("IP首部长度:   %d\n", (ip->ihl)*4);
 57         printf("服务类型:     %d\n", ip->tos);
 58         printf("总长度:       %d\n", ntohs(ip->tot_len));
 59         printf("标识:         %d\n", ip->id);
 60         printf("片偏移:       %d\n", ip->frag_off);
 61         printf("生存时间:     %d\n", ip->ttl);
 62         printf("上层使用协议: %d\n", ip->protocol);
 63         printf("首部检验和:   %d\n", ip->check);
 64         printf("源IP地址:     %s\n", inet_ntoa(ip->saddr));
 65         printf("目的IP地址:   %s\n\n", inet_ntoa(ip->daddr));
 66         if(ip->protocol == 6)
 67         show_tcp(data);
 68         if(ip->protocol == 17)
 69         show_udp(data);
 70 }
 71 void show_arp(const unsigned char *data)
 72 {
 73
 74 }
 75 void show_udp(const unsigned char *data)
76 {
 77         printf("-------------传输层-------------\n");
 78         struct udphdr *udp = (struct udphdr *)(data + sizeof(struct ethhdr)+ sizeof(struct iphdr));
 79         printf("源端口号:     %d\n", htons(udp->source));
 80         printf("目的端口号:   %d\n", htons(udp->dest));
 81         printf("UDP长度:      %d\n", htons(udp->len));
 82         printf("UDP检验和:    %x\n\n", htons(udp->check));
 83         show_app(data);
 84 }
 85 void show_tcp(const unsigned char *data)
 86 {
 87
 88 }
 89 void show_app(const unsigned char *data)
 90 {
 91         printf("-------------应用层-------------\n");
 92         char *p = (char *)(data + sizeof(struct ethhdr)+ sizeof(struct iphdr)+sizeof(struct udphdr));
 93         printf("数据:%s\n\n", p);
 94
 95 }
时间: 2024-11-03 22:07:38

得到IP包的数据意义(简单实现例子)的相关文章

Lwip IP包分片重组

1. 开发环境 操作系统:SylixOS 编程环境:RealEvo-IDE3.1 硬件平台:AT9x25开发板 2. 技术实现 SylixOS系统使用的网络协议栈是Lwip协议栈.Lwip是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行.Lwip实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使Lwip协议栈适合在低端的嵌入式系统中使用. Lwip协议栈主要关注的是怎么样减少内存的使用和代码的大小

IP包、TCP报文、UDP数据段格式的汇总

一.IP包格式 IP数据包是一种可变长分组,它由首部和数据负载两部分组成.首部长度一般为20-60字节(Byte),其中后40字节是可选的,长度不固定,前20字节格式为固定.数据负载部分的长度一般可变,整个IP数据包的最大长度为65535B. 1.版本号(Version) 长度为4位(bit),IP v4的值为0100,IP v6的值为0110. 2.首部长度 指的是IP包头长度,用4位(bit)表示,十进制值就是[0,15],一个IP包前20个字节是必有的,后40个字节根据情况可能有可能没有.

TCP/IP协议栈与数据包封装+TCP与UDP区别

ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图. TCP/IP参考模型的层次结构 TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型.ARPANET是由美国国防部(U.S.Department of Defense,Do

以太网,IP,TCP,UDP数据包分析

http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).传输层(Transport).网络层(Network)和链路层(Link)四层. 通信过程中,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如

以太网数据包、IP包、TCP/UDP 包的结构(转)

源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Header Length):长度4比特.这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分.该部分占4个bit位,单位为32bit(4个字节),即本区域值 = IP头部长度(单位为bit)/ (8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节.IP包头最小

C++ 捕获本机网卡的IP包并对其解析的实现

编程要求:捕获本机网卡的IP包,对捕获的IP包进行解析.要求必须输出以下字段:版本号.总长度.标志位.片偏移.协议.源地址和目的地址. TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报(IP Datagram).这是一个与硬件无关的虚拟包,由首部和数据两部分组成.首部的前一部分是固定长度,共 20 字节,是所有IP数据报必须具有的.在首部的固定部分的后面是一些可选字段,其长度是可变的.下面我们看一下IP数据包的格式: 具体的说明: 各个字段说明 版本 IP协议版本号, IPv4此字段

IP包格式

网络层提供的服务就是在不同网段之间转发数据包. Ip包结构 1,格式(每行4byte*5) 2,版本 V4 V6 3,首部长度 20(固定)+可变长度 ?,区分服务 Win2008开始:gpedit.msc 设置DSCP值 5,总长度 设置头长度的意义:因为ip头有可变部分.头长度丈量头部长度,总长度-头长度=数据长度. 6,数据包分片 为什么要分片? 数据链路层最大允许1500byte. Ip层最大允许2的12次方(总长度2byte)65535字节. ID 数据包尺寸: 数据链路层数据:150

IP 包分片

本文以 linux 2.6.27.62 中 UDP 发包过程中重要的一个 IP 层的函数来分析 IP 层是如何分片的. 科普一下,什么是 IP 包分片,在某一个链路上,比如在以太网链路上,每次所能发送最大的包是有限制的,叫做 MTU,也就是 IP 层要想发包,每次包大小必须不大于 MTU,见上一篇文章,但传输层很有可能发送大于这个值的数据,此时  IP 层会对这些数据(可以称为 IP 包)进行分片,然后在收到时,在 IP 层再进行重组,形成一个 IP 包,交给传输层. 代码如下: int ip_

ip协议的数据分片备忘

总结: 不仅tcp协议能对数据段进行分割,ip协议也具备这个功能,之所以会这样是两者都受到底层MTU的限制(虽说tcp是根据MSS限制来分割数据包,由于MTU=tcp包头+ip包头+MSS,所以其实也算是受MTU的制约.).但是尽量别让ip协议来负责数据包的分包工作,因为虽然ip协议会对数据包进行分割,编号和分包的组装,但是ip协议不负责重传,所以传输层不提供重传机制就可能会丢失数据,而就算上层能保证重传,但是如果分包是ip协议负责,上层协议无法知道哪个分包丢失(协议之间是透明的),所以只能是将