精华内容
下载资源
问答
  • 如题,用winpcap编程发送数据包要有以太网头,但是这个以太网头内有源mac地址目的mac地址和协议号,那么目的mac地址怎么写?是全写0xff吗?
  • 【以太网数据结构】以太网头部

    千次阅读 2015-11-24 17:14:03
    以太网目的地址和源地址各占6个字节,该地址即平常所说的网卡的MAC。每个网卡在全球拥有唯一的MAC! 在地址后面有两个字节表示类型,如:0800表示此真数据是IP数据,0806表示ARP请求。后面博客会针对讲解。 类型...

    以太网封包格式如图所示:
    以太网封包格式如图所示


    以太网目的地址和源地址各占6个字节,该地址即平常所说的网卡的MAC。每个网卡在全球拥有唯一的MAC!

    在地址后面有两个字节表示类型,如:0800表示此真数据是IP数据,0806表示ARP请求。后面博客会针对讲解。

    类型字段之后是数据,对于以太网,数据段大小为46-1500字节,不足46字节的数据将被自动补足到46字节。如ARP协议的数据格式为28字节,为了符合规范,其后被填充了18个字节以达到最少46字节的要求。

    CRC字段用于对帧内数据进行校验,保证数据传输的正确性,通常是硬件实现的。

    以太网数据包格式较为简单,简述到此!
    最后留一个问题,以太网数据包在网络中最终传输到目的地是用的IP来寻址还是MAC来寻址?(想一想,如果只是没有目的地IP,数据会准确的送达到目的地吗?倘若只是没有MAC呢?)


    在局域网内,协议栈根据MAC来精确的将数据送达到指定网卡,而在广域网中,数据在网际中肆意穿梭,直到到达目的IP(当然,数据包有生存时间的限制,以防止数据包在网络中无限循环下去)


    相关源代码
    在linux/if_ether.h文件中,以太网包头结构体定义如下:

    #define ETH_ALEN 6
    struct ethhdr {
        unsigned char   h_dest[ETH_ALEN];   /* destination eth addr */
        unsigned char   h_source[ETH_ALEN]; /* source ether addr    */
        __be16      h_proto;        /* packet type ID field */
    } __attribute__((packed)); //packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
    

    获取以太网包头函数(提示:测试该函数返回值不为空后再使用)

    static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
    {
        return (struct ethhdr *)skb_mac_header(skb);
    }
    展开全文
  • ARP数据包结构:(看不清可将图片放大查看) 为什么有ARP? 在以太网为基础的局域网中,每个网络接口都有一个硬件地址,即MAC。...ARP穿着一件外套——以太网头部,此时以太网头部目的地址为ff ff ff ff

    ARP数据包结构:(看不清可将图片放大查看)
    这里写图片描述


    为什么有ARP?
    在以太网为基础的局域网中,每个网络接口都有一个硬件地址,即MAC。在局域网中必须知道网络设备的硬件地址才能向目的主机发送数据,而在广域网中数据传输的目的地址是IP地址
    要保证数据准确的传输到目的地必须建立IP地址和硬件地址的映射关系,所以有了ARP。

    ARP穿着一件外套——以太网头部,此时以太网头部目的地址为ff ff ff ff ff ff,帧类型为0x0806。
    ARP协议结构字段解释:
    1. 硬件类型表示硬件地址类型,值为1表示以太网硬件地址
    2. 协议类型表示硬件地址的类型,值为0x0800表示询问IP地址
    3. 硬件地址长度,表示硬件地址以字节为单位的长度,MAC地址占6字节,此处填6
    4. 协议地址长度,表示协议地址以字节为单位的长度,不用说,IP地址占4个字节,此处填4
    5. 操作方式字段为本次操作的类型,可选方式见下表:

    含义
    1 ARP请求
    2 ARP应答
    3 RARP请求
    4 RARP应答

    6. 剩下的四个字段分别为发送方和接收方的MAC和IP


    相关源代码
    在linux/if_arp.h中,arp数据包头结构体定义如下:

    struct arphdr {
        __be16      ar_hrd;     /* format of hardware address   */
        __be16      ar_pro;     /* format of protocol address   */
        unsigned char   ar_hln;     /* length of hardware address   */
        unsigned char   ar_pln;     /* length of protocol address   */
        __be16      ar_op;      /* ARP opcode (command)     */
    
    #if 0
         /*
          *  Ethernet looks like this : This bit is variable sized however...
          */
        unsigned char       ar_sha[ETH_ALEN];   /* sender hardware address  */
        unsigned char       ar_sip[4];      /* sender IP address        */
        unsigned char       ar_tha[ETH_ALEN];   /* target hardware address  */
        unsigned char       ar_tip[4];      /* target IP address        */
    #endif
    
    };

    获取arp包头指针函数:

    static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
    {
        return (struct arphdr *)skb_network_header(skb);
    }

    wireshark抓包实例:
    ARP抓包实例

    展开全文
  • 以太网 IP TCP UDP 头部

    千次阅读 2017-11-03 15:37:39
    以太网头部结构 1、目的地址/源地址:目的主机或源主机的MAC地址 2、类型: 0800:IP数据报 0806:ARP请求 3、数据: 不足46字节的数据会被补足到46字节再发送。 4、内核数据结构 #define ETH_ALEN 6 struct ...

    以太网头部结构


    1、目的地址/源地址:目的主机或源主机的MAC地址

    2、类型:

    0800:IP数据报

    0806:ARP请求

    3、数据:

    不足46字节的数据会被补足到46字节再发送。

    4、内核数据结构

    #define ETH_ALEN 6
    struct ethhdr {
    	unsigned char	h_dest[ETH_ALEN];	/* destination eth addr	*/
    	unsigned char	h_source[ETH_ALEN];	/* source ether addr	*/
    	__be16		h_proto;		/* packet type ID field	*/
    } __attribute__((packed));
    



    IP头部结构

    1、版本:指定IP协议的版本号

    2、首部长度:IP协议首部的长度

    因为有一个可选项,所以IP首部的长度不是固定值;

    单位长度是4个字节;

    IPv4 首部的最小长度是20个字节(首部长度值为5),最大长度是24个字节(首部长度为6)。

    总长度:IP包的总长度(首部+数据部分)

    内核数据结构

    struct iphdr {
    #if defined(__LITTLE_ENDIAN_BITFIELD)
    	__u8	ihl:4,
    		version:4;
    #elif defined (__BIG_ENDIAN_BITFIELD)
    	__u8	version:4,
      		ihl:4;
    #else
    #error	"Please fix <asm/byteorder.h>"
    #endif
    	__u8	tos;
    	__be16	tot_len;
    	__be16	id;
    	__be16	frag_off;
    	__u8	ttl;
    	__u8	protocol;
    	__sum16	check;
    	__be32	saddr;
    	__be32	daddr;
    	/*The options start here. */
    };
    


    UDP 头部结构(8个字节)

    内核数据结构

    struct udphdr {
    	__be16	source;
    	__be16	dest;
    	__be16	len;
    	__sum16	check;
    };
    typedef __u16 __bitwise __sum16;






    展开全文
  • 有些arp请求报文中为什么会有目的mac地址(不使用广播地址)最近做实验,注意到局域网内大部分的arp包的以太网头部目的mac地址并不是广播地址,并且包内的目的mac地址字段并不是全0,而是目的ip对应的mac地址(显然,此...

    有些arp请求报文中为什么会有目的mac地址(不使用广播地址)

    最近做实验,注意到局域网内大部分的arp包的以太网头部目的mac地址并不是广播地址,并且包内的目的mac地址字段并不是全0,而是目的ip对应的mac地址(显然,此目的mac地址来源于计算机内缓存的arp表)。

    如图:
    wireshark截图

    可以看出来,此arp请求包的以太网头部并没有使用广播地址,并且包内的目的mac地址字段并不是全0,而是和以太网头部的mac地址相同。
    大部分讲述arp报文格式的文献中都会详细的介绍此字段并且告诉你,在没有目的ip地址对应的mac地址时,以太网地址解析模块会发送一个请求arp报文,并且包内的目的mac地址字段是全零(显然,因为并不知道此mac地址)。以图中的arp请求报文为例,首先以太网头部中的目的地址字段不是广播地址,其次包内目的地址字段不是全0.

    查阅相关文档[RFC 826],其中

    Related issue:
    It may be desirable to have table aging and/or timeouts. The implementation of these is outside the scope of this protocol. Here is a more detailed description (thanks to MOON@SCRC@MIT-MC).

    If a host moves, any connections initiated by that host will work, assuming its own address resolution table is cleared when it moves. However, connections initiated to it by other hosts will have no particular reason to know to discard their old address. However, 48.bit Ethernet addresses are supposed to be unique and fixed for all time, so they shouldn’t change. A host could “move” if a host name (and address in some other protocol) were reassigned to a different physical piece of hardware. Also, as we know from experience, there is always the danger of incorrect routing information accidentally getting transmitted through hardware or software error; it should not be allowed to persist forever. Perhaps failure to initiate a connection should inform the Address Resolution module to delete the information on the basis that the host is not reachable, possibly because it is down or the old translation is no longer valid. Or perhaps receiving of a packet from a host should reset a timeout in the address resolution entry used for transmitting packets to that host; if no packets are received from a host for a suitable length of time, the address resolution entry is forgotten. This may cause extra overhead to scan the table for each incoming packet. Perhaps a hash or index can make this faster. The suggested algorithm for receiving address resolution packets tries to lessen the time it takes for recovery if a host does move. Recall that if the (protocol type, sender protocol address) is already in the translation table, then the sender hardware address supersedes the existing entry. Therefore, on a perfect Ethernet where a broadcast REQUEST reaches all stations on the cable, each station will be get the new hardware address.

    Another alternative is to have a daemon perform the timeouts. After a suitable time, the daemon considers removing an entry. It first sends (with a small number of retransmissions if needed) an address resolution packet with opcode REQUEST directly to the Ethernet address in the table. If a REPLY is not seen in a short amount of time, the entry is deleted. The request is sent directly so as not to bother every station on the Ethernet. Just forgetting entries will likely cause useful information to be forgotten, which must be regained.

    Since hosts don’t transmit information about anyone other than themselves, rebooting a host will cause its address mapping table to be up to date. Bad information can’t persist forever by being passed around from machine to machine; the only bad information that can exist is in a machine that doesn’t know that some other machine has changed its 48.bit Ethernet address. Perhaps manually resetting (or clearing) the address mapping table will suffice.

    This issue clearly needs more thought if it is believed to be important. It is caused by any address resolution-like protocol.

    加粗段落指出,每隔一段合适的时间,后台进程会考虑移除一条表项(每条表项都有对应的生存时间),在移除此表项前,会先直接发送一条地址解析包到表中对应的以太网地址,如果在短时间内没有回复,则删除此表项。请求包是直接发送到目的地的,所以可以不打扰到以太网中的其他站点;而直接删除此表项会造成有用的信息被删除,并且需要重新来获取此信息。
    这样答案就很明显了。如果arp表中的表项生存时间一到,直接删除此表项,则还需要重新发送广播帧来请求目的mac地址,这样做因为广播而打扰其他站点。考虑到如果以太网中的主机很多,那么每台机器中的arp表中的表项也会很多,如果每条表项生存时间一到就直接删除表项,那么局域网中的广播数量会很多,这会在一定程度上影响网络的利用率,因此在删除表项之前,直接向该表项的目的地址发送一条请求报文来确认。如果短时间内没有收到回复,则说明此mac地址的拥有者已经改变了ip地址,或者已经离开了此以太网,直接删除此表项即可。

                                        AprilCal on May 2017.    
                                        mail:747998045@qq.com
    
    展开全文
  • 以太网帧格式

    千次阅读 2017-09-10 11:15:29
    以太网帧由前导码和帧起始符组成起始部分,后面即是以太网头部,中部则是该帧负载的其他协议数据包。以太网帧以1个32位的冗余校验码j结尾,用于检测数据传输是否被损坏。802.3以太网帧结构(以mtu为1500说明) 前导码...
  • 头部包含目的地址等控制信息;后面就是委托要发送给对方的数据。首先,发送方的网络设备会负责创建包。接下来,包会被发往最近的网络转发设备。当到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来应该...
  • 以太网帧和一些标准

    2021-01-13 09:22:33
    以太网帧的目的地址也允许寻址到多个站点(广播或组播) 源地址的后面跟着一个类型字段,或者长度字段,在多数情况下,它用于确定头部后面的数据类型。 TCP/IP网络常用的值IPv4(0x0800) ,IPv6(0x86DD) , ARP
  • Ethernet frame图1以太网头部由三个字段组成:DMAC:表示目的终端MAC地址。SMAC:表示源端MAC地址。LENGTH/TYPE字段:根据值的不同有不同的含义:当LENGHT/TYPE > 1500时,代表该数据帧的类型(比如上层协议类型)...
  • 以太网首部字段含义

    千次阅读 2012-10-25 19:12:17
    typedef struct _ETHeader //以太网数据帧头部结构 { UCHAR dhost[6]; //目的MAC地址 UCHAR shost[6]; //源MAC地址 USHORT type; //下层协议类型,如IP(ETHERTYPE_IP),ARP(ETHERTYPE_ARP)等 }ETHeader,*...
  • 所谓路由就是当一台路由器(或其他三层设备)收到一个IP数据包时,路由器查看IP数据包的IP头部,将IP头部中的目的IP地址拿到路由表中进行查找,找到匹配的条目后,依照条目所指示的下一跳IP地址及出接口信息将数据包...
  • 2.5 IP与以太网的包收发操作 2.5.1 包的基本知识 TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信...头部包含目的地址等控制信息,大家可以把它理解为快递包裹的面单...
  • 头部包含目的地址等控制信息;后面就是委托要发送给对方的数据。 首先,发送方的网络设备会负责创建包。接下来,包会被发往最近的网络转发设备。当到达最近的转发设备之后,转发设备会根据头部中的信息判断接下来...
  • TCP/IP头部信息

    2013-06-06 14:42:33
    本文为网上摘录,目的是记录在此以备以后工作当中查找使用。   //Mac头部,总长度14字节 typedef struct _eth_hdr { unsigned char dstmac[6]; //目标mac地址 unsigned char srcmac[6]; //源mac地址 ...
  • 头部包含目的地址等控制信息,可以理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就是相当于包裹里的货物。首先,发送方的网络设备会负责创建包,创建包的过程就是生成含有正确控制信息的头部,...
  • 原作者:证金科技展示厅微信公众号原文链接:...头部包含目的地址等控制信息,可以理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就是相当于包裹里的货物。首先...
  • ddd

    2018-05-31 11:48:00
    最近做实验,注意到局域网内大部分的arp包的以太网头部目的mac地址并不是广播地址,并且包内的目的mac地址字段并不是全0,而是目的ip对应的mac地址(显然,此目的mac地址来源于计算机内缓存的arp表)。 如图: 可以...
  • Point to Point Protocol over Ethernet ,基于以太网的点对点协议)的工作流程包含发现( Discovery) 和会话( Session) 两个阶段,发现阶段是无状态的,目的是获得PPPoE 终端(在局端的ADSL设备上)的以太网MAC 地址,...
  • TCP/IP系列之网络层IP协议

    千次阅读 2012-07-19 14:42:03
    如果是局域网内的主机,主机发送的以太网帧的头部目的mac地址为目的主机的mac地址,不需要路由. 如果是网外的主机,则将数据发到默认的网关,由网关路由器进行路由到目的主机,主机发送的以太网帧 头部的目的mac地址为...
  • 数据封装和IP地址

    2019-05-27 18:05:36
    封装:应用程序——TCP——IP——以太网驱动 一层一层的包装(加入头部) 解封: 逆顺序一层一层的解除头部 Internet协议(IP) IP的主要目的是为数据输入/输出网络提供基本算法,为高层协议提供无连接的传送...
  • 目录 以太网报文段头部 IP报文段头部 固定部分 可变部分 TCP报文段头部 ...基于TCP/IP的四层协议的信息封装如下所示: ...后面紧跟着一个以太网报头,以MAC地址说明目的地址和源地址。帧的中部是该帧负载的包含...
  • ARP

    2012-06-26 20:02:09
    //定义一个以太网头部 typedef struct ehhdr { UCHAR eh_dst[6]; /* 以太网源地址 */ UCHAR eh_src[6]; /* 以太网目的地址s */ USHORT eh_type; /* 2字节以太网帧类型 对于ARP为0x0806 */ }EHHEADR, *PEH
  • 【LWIP】tcp_input()函数分析

    千次阅读 2017-07-06 19:41:52
    调用流程: 数据包首先调用ethernet_input()函数到达数据链路层,去掉以太网头部;... ip_input()函数中比较数据报文的目的IP地址,如果与某个网络接口的IP地址相同,则接收这个报文,依照IP头部的协议字段
  • //14字节是以太网mac帧的帧头长度,14=6目的地址+6源地址+2类型说明。 ip_len=(ih->ver_ihl & 0xf)*6;//取首部长度 ip_proto=ih->proto; uh=(udp_header*)((u_char*)ih+ip_len); printf("该数据从 -%.2x.%.2x.%...
  • 【LWIP】udp_input函数分析

    千次阅读 2017-07-05 11:51:28
    调用流程: 数据包首先调用ethernet_input()函数到达数据链路层,去掉以太网头部;... ip_input()函数中比较数据报文的目的IP地址,如果与某个网络接口的IP地址相同,则接收这个报文,依照IP头部的协议字段
  • IP报文经过路由器的转发过程及变化

    万次阅读 多人点赞 2018-04-25 09:06:17
    1.防火墙收到数据包后,解封以太网头部,提取目的MAC地址,查看目的MAC地址是不是自己本身的MAC地址。 2.如果不是自己的MAC地址则丢弃。 3.如果是自己的MAC地址,上传到上层解析,解析IP层。 4.假设是自己的MAC...
  • 分层

    2019-09-28 17:48:00
    网络层逐跳,链路层,物理介质到介质...以太网头部目的+源+类型+数据(46-1500,不够垫片,长了切片(在ip层完成)) ip地址:逻辑地址 mac地址:硬件地址 转载于:https://www.cnblogs.com/zzm-blog/p/1158...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

以太网头部目的地址