好好爱自己!

【转】以太网帧、IP报文格式

原文:https://www.cnblogs.com/yongren1zu/p/6274460.html

https://blog.csdn.net/gufachongyang02/article/details/53159031

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// i386 is little_endian.  
#ifndef LITTLE_ENDIAN  
#define LITTLE_ENDIAN   (1)   //BYTE ORDER  
#else  
#error Redefine LITTLE_ORDER  
#endif  
//Mac头部,总长度14字节  
typedef struct _eth_hdr 
    unsigned char dstmac[6]; //目标mac地址  
    unsigned char srcmac[6]; //源mac地址  
    unsigned short eth_type; //以太网类型  
}eth_hdr; 
//IP头部,总长度20字节  
typedef struct _ip_hdr 
    #if LITTLE_ENDIAN  
    unsigned char ihl:4;     //首部长度  
    unsigned char version:4, //版本   
    #else  
    unsigned char version:4, //版本  
    unsigned char ihl:4;     //首部长度  
    #endif  
    unsigned char tos;       //服务类型  
    unsigned short tot_len;  //总长度  
    unsigned short id;       //标志  
    unsigned short frag_off; //分片偏移  
    unsigned char ttl;       //生存时间  
    unsigned char protocol;  //协议  
    unsigned short chk_sum;  //检验和  
    struct in_addr srcaddr;  //源IP地址  
    struct in_addr dstaddr;  //目的IP地址  
}ip_hdr; 
//TCP头部,总长度20字节  
typedef struct _tcp_hdr 
    unsigned short src_port;    //源端口号  
    unsigned short dst_port;    //目的端口号  
    unsigned int seq_no;        //序列号  
    unsigned int ack_no;        //确认号  
    #if LITTLE_ENDIAN  
    unsigned char reserved_1:4; //保留6位中的4位首部长度  
    unsigned char thl:4;        //tcp头部长度  
    unsigned char flag:6;       //6位标志  
    unsigned char reseverd_2:2; //保留6位中的2位  
    #else  
    unsigned char thl:4;        //tcp头部长度  
    unsigned char reserved_1:4; //保留6位中的4位首部长度  
    unsigned char reseverd_2:2; //保留6位中的2位  
    unsigned char flag:6;       //6位标志   
    #endif  
    unsigned short wnd_size;    //16位窗口大小  
    unsigned short chk_sum;     //16位TCP检验和  
    unsigned short urgt_p;      //16为紧急指针  
}tcp_hdr; 
//UDP头部,总长度8字节  
typedef struct _udp_hdr 
    unsigned short src_port; //远端口号  
    unsigned short dst_port; //目的端口号  
    unsigned short uhl;      //udp头部长度  
    unsigned short chk_sum;  //16位udp检验和  
}udp_hdr; 
//ICMP头部,总长度4字节  
typedef struct _icmp_hdr 
    unsigned char icmp_type;   //类型  
    unsigned char code;        //代码  
    unsigned short chk_sum;    //16位检验和  
}icmp_hdr;  

  

----------------------------------

这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的。

以太网帧头部的数据结构:

typedef struct {
        unsigned char   dest_mac[6];
        unsigned char   src_mac[6];
        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:4;
        unsigned char version:4;
        unsigned char tos:8;
        unsigned short total_len;
        unsigned short ident;
        unsigned short flags;
        unsigned char  ttl:8;
        unsigned char  proto:8;
        unsigned short checksum;
        unsigned char  src_ip[4];
        unsigned char  dest_ip[4];
} 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 字节

posted @   立志做一个好的程序员  阅读(1085)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-02-13 android studio 使用(一)

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示