精华内容
下载资源
问答
  • 以太类型

    2021-06-06 11:13:04
    EtherType :以太网类型字段及值 EtherType 是以太帧里的一个字段,用来指明应用于帧数据字段的协议。根据 IEEE802.3,Length/EtherType 字段是两个八字节的字段,含义两者取一,这取决于其数值。在量化评估中,字段...

    EtherType :以太网类型字段及值


    EtherType 是以太帧里的一个字段,用来指明应用于帧数据字段的协议。根据 IEEE802.3,Length/EtherType 字段是两个八字节的字段,含义两者取一,这取决于其数值。在量化评估中,字段中的第一个八位字节是最重要的。而当字段值大于等于十进制值 1536 (即十六进制为 0600)时, EtherType 字段表示为 MAC 客户机协议(EtherType 解释)的种类。该字段的长度和 EtherType 详解是互斥的。
    该类字段值取自 IEEE EtherType 字段寄存器。EtherType 字段是个极限空间,因此其分配是有限的。只有开发新的数据传输协议的人员需要使用 EtherType 字段,而不管他们实际上是否真正生产任何设备。IEEE RAC EtherType 字段批准权威机构负责检查和批准 EtherType 字段。
    知名协议已经分配了 EtherType 值,下面表格中列出了 EtherType 字段中常用值及其对应的协议:

     

    以太类型值(16进制) 对应协议 备注
    0x0000 - 0x05DC   IEEE 802.3 长度  
    0x0101 – 0x01FF 实验  
    0x0600 XEROX NS IDP  
    0x0660    
    0x0661 DLOG  
    0x0800 网际协议(IP)  
    0x0801 X.75 Internet  
    0x0802 NBS Internet  
    0x0803 ECMA Internet  
    0x0804  Chaosnet  
    0x0805 X.25 Level 3  
    0x0806 地址解析协议(ARP : Address Resolution Protocol)  
    0x0808 帧中继 ARP (Frame Relay ARP) [RFC1701]  
    0x6559 原始帧中继(Raw Frame Relay) [RFC1701]  
    0x8035 动态 DARP (DRARP:Dynamic RARP)反向地址解析协议(RARP:Reverse Address Resolution Protocol)  
    0x8037 Novell Netware IPX  
    0x809B EtherTalk  
    0x80D5 IBM SNA Services over Ethernet  
    0x80F3 AppleTalk 地址解析协议(AARP:AppleTalk Address Resolution Protocol)  
    0x8100 以太网自动保护开关(EAPS:Ethernet Automatic Protection Switching)  
    0x8137 因特网包交换(IPX:Internet Packet Exchange)  
    0x814C  简单网络管理协议(SNMP:Simple Network Management Protocol)  
    0x86DD 网际协议v6(IPv6,Internet Protocol version 6)  
    0x8809 OAM

    几个重要字段的含义如下:

    l Dest addr:以太网OAM报文的目的MAC地址,为组播MAC地址0180c2000002。

    l Source addr:以太网OAM报文的源MAC地址,为发送端的桥MAC地址,该地址是一个单播MAC地址。

    l Type:以太网OAM报文的协议类型,为0x8809。

    l Subtype:以太网OAM报文的协议子类型,为0x03。

    lFlags:Flags域,包含了以太网OAM实体的状态信息。

    l Code:本字段指明了OAMPDU的报文类型。0x00表示Information OAMPDU、0x01表示Event Notification OAMPDU、0x04表示Loopback Control OAMPDU。

    以下是几种常用的OAMPDU报文的作用:

    l Information OAMPDU

    Information OAMPDU报文用于将以太网OAM实体的状态信息(包括本地信息、远端信息和自定义信息)发给远端的以太网OAM实体,保持以太网OAM连接。

    l Event Notification OAMPDU

    Event Notification OAMPDU(事件通知OAMPDU)报文一般用于链路监控,是用于对连接本端和远端以太网OAM实体的链路发生的故障进行告警。

    l Loopback Control OAMPDU

    Loopback Control OAMPDU(环路控制OAMPDU)报文主要用于远端环回控制,环回控制OAMPDU报文用来控制远端设备的OAM环回状态,该报文中带有使能或去使能环回功能的信息,根据该信息开启或关闭远端环回功能。

    0x880B 点对点协议(PPP:Point-to-Point Protocol)  
    0x880C 通用交换管理协议(GSMP:General Switch Management Protocol)  
    0x8847 多协议标签交换(单播) MPLS:Multi-Protocol Label Switching <unicast>)  
    0x8848 多协议标签交换(组播)(MPLS, Multi-Protocol Label Switching <multicast>)  
    0x8863 以太网上的 PPP(发现阶段)(PPPoE:PPP Over Ethernet <Discovery Stage>)  
    0x8864 以太网上的 PPP(PPP 会话阶段) (PPPoE,PPP Over Ethernet<PPP Session Stage>)  
    0x88BB 轻量级访问点协议(LWAPP:Light Weight Access Point Protocol)  
    0x88CC  链接层发现协议(LLDP:Link Layer Discovery Protocol)  
    0x8E88 局域网上的 EAP(EAPOL:EAP over LAN)  
    0x9000 配置测试协议(Loopback)  
    0x9100 VLAN 标签协议标识符(VLAN Tag Protocol Identifier)  
    0x9200 VLAN 标签协议标识符(VLAN Tag Protocol Identifier)  
    0xFFFF 保留  
         
         

     

    以太网帧格式
      
      目前,有四种不同格式的以太网帧在使用,它们分别是:
      
      ●Ethernet II即DIX 2.0:Xerox与DEC、Intel在1982年制定的以太网标准帧格式。Cisco名称为:ARPA。
      
      ●Ethernet 802.3 raw:Novell在1983年公布的专用以太网标准帧格式。Cisco名称为:Novell-Ether。
      
      ●Ethernet 802.3 SAP:IEEE在1985年公布的Ethernet 802.3的SAP版本以太网帧格式。Cisco名称为:SAP。
      
      ●Ethernet 802.3 SNAP:IEEE在1985年公布的Ethernet 802.3的SNAP版本以太网帧格式。Cisco名称为:SNAP。
      
      在每种格式的以太网帧的开始处都有64比特(8字节)的前导字符,如图3所示。其中,前7个字节称为前同步码(Preamble),内容是16进制数0xAA,最后1字节为帧起始标志符0xAB,它标识着以太网帧的开始。前导字符的作用是使接收节点进行同步并做好接收数据帧的准备。

    展开全文
  • 1. 前言以太头中除了6字节目的MAC地址、6字节源MAC地址外,还有两字节的以太类型值,如IPv4为0x0800,ARP为0x0806等,网卡驱动收到以太帧后通过接口函数netif_receive_skb()(netif_rx实际最后也是调用netif_...

    1. 前言

    以太头中除了6字节目的MAC地址、6字节源MAC地址外,还有两字节的以太帧类型值,如IPv4为0x0800,ARP为0x0806等,网卡驱动收到以太帧后通过接口函数netif_receive_skb()(netif_rx实际最后也是调用netif_receive_skb)交到上层,而这个接口函数就完成对以太帧类型的区分,交到不同的协议处理程序。如果想自己编写某一以太类型帧的处理程序,需要自己添加相应的
    以下Linux内核代码为2.6.17.11。
     
    2. 数据结构

    每种协议都要定义一个packet_type结构,引导进入相关的协议数据处理函数,所有节点组成一个链表(HASH链表)。
    /* include/linux/netdevice.h */
    struct packet_type {
     __be16   type; /* This is really htons(ether_type). */
     struct net_device *dev; /* NULL is wildcarded here      */
     int   (*func) (struct sk_buff *,
          struct net_device *,
          struct packet_type *,
          struct net_device *);
     void   *af_packet_priv;
     struct list_head list;
    };
    参数说明:
    type:以太帧类型,16位
    dev:所附着的网卡设备,如果为NULL则匹配全部网卡
    func:协议入口接收处理函数
    af_packet_priv:协议私有数据
    list:链表扣
    一般各协议的packet_type结构都是静态存在,初始化时只提供type和func两个参数就可以了,每个协议在初始化时都要将此结构加入到系统类型链表中。

    3. 处理函数

    3.1 添加节点
    /* net/core/dev.c */
    /**
     * dev_add_pack - add packet handler
     * @pt: packet type declaration
     *
     * Add a protocol handler to the networking stack. The passed &packet_type
     * is linked into kernel lists and may not be freed until it has been
     * removed from the kernel lists.
     *
     * This call does not sleep therefore it can not
     * guarantee all CPU's that are in middle of receiving packets
     * will see the new packet type (until the next received packet).
     */
    void dev_add_pack(struct packet_type *pt)
    {
     int hash;
     spin_lock_bh(&ptype_lock);
    // 如果类型是全部以太类型,则节点链接到ptype_all链
     if (pt->type == htons(ETH_P_ALL)) {
      netdev_nit++;
      list_add_rcu(&pt->list, &ptype_all);
     } else {
    // 根据协议类型取个HASH,共15个HASH链表
      hash = ntohs(pt->type) & 15;
    // 将节点链接到HASH链表中,list_add_rcu是加了smp_wmb()保护的list_add链表操作
      list_add_rcu(&pt->list, &ptype_base[hash]);
     }
     spin_unlock_bh(&ptype_lock);
    }

    3.2  删除节点

    /**
     * __dev_remove_pack  - remove packet handler
     * @pt: packet type declaration
     *
     * Remove a protocol handler that was previously added to the kernel
     * protocol handlers by dev_add_pack(). The passed &packet_type is removed
     * from the kernel lists and can be freed or reused once this function
     * returns.
     *
     *      The packet type might still be in use by receivers
     * and must not be freed until after all the CPU's have gone
     * through a quiescent state.
     */
    void __dev_remove_pack(struct packet_type *pt)
    {
     struct list_head *head;
     struct packet_type *pt1;
     spin_lock_bh(&ptype_lock);
    // 根据协议类型找是在ptype_all表还是某一HASH链表中
     if (pt->type == htons(ETH_P_ALL)) {
      netdev_nit--;
      head = &ptype_all;
     } else
      head = &ptype_base[ntohs(pt->type) & 15];
    // 直接用地址比对进行查找,而不是类型,因为同一个类型也可能有多个节点
     list_for_each_entry(pt1, head, list) {
      if (pt == pt1) {
       list_del_rcu(&pt->list);
       goto out;
      }
     }
     printk(KERN_WARNING "dev_remove_pack: %p not found./n", pt);
    out:
     spin_unlock_bh(&ptype_lock);
    }
    /**
     * dev_remove_pack  - remove packet handler
     * @pt: packet type declaration
     *
     * Remove a protocol handler that was previously added to the kernel
     * protocol handlers by dev_add_pack(). The passed &packet_type is removed
     * from the kernel lists and can be freed or reused once this function
     * returns.
     *
     * This call sleeps to guarantee that no CPU is looking at the packet
     * type after return.
     */
    // 只是__dev_remove_pack()的包裹函数
    void dev_remove_pack(struct packet_type *pt)
    {
     __dev_remove_pack(pt);
     
     synchronize_net();
    }

    4. 实例

    4.1 IP
    /* net/ipv4/af_inet.c */
    static struct packet_type ip_packet_type = {
     .type = __constant_htons(ETH_P_IP),
     .func = ip_rcv, // IP接收数据的入口点
    };
    static int __init inet_init(void)
    {
    ......
     dev_add_pack(&ip_packet_type);
    ......
    由于IP协议部分不能作为内核模块,所以是没有卸载函数的,没必要调用dev_remove_pack()函数。

    4.2 8021q vlan
    /* net/8021q/vlan.c */
    static struct packet_type vlan_packet_type = {
     .type = __constant_htons(ETH_P_8021Q),
     .func = vlan_skb_recv, /* VLAN receive method */
    };
    ......
    static int __init vlan_proto_init(void)
    {
    ......
     dev_add_pack(&vlan_packet_type);
    ......

    static void __exit vlan_cleanup_module(void)
    {
    ......
     dev_remove_pack(&vlan_packet_type);
    ......
    由于VLAN可为模块方式存在,所以在模块清除函数中要调用dev_remove_pack()。
     
    5. 网络接收

    网卡驱动收到数据包构造出skb后,通过接口函数netif_receive_skb()传递到上层进行协议处理分配。

    /* net/core/dev.c */
    int netif_receive_skb(struct sk_buff *skb)
    {
    ......
    // 先查处理所有以太类型的链表各节点
     list_for_each_entry_rcu(ptype, &ptype_all, list) {
      if (!ptype->dev || ptype->dev == skb->dev) {
       if (pt_prev)
        ret = deliver_skb(skb, pt_prev, orig_dev);
       pt_prev = ptype;
      }
     }
    ......
    // 再查指定协议的HASH链表
     list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
      if (ptype->type == type &&
          (!ptype->dev || ptype->dev == skb->dev)) {
       if (pt_prev)
        ret = deliver_skb(skb, pt_prev, orig_dev);
       pt_prev = ptype;
      }
     }
    ......

    // 该函数就是调用个协议的接收函数处理该skb包,进入第三层网络层处理
    static __inline__ int deliver_skb(struct sk_buff *skb,
          struct packet_type *pt_prev,
          struct net_device *orig_dev)
    {
     atomic_inc(&skb->users);
     return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
    }
     
    6. 结论

    通过链表挂接方式,Linux内核可以很容易的添加各种协议的接收处理函数。
    数据流程:
              _____________
             |             |
    网卡驱动--->netif_rx()--->netif_receive_skb()->deliver_skb()->packet_type.func
    展开全文
  • 0800和0806的协议类型

    2021-04-21 15:57:46
    0x0800是IP协议 0x0806是ARP协议

    0x0800是IP协议
    0x0806是ARP协议
    在这里插入图片描述

    展开全文
  • 以太坊账户及类型判断

    千次阅读 2018-04-22 18:22:47
    以太坊中有两类账户,它们共用同一个地址空间。 外部账户,该类账户被公钥-私钥对控制(人类)。 合约账户,该类账户被存储在账户中的代码控制。 外部账户的地址是由公钥决定的,合约账户的地址是在创建该合约时...

    以太坊中有两类账户,它们共用同一个地址空间。

    • 外部账户,该类账户被公钥-私钥对控制(人类)。
    • 合约账户,该类账户被存储在账户中的代码控制。

    外部账户的地址是由公钥决定的,合约账户的地址是在创建该合约时确定的。

    合约账户存储了代码,外部账户则没有,除了这点以外,这两类账户对于EVM来说是一样的。
    每个账户有一个key-value形式的持久化存储。其中key和value的长度都是256比特,名字叫做storage.

    另外,每个账户都有一个以太币余额(单位是“Wei”),该账户余额可以通过向它发送带有以太币的交易来改变。

    如何判断一个地址的账户类型?

    使用web3.eth.getCode()方法可以判断一个给定的地址的账户是外部账户,还是合约账户。这个函数返回指定地址的代码,由于外部账户没有代码,因此仅仅会返回0x,而合约账户将会返回0x开头的16进制代码字符串。例如:

    var code = web3.eth.getCode("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")
    if(code === '0x') console.log('外部账户')
    else console.log('合约账户')

    在线教程

    展开全文
  • 本文由币乎社区(bihu.com)内容支持计划赞助在本系列的第一篇文章中,我们已经看到了一个简单的Solidity合约的汇编代码:contract C { uint256 a; function C() { ...EVM将0x1数值存储在0x0的位置上每个存储...
  • web3.eth.getCode()方法返回指定地址上代码的16进制字符串,由于普通账户地址处没有代码,因此将仅返回16进制前缀0x。利用这个我们可以进行判断,例如: 1 2 3 var code = web3.eth.getCode("0...
  • 以太坊中以太币及代币计量单位

    万次阅读 2018-01-13 09:13:39
    无论是构建交易进行以太币的转账或是调用智能合约进行代币的发放,单位都是不可或缺的。今天就带大家详细了解一下以太坊中以太币和代币的单位,以及如何通过web3的方式进行操作。 以太币单位转换 首先我们来看...
  • 以太头中除了6字节目的MAC地址、6字节源MAC地址外,还有两字节的以太类型值,如IPv4为0x0800,ARP为0x0806等,网卡驱动收到以太帧后通过接口函数netif_receive_skb()(netif_rx实际最后也是调用netif_receive_skb)...
  • 除了简单的值类型比如数字和结构体,还有一些其他数据类型,随着数据的增加可以进行动态扩展的动态类型。动态类型的3大类:映射(Mappings):mapping(bytes32 =&gt; uint256), mapping(address =&gt; string...
  • 以太坊编程输入 我们知道类型系统是什么:一个允许您将特定类型分配给变量、表达式、函数等的系统,并执行编译和/或运行时检查以查看是否遵守该规则。这就消除了由于在代码中不正确地连接各种接口而导致的一组错误。...
  • 去中心化以太坊 DApp 电商平台实战开发 更多的内容可以访问博客: http://blog.hubwiz.com/2018/02/12/how-to-check-ethereum-address/ 转载于:...
  • 它可以用于查询编译器版本,所使用的源代码,应用二进制接口Application Binary Interface(ABI)和以太坊标准说明格式Ethereum Nature Specification Format(natspec)文档,以便更安全地与合约进行交互并验证其源...
  • 以太坊Ethereum生态系统中,应用二进制接口Application Binary Interface(ABI)是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。 数据会根据其类型按照这份手册中说明的方法进行编码。这种...
  • 2019独角兽企业重金招聘Python工程师标准>>> 以太坊中有两类账户,...以太坊DApp实战开发入门 去中心化电商DApp实战开发 转载于:https://my.oschina.net/u/3794778/blog/1799324
  • ①、2种类型的帧格式 ②、以太2帧格式 Ethernet_II帧(用户业务流)DMAC+SMAC+TYPE+DATE+FCS Ethernet_II 帧类型值大于等于1536 (0x0600),以太网数据帧的长度在64-1518字节之间 0x0800-IPv4 0x0806-ARP(地址解析...
  • 虚拟机用来执行以太坊上的交易,更改以太坊状态。交易分两种:普通交易和智能合约交易。在执行交易时需要支付油费。智能合约之间的调用有四种方式 以太坊虚拟机 以太坊虚拟机,简称 EVM,是用来执行以太坊上的交易...
  • 以太坊简介

    万次阅读 2019-05-18 08:15:08
    以太坊的概念建立区块链和密码学货币之上,不熟悉区块链和比特币的读者可以先去看看《比特币的简介》和《区块链技术的简介》。本文假定读者对比特币的运行已有一定了解。 以太坊是什么哟? 以太坊是运行在计算机...
  • 接下来我们看一下RLP,RLP是一种编码规则,以太坊中的数据都会经过它编码之后才会存储到数据库中,  上面是RLP的编码原理,接下来我们看一下以太坊中的RLP    从图上我们可以看到,在以太坊源码中,RLP包...
  • 以太坊中有两类账户,它们共用同一个地址空间。 外部账户,该类账户被公钥-私钥对控制(人类)。 合约账户,该类账户被存储在账户中的代码控制。 外部账户的地址是由公钥决定的,合约账户的地址是在创建该合约时...
  • 从这篇开始,我们将会围绕着以太坊和eos的源码对一个区块链平台系统的不同组成展开进一步的源码级分析,之所以选择P2P开始我们的征程,主要有两个原因,一是我们部门目前正在进行内部区块链平台的开发,我本人正好...
  • 以太坊系列(二)之账户管理

    千次阅读 2018-07-09 21:27:25
    以太坊有两种账户类型: 外部账户(EOA) 合约账户 所有账户的状态代表以太坊网络的状态,以太坊网络会和每一个区块一起更新,网络需要达成关于以太坊的共识。账户代表外部代理人的身份,账户运用非对称加密的...
  • TCP/IP笔记-Qt使用Win10pcap发送以太帧(理论与实践)

    千次阅读 多人点赞 2020-04-28 10:56:11
    首先来介绍下以太帧理论: ...在处理数据时必须设置该字段,表示数据交付给哪个协议处理,如0x0800,表示交付给IP协议。 数据:表示交付给上一层的数据,以太帧最小为46字节,最大为15000,不足46字节会自动填充...
  • 我们在之前的漏洞分析连载中讨论了花样繁多的代币合约漏洞,这些代币合约大部分都是对于代币进行操作,并不一定涉及以太坊中心货币 – 以太币(Ether)。然而,随着游戏合约如雨后春笋般的大量出现,越来越多的游戏...
  • 在本系列的第一篇文章中,我们已经看到了一个简单的Solidity合约的汇编代码: contract C { uint256 a; function C() { ...EVM将0x1数值存储在0x0的位置上 每个存储槽可以存储正好32字节(或...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,823
精华内容 3,129
关键字:

以太类型0x0800