zoukankan      html  css  js  c++  java
  • 【转】以太网帧、IP报文格式

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

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

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

  • 相关阅读:
    (七)四种常见的post请求中的参数形式
    (六)获取http状态码和处理返回结果
    (五)application/x-www-form-urlencoded(表单请求)
    (四)进行HTTPS请求并进行(或不进行)证书校验(示例)
    (三)解决httpclient乱码
    (二)HttpClient Post请求
    (一)HttpClient Get请求
    (十一)Maven之profile实现多环境配置动态切换
    (四)带图片和附件的复杂邮件发送
    (三)JavaMail发送附件
  • 原文地址:https://www.cnblogs.com/oxspirt/p/10369309.html
Copyright © 2011-2022 走看看