这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的。
以太网帧头部的数据结构:
typedef struct {
unsigned char dest_mac[];
unsigned char src_mac[];
unsigned short eth_type;
} ethernet_header;
eth_type字段用来指明上层协议类型,两字节。eth_type字段常见值及对应协议
0x0800 网际协议(IP)
0x0806 地址解析协议(ARP)
0x8035 反向地址解析协议
更多可见:http://blog.sina.com.cn/s/blog_a206e924010111tm.html
IP报文格式头部的数据结构:
typedef struct {
unsigned char header_len:;
unsigned char version:;
unsigned char tos:;
unsigned short total_len;
unsigned short ident;
unsigned short flags;
unsigned char ttl:;
unsigned char proto:;
unsigned short checksum;
unsigned char src_ip[];
unsigned char dest_ip[];
} ip_header;
IP报文的格式如图:
IP报文中有的字段只占了4位,结构体中的成员采用了位域定义的形式。
struct name{
type name:n;
};
成员变量name占用空间为n位,n必须为正整数,其值必须小于type类型占用的位数,如果type是int,那么n必须是1~31之间的整数。对于位域类型的成员,在赋值时如果实际值超过n位能表达的范围,超出部分将会被截掉。
结构体中 首部长度字段 在 版本字段的前面,跟图片中的相反,这两个字段占一个字节,版本字段是低四位,在内存中存储的位置是 首部长度|版本 ,因此结构体中将首部长度放在第一个。
proto表示传输层的协议,常见的对应描述:
1 Internet控制消息(ICMP)
2 Internet组管理(IGMP)
6 传输控制(TCP)
17 用户数据报文(UDP)
更多见:http://blog.csdn.net/jiary5201314/article/details/41213561
IP报文中的报头长度字段表示的是头部占32比特的数字,即IP报文头部的长度为 header_len * 4 字节。