博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】以太网帧、IP报文格式
阅读量:5175 次
发布时间:2019-06-13

本文共 3425 字,大约阅读时间需要 11 分钟。

原文:

 

// 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 字节

转载于:https://www.cnblogs.com/oxspirt/p/10369309.html

你可能感兴趣的文章
JAVA详细运行过程及与平台无关性
查看>>
jsonp跨域总结
查看>>
c#设计模式之观察者模式(Observer Pattern)
查看>>
数论——质数筛法
查看>>
创建sum求多元素的和
查看>>
onchange 、oninput 区别&remove、empty
查看>>
UILabel的常见用法
查看>>
用户线程和内核线程的区别
查看>>
Java异常超详细总结
查看>>
Core Data 编程指南
查看>>
Crash dump中需要重点关注的信息
查看>>
art.dialog
查看>>
html css float left与 float right的使用说明
查看>>
重载运算符
查看>>
RHEL 7.3修改网卡命名规则为ethX
查看>>
Eclipse 中报错的阅读顺序
查看>>
js | javascript改变style样式和css样式
查看>>
ubuntu14 文件夹添加/删除书签
查看>>
Wp7越狱
查看>>
unixodbc 连接mysql数据库
查看>>