精华内容
下载资源
问答
  • 我一直以为IP数据包,到物理层发送这之间不再有什么操作性了。因为在平常的交流中谈协议,谈到IP这一层基本就止住了,仿佛IP打包后就可以直接发送了是的。然而当我读了《TCP/IP详解卷一:协议》后,我才发现其中并...

    我一直以为IP数据包,到物理层发送这之间不再有什么操作性了。因为在平常的交流中谈协议,谈到IP这一层基本就止住了,仿佛IP打包后就可以直接发送了是的。然而当我读了《TCP/IP详解卷一:协议》后,我才发现其中并没有那么简单。也许是因为接近真实世界的原因,不同的网络连接方式最终封装的IP都不太一样。

    以太网和IEEE 802

    以太网和IEEE 802是最常见的两种协议,它们的数据报如下:

    IEEE802和以太网数据报

    目的地址和原地址指的就是物理地址(MAC地址),它们是通过ARP协议获取的(下文会介绍)。

    我们将目光放到封装的数据部分,可以看到封装的三种报文(IP、ARP、RARP)类型是一致的,但是后面的数据长度范围并不一致。IEEE802的最小值是36字节(PAD 代表填充字节的意思),而以太网的是46。

    在观察除了数据以外的部分,会发现他们源地址、目的地址都在开头并占据相同长度,尾部都是4字节的CRC(检验码),不一样的是IEEE802比以太网多占用了8个字节(长度+几个不明就里的固定字段)。

    在我看来以太网应该是IEEE 802的升级版(因为减少了一些不需要的固定字节的占用),然而以太网出现的时间比IEEE 802提前,也就是说IEEE 802才是升级版。更神奇的是RFC标准规定,以太网必须支持而IEEE选择支持。然而我查找了半天资料没有发现两个同时存在的原因,因此我能想到的IEEE 802存在的原因是历史商业竞争的产物了。

    ARP:地址解析协议

    ARP(Address Resolution Protocol)为协议地址(通常是IP,也就是说可以用在非IP协议上)到硬件地址之间提供一种映射。主要不是用于消息通信,而是为了消息通信而查出硬件地址。

    用于以太网的ARP请求或应答报文如下:

    ARP数据报

    • 帧类型:表示后面的数据类型,应答或请求(0X0806)
    • 硬件类型:表示硬件地址的类型,值为 1即表示以太网地址
    • 协议类型:表示要映射的协议地址类型。它的值为 0x0800 即表示IP地址
    • 硬件地址长度/协议地址长度:单位byte
    • op:代表操作,发送为响应报文时为2

    硬件类型和协议类型决定最后4个字段(源硬件地址、源协议地址、目的硬件地址、目的协议地址)的长度和内容

    解析过程:

    1. ARP发送请求到广播地址(物理地址每个bit都为1,FF:FF:FF:FF:FF:FF)
    2. 与ARP请求的目标IP地址对应的主机,填充上地址段
    3. 根据请求端的地址直接将响应报文发送回请求主机

    主机在接收到请求或响应ARP报文时,会将地址缓存下来。完整的表项(能够正常响应的)一般为20分钟,不完整的表项(未被正常响应的)一般为3分钟。可以通过指令arp进行查看。

    SLIP:串行线路IP

    SLIP(Serial Line IP)是一种对IP数据报进行封装的简单形式,适用于RS-232串行端口和高速调制解调器接入Internet。RS-232常见于液晶显示屏与电脑的链接。

    RS-232数据线:

    RS-232数据线

    SLIP数据报:

    SLIP数据报

    从数据报可以看出SLIP协议是一种很简单的协议,除了头尾字段用于区分数据报,然后将数据报中会影响判断的(标志字节:0xc0,转义字节:0xdb)进行转义就完成了封装可以进行发送了。

    优点:

    简单、字节少。

    我想这也是它会被用在显示器上(RS-232)和接入Internet等对时延要求高、传输量大的场合。

    缺点:

    1. 根据IP知道对端机器(原话是“每端必须知道对方IP”)。该协议没有使用ARP进行广播,确定发送机器,所以必须的通过IP层的目的IP地址知道对应的机器。
    2. 数据帧没有类型字段,只能发送一种类型的报文。(原话是“如果一条串行线路用于SLIP,那么它不能同时使用其他协议。”)
    3. 没有校验和,受噪声影响,传输出错只能在上层校验。

    我想也就是因为这些不稳定性,所以主要是在有线传输中见到它的身影。

    CSLIP

    CSLIP(Compressed SLIP)是SLIP的更进一步,它将SLIP传输的TCP数据包头进行压缩,减少传输量。但并不影响UDP包头。

    PPP:点对点协议

    PPP(Point to Point Protocol)协议修改了SLIP协议中的所有缺点。PPP就是被设计来用于取代SLIP的。其数据报如下:

    PPP数据报

    可以看到CRC加入了协议字段和CRC字段(校验和)字段,因此可以解决只能够传输一种类型报文,以及没有校验和易受噪声干扰的问题。至于PPP的IP协商机制,有兴趣的可以自己查查资料。

    PPP与SLIP一样有头尾标志字节,这就说明PPP也需要将数据报中的标志字节和转义字节进行转移。与SLIP不一样的是,标志位(0x7e)、转义字节(0x7d)。

    除了这两个字节外PPP还需要对小于0x20的字节进行转移,因为0x20的字节在ascii码中有控制含义,怕影响底层驱动程序。

    因此PPP具有转移规则,规则是在0x7d接下去的第1个byte的第6个bit取补码(即将byte取补码后,将这个byte的第6位,用补码的第6位取代)。

    公众号二分之一程序员,专注计算机基础的学习,欢迎关注 :)
    

    公众号

    展开全文
  • 为什么标准以太网帧长度下限为64字节最早的以太网工作方式:载波多路复用/冲突检测(CSMA/CD),因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,...

    这个问题不是非常严谨,==应该说标准以太网接口的MTU为1500==,但现在的以太网接口普遍可以使得MTU远远大于1500。

    为什么标准以太网帧长度下限为64字节

    最早的以太网工作方式:载波多路复用/冲突检测(CSMA/CD),因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。

    假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs。

    在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,==从而让最极端的碰撞都能够被检测到==。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,所以以太网帧的最小长度为64字节。

    为什么标准以太网帧长度上限为1518字节

    IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。

    由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。

    但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 - Ethernet Header - IP Header - TCP Header = 218 - 18 - 20 - 20 = 160 byte

    那有效传输效率= 160 / 218 = 73%

    而如果以太网长度为1518,那有效传输效率= 1460 / 1518 = 96%

    ==通过比较,选择较大的帧长度,有效传输效率更高==,而更大的帧长度同时也会造成上述的问题,于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。

    Jumbo Frame

    最早的以太网是通过Hub或集线器来工作的,在任意时刻只能有一台主机发送,这种共享方式发送效率很低,而现代高速交换机则让每个连接交换机的主机工作在独占模式,带宽独享,可以同时收发,而且现在早已不是早期的10Mbps的带宽,而是1000M、10000M,即使发送大包也不会影响别的主机,影响的只是交换机的接收和发送队列,既然发送大包效率要比小包效率搞,而且特定的应用也有发大包的需求,比如NFS文件系统,那为什么不把接口MTU提高一些,再高一些呢?

    这是一个好主意,于是网卡、交换机、路由器网络接口可以实现更大的MTU,可以达到> 9000字节的大小,==我们称这种远大于标准以太帧尺寸的帧为巨型帧Jumbo Frame 。==

    于是网络接口提供可以修改MTU的配置命令,比如缺省为1500,可以修改为1508以支持QinQ,或者1512以支持802.1q Mpls label,这样既可以支持终端用户标准1500 字节IP packet,又可以避免分片。

    有一点需要说明,二层交换机的接口,我们可以看成一块普通的网卡,网卡工作在数据链路层,所以分片不是它的职责,如果一个帧需要从交换机一个接口发送出去,而帧的长度>接口MTU,怎么办?丢弃!会发什么消息告诉源主机吧?不会的,默默地丢,当作什么都没有发生,这种情况最难以排查,如果traceroute可以看到端对端使通的,而发送数据就是会失败。

    ==所以切记,一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,就不会发生上述情况。而如果入接口是9000字节,而出接口是1500,就会发生上述问题。==

    如果一条物理链路的两端MTU不一致,则会发生什么情况,比如一侧是1500,一侧是9000,1500一侧发出来的数据肯定没有问题,但是如果从9000侧发给1500呢?

    数据也背默默地丢了。为什么呢?我们来谈另外一个很少提及的词汇:MRU,最大接收单元。

    我们一直谈的最大传输单元MTU是关于出方向的流量处理,而MRU恰恰相反,是关于入方向的流量处理。

    一般情况下MTU = MRU,但比如9000侧的数据到达1500,由于9000 > MRU,所以直接默默丢弃。

    所以在配置链路时,要确保两侧的设备MTU要匹配,无论各家厂商对MTU理解如何、实现如何,一定要保证两端匹配,==即各自允许在以太网线上发送、接收的数据流,以太网帧的最大长度一样!==

    参考:http://www.zhihu.com/question/21524257/answer/118266374

    展开全文
  • LwIP的ARP协议实现系列文章LwIP中的ARP实现(1)之 ARP缓存表的数据结构LwIP中的ARP实现(2...ARP数据包发送 ARP数据包处理以太网是有自己独立的寻址方式(MAC地址),而对于TCP/IP的上层协议(如TCP协议、IP协议)...

    6787dca4673e961db1c9e2d63ddca580.png

    LwIP的ARP协议实现系列文章

    LwIP中的ARP实现(1)之 ARP缓存表的数据结构
    LwIP中的ARP实现(2)之 ARP缓存表的超时处理
    LwIP中的ARP实现(3)之 发送ARP请求包
    LwIP中的ARP实现(4)之 ARP数据包接收
    LwIP中的ARP实现(5)之 ARP数据包发送

    ARP数据包处理

    以太网是有自己独立的寻址方式(MAC地址),而对于TCP/IP的上层协议(如TCP协议、IP协议),它们是以IP地址作为网络的标识,如果没有IP地址则无法进行收发数据。当数据通过网卡中接收回来的时候,LwIP内核就需要将数据进行分解,如果是IP数据报则递交给IP协议去处理,如果是ARP数据包则交由ARP协议去处理。
    真正让LwIP内核去处理接收到的数据包是ethernet_input()函数。代码太多了,简单截取部分代码。

    err_t
    ethernet_input(struct pbuf *p, struct netif *netif)
    {
      struct eth_hdr *ethhdr;
      u16_t type;
    
      LWIP_ASSERT_CORE_LOCKED();
    
      //校验数据长度
      if (p->len <= SIZEOF_ETH_HDR) {
        ETHARP_STATS_INC(etharp.proterr);
        ETHARP_STATS_INC(etharp.drop);
        MIB2_STATS_NETIF_INC(netif, ifinerrors);
        goto free_and_return;
      }
    
      if (p->if_idx == NETIF_NO_INDEX) {
        p->if_idx = netif_get_index(netif);
      }
    
      /* ethhdr指针指向以太网帧头部,并且强制转换成eth_hdr结构 */
      ethhdr = (struct eth_hdr *)p->payload;
    
      //获取类型
      type = ethhdr->type;
    
      if (ethhdr->dest.addr[0] & 1) 
      {
        /*  这可能是多播或广播数据包,如果目标IP地址的第一个字节的bit0是1,
            那么有可能是多播或者是广播数据包,所以,还需要进行判断,
            如果是多播的,就将pbuf标记为链路层多播。 */
        if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {
          if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
              (ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) 
          {
           /* 将pbuf标记为链路层多播 */
            p->flags |= PBUF_FLAG_LLMCAST;
          }
        }
        else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) 
        {
          /* 将pbuf标记为链路层广播 */
          p->flags |= PBUF_FLAG_LLBCAST;
        }
      }
    
      switch (type) {
         /* 如果是IP数据报 */
        case PP_HTONS(ETHTYPE_IP):
          if (!(netif->flags & NETIF_FLAG_ETHARP)) {
            goto free_and_return;
          }
          /* 去掉太网首部 */
          if (pbuf_remove_header(p, next_hdr_offset)) 
          {
            goto free_and_return;
          } 
          else
          {
            /* 递交到IP层处理 */
            ip4_input(p, netif);
          }
          break;
    
        //对于是ARP包
        case PP_HTONS(ETHTYPE_ARP):
          if (!(netif->flags & NETIF_FLAG_ETHARP)) 
          {
            goto free_and_return;
          }
          /* 去掉太网首部 */
          if (pbuf_remove_header(p, next_hdr_offset)) 
          {
            ETHARP_STATS_INC(etharp.lenerr);
            ETHARP_STATS_INC(etharp.drop);
            goto free_and_return;
          } 
          else 
          {
            /* 传递到ARP协议处理 */
            etharp_input(p, netif);
          }
          break;
    
        default:
          ETHARP_STATS_INC(etharp.proterr);
          ETHARP_STATS_INC(etharp.drop);
          MIB2_STATS_NETIF_INC(netif, ifinunknownprotos);
          goto free_and_return;
      }
    
      return ERR_OK;
    
    free_and_return:
      pbuf_free(p);
      return ERR_OK;
    }
    

    ARP数据包的处理

    重点来了,我们主要是讲解对收到的ARP数据包处理
    ARP数据包的处理函数为etharp_input(),在这里它完成两个任务:

    1. 如果收到的是ARP应答包,说明本机之前发出的ARP请求包有了回应,就根据应答包更新自身的ARP缓存表;
    2. 如果收到的是ARP请求包,如果包中的目标IP地址与主机IP地址匹配,除了记录原主机的IP与MAC地址,更新自身的ARP表外,还要向源主机发送一个ARP应答包。但是如果如果包中目标IP地址与主机IP地址不匹配,则尽可能记录源主机的IP与MAC地址,更新自身的ARP表,并丢弃该请求包,为什么说是尽可能呢,因为主机的ARP缓存表是有限的,不可能记录太多的ARP表项,所以在有空闲的表项时才记录,如果没有空闲的表项,ARP觉得它自己已经尽力了,也记不住那么多表项。
    void
    etharp_input(struct pbuf *p, struct netif *netif)
    {
      struct etharp_hdr *hdr;
      /* these are aligned properly, whereas the ARP header fields might not be */
      ip4_addr_t sipaddr, dipaddr;
      u8_t for_us;
    
      LWIP_ASSERT_CORE_LOCKED();
    
      LWIP_ERROR("netif != NULL", (netif != NULL), return;);
    
      hdr = (struct etharp_hdr *)p->payload;
    
      /* 判断ARP包的合法性,判断ARP包的合法性,已经类型是否为以太网、硬件地址长度是否为ETH_HWADDR_LEN、
         协议地址长度是否为sizeof(ip4_addr_t)以及协议是否为ARP协议,如果都满足则表示ARP包合法。 */
      if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) ||
          (hdr->hwlen != ETH_HWADDR_LEN) ||
          (hdr->protolen != sizeof(ip4_addr_t)) ||
          (hdr->proto != PP_HTONS(ETHTYPE_IP)))  {
        ETHARP_STATS_INC(etharp.proterr);
        ETHARP_STATS_INC(etharp.drop);
        pbuf_free(p);
        return;
      }
      ETHARP_STATS_INC(etharp.recv);
    
    
      //拷贝源IP地址与目标IP地址
      IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr);
      IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr);
    
      /* 看看主机网卡是否配置了IP地址 */
      if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
        for_us = 0;
      } 
      else 
      {
         /* 判断ARP数据包的目标IP地址与主机IP地址是否一样 */
        for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));
      }
    
      /* 更新ARP缓存表项 */
      etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),
                              for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);
    
     /* 更新完毕,根据包的类型处理 */
      switch (hdr->opcode) 
      {
        /* ARP请求包 */
        case PP_HTONS(ARP_REQUEST):
          if (for_us) {
             /* 是请求自己的,那就要做出应答 */
            etharp_raw(netif,
                       (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,
                       (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),
                       &hdr->shwaddr, &sipaddr,
                       ARP_REPLY);
    
          } 
           /* 不是给自己的,如果不是给自己的,原因有两种,一种是网卡自身尚未配置IP地址,这样子就只打印相关调试信息。
              另一种是ARP包中的目标IP地址与主机IP地址不符合,也不用做出回应,直接丢弃即可,并输出相关调试信息*/
          else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) 
          {
            LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: we are unconfigured, ARP request ignored.n"));
          }
          else
          {
            LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP request was not for us.n"));
          }
          break;
    
        /* 对于ARP应答包 不用处理,前面已经更新ARP表项了*/
        case PP_HTONS(ARP_REPLY):
          break;
        default:
          ETHARP_STATS_INC(etharp.err);
          break;
      }
      pbuf_free(p);
    }
    

    更新ARP表项

    etharp_update_arp_entry()函数是用于更新ARP缓存表的,它会在收到一个ARP数据包的时候被调用,它会先查找一个ARP表项,如果没有找到这个ARP表项的记录,就会去新建一个ARP表项,然后重置ARP表项的参数(状态、网卡。IP地址与对应的MAC地址以及生存时间等),然后检测ARP表项中是否挂载数据包,如果有就将这些数据包发送出去。
    表项的更新方式,动态表项有两种方式,分别为ETHARP_FLAG_TRY_HARD和ETHARP_FLAG_FIND_ONLY。前者表示无论如何都要创建一个表项,如果ARP缓存表中没有空间了,那就需要回收较老的表项,将他们删除,然后建立新的表项。而如果是后者,就让内核尽量更新表项,如果ARP缓存表中没有空间了,那么也无能为力,实在是添加不了新的表项。

    static err_t
    etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags)
    {
      s16_t i;
      if (ip4_addr_isany(ipaddr) ||
          ip4_addr_isbroadcast(ipaddr, netif) ||
          ip4_addr_ismulticast(ipaddr)) {
        return ERR_ARG;
      }
    
     /* 查找或者创建ARP表项,并且返回索引值 */
      i = etharp_find_entry(ipaddr, flags, netif);
    
      /* 如果索引值不合法,更新ARP表项失败 */
      if (i < 0) {
        return (err_t)i;
      }
    
      /* 设置表项状态为ETHARP_STATE_STABLE */
      arp_table[i].state = ETHARP_STATE_STABLE;
    
      /* 记录网卡 */
      arp_table[i].netif = netif;
    
      /* 插入ARP索引树 */
      mib2_add_arp_entry(netif, &arp_table[i].ipaddr);
    
      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"n", i));
    
      /* 更新缓存表中的MAC地址 */
      SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN);
    
      /* 重置生存时间 */
      arp_table[i].ctime = 0;
    
      /* 如果表项上与未发送的数据包,那就将这些数据包发送出去 */
    #if ARP_QUEUEING        //使用队列方式
      while (arp_table[i].q != NULL) 
      {
        struct pbuf *p;
        /* 定义q指向ARP表项中的数据包缓存队列 */
        struct etharp_q_entry *q = arp_table[i].q;
    
        /* 指向下一个数据包节点 */
        arp_table[i].q = q->next;
    
        /* 获取pbuf数据包 */
        p = q->p;
    
        /* 释放MEMP_ARP_QUEUE类型的内存块 */
        memp_free(MEMP_ARP_QUEUE, q);
    #else 
      if (arp_table[i].q != NULL) {
        struct pbuf *p = arp_table[i].q;
        arp_table[i].q = NULL;
    #endif 
         /* 发送缓存队列的数据包 */
        ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP);
        /* free the queued IP packet */
        pbuf_free(p);
      }
      return ERR_OK;
    }
    

    837f808dd661d76b27fe578700e6c0ed.png

    欢迎关注杰杰个人公众号,更多干货等着你!

    0bcdc5dabe874bf9d4cae0252dec3e50.png
    展开全文
  • 1、Ethernet/IP基础工业以太网协议 (Ethernet/IP) 是由ODVA所开发并得到了罗克韦尔自动化的强大支持。...CIP数据包必须在通过以太网发送前经过封装,并根据请求服务类型而赋予一个报文头。这个报文...

    7f8c76529064297e52556775b9f249c0.png

    1、Ethernet/IP基础

    工业以太网协议 (Ethernet/IP) 是由ODVA所开发并得到了罗克韦尔自动化的强大支持。它使用已用于ControlNet和DeviceNet的控制和信息协议 (CIP) 为应用层协议。

    9b84f2386eb0daadc67b82e9a3785f52.png

    CIP提供了一系列标准的服务,提供“隐式”和“显示”方式对网络设备中的数据进行访问和控制。CIP数据包必须在通过以太网发送前经过封装,并根据请求服务类型而赋予一个报文头。这个报文头指示了发送数据到响应服务的重要性。通过以太网传输的CIP数据包具有特殊的以太网报文头,一个IP头、一个TCP头和封装头。封装头包括了控制命令、格式和状态信息、同步信息等。这允许CIP数据包通过TCP或UDP传输并能够由接收方解包。相对于DeviceNet或ControlNet,这种封装的缺点是协议的效率比较低。以太网的报文头可能比数据本身还要长,从而造成网络负担过重。因此,EtherNet/IP更适用于发送大块的数据 ( 如程序 ) ,而不是DeviceNet和ControlNet更擅长的模拟或数字的I/O数据。

    EtherNet/IP指的是"以太网工业协议"(Ethernet Industrial Protocol)。它定义了一个开放的工业标准,将传统的以太网与工业协议相结合。该标准是由国际控制网络(CI, ControlNet International)和开放设备网络供应商协会 (ODVA)在工业以太网协会 (IEA, Industrial Ethernet Association)的协助下联合开发的,并于2000年3月推出。EtherNet/IP是基于TCP/IP系列协议,因此采用以原有的形式OSI层模型中较低的4层。所有标准的以太网通信模块,如PC接口卡、电缆、连接器、集线器和开关都能与 EtherNet/IP 一起使用。

    2、EtherNet/IP报文格式

    • 注册请求帧:EtherNet/IP与Fins类似,在正式通信前需要进行注册请求,获取到会话句柄。

    注册请求帧报文格式如下:

    57c524131656ccc8e7053fee9d6920e1.png

    因此,一个完整的注册请求帧发送实例:

    65 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

    • 注册应答帧:顾名思义,注册应答帧就是注册请求帧的应答报文,包含了我们需要的会话句柄。

    注册应答帧报文格式如下:

    c908e8940a10bf44acda64edfaf14cd7.png

    注册请求帧接收实例:

    65 00 04 00 71 01 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

    根据应答报文,提取会话句柄为: 0x71 0x01 0x0E 0x00

    其中状态相当于错误代码,如下所示:

    7a4a07a13c5a5cb979ab8ceb8736369e.png
    • 读取信息报文帧 EtherNet/IP

    PLC标签:TAG1

    读取报文:

    封装头:6F 00 28 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 18 00 52 02 20 06 24 01 0A F0 0A 00 4C 03 91 04 54 41 47 31 01 00 01 00 01 00

    报文解析:

    6F 00 命令码

    28 00 后面数据报文长度

    70 01 27 00 会话句柄

    00 00 00 00 状态,默认值0

    00 00 00 00 00 00 00 00 发送方描述

    00 00 00 00 选项默认

    00 00 00 00 接口句柄 00 00 00 00 代表CIP

    01 00 超时

    02 00 项数

    00 00 空地址项

    00 00 空地址项长度

    B2 00 未连接项 默认

    18 00 CIP报文包的长度

    52 命令

    02 请求路径长度

    20 06 24 01 默认请求路径

    0A F0 0A 00 默认超时

    4C 服务标识

    03 CIP长度多少字

    91 固定

    04 PLC标签长度 多少个字节

    01 00 读取长度

    01 00 01 00 槽号

    • 返回信息报文帧 EtherNet/IP

    返回报文:

    封装头:6F 00 18 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 08 00 CC 00 00 00 C1 00 00 00

    报文解析:

    6F 00 命令

    18 00 长度 (总长度 -封装头长度 )

    71 01 14 00 会话句柄(会话ID)

    00 00 00 00 会话状态

    00 00 00 00 00 00 00 00 发送方描述 固定

    00 00 00 00 选项 默认

    00 00 00 00 接口句柄 ,00000000 指CIP

    01 00 超时

    02 00 项数 默认2

    00 00 连接的地址项

    00 00 连接地址项长度

    B2 00 未连接数据项

    08 00 连接长度

    CC 服务标识

    00 填充字节

    00 00 状态

    C1 00 数据类型 BOOL (0x00C3(195) 为整型,0x00CA(202)为实型, 0x00C1(193)为布尔型,long 型为0x00C4,BYTE为0x00C2 )

    00 00 数据值

    • 写入信息报文帧 EtherNet/IP

    PLC标签:TAG1

    写入报文:

    封装头:6F 00 2C 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1C 00 52 02 20 06 24 01 0A F0 0E 00 4D 03 91 04 54 41 47 31 C1 00 01 00 00 00 01 00 01 00

    解析报文:

    6F 00 命令码

    2C 00 长度(去除header后报文长度 字节为单位)

    71 01 14 00 会话句柄

    00 00 00 00 会话状态

    00 00 00 00 00 00 00 00 发送方描述 固定

    00 00 00 00 选项 默认

    00 00 00 00 接口句柄 ( 00 00 00 00 指CIP)

    01 00 超时

    02 00 项数 默认2

    00 00 空地址项 默认

    00 00 空地址项长度 默认

    B2 00 未连接数据项 默认

    1C 00 数据长度 指后面数据长度 (字节)

    52 请求服务代码

    02 请求路径长度

    20 06 24 01 请求路径 默认

    0A F0 超时默认 245760ms

    OE 00 长度(从服务标识开始 到 写入的值 结束 )

    4D 服务标识

    03 长度(91 04 54 41 47 31 )

    91 固定

    04 标签长度

    54 41 47 31 TAG1(标签名)

    C1 00 数据类型 bool0x00C3(195) 为整型,0x00CA(202)为实型,0x00C1(193)为布尔型,long 型为0x00C4,BYTE为0x00C2

    01 00 写入数量

    00 00 写入的值 false:0 TRUE:任意非0数

    01 00 01 00 PLC槽号

    返回报文:

    封装头:6F 00 14 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    命令数据:00 00 00 00 01 00 02 00 00 00 00 00 B2 00 04 00 cd 00 00 00

    解析报文:

    71 01 14 00 会话句柄

    B2 00 未连接数据项 默认

    CD 服务标识(写)固定

    00 填充字节

    0000 状态:成功

    • 多标签读取

    参考单标签的报文帧,读取TAG1 和TAG2

    54 41 47 31 TAG1

    54 41 47 32 TAG2

    发送报文:

    6F 00 3E 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 2E 00 52 02 20 06 24 01 0A F0 20 00 0A 02 20 02 24 01 02 00 06 00 10 00 4C 03 91 04 54 41 47 31 01 00 4C 03 91 04 54 41 47 32 01 00 01 00 01 00

    返回报文:

    6F 00 2A 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1A 00 8A 00 00 00 02 00 06 00 0E 00 CC 00 00 00 C1 00 01 00 CC 00 00 00 C1 00 01 00

    • 注销会话:注销会话顾名思义就是通信结束时发送,注销会话是没有返回值的。

    注销会话报文:

    66 00 00 00 71 01 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    报文解析:

    66 00 :命令

    00 00 :长度

    71 01 04 00:要注销的会话句柄

    00 00 00 00 状态 默认0

    00 00 00 00 00 00 00 00:发送内容 默认0

    00 00 00 00: 选项 默认0

    3、EtherNet/IP通信应用

    欧姆龙NX系列PLC不支持Fins通信,也不支持OPCUA,综合考虑,只能通过Ethernet/IP与其进行通信。这里使用CMSPro进行通信应用,CMSPro集成了EtherNet/IP通信库,并支持项目应用。

    • 新增设备:打开CMSPro软件,PLC设备>新增PLC设备>欧姆龙CIP,新增一个PLC设备,如下所示:

    6c67a1d2934166349b616a1f4ab55e0f.png
    • 新增通信组:在PLC设备上右击新增通信组,添加一个通信组,这里的通信组没有实际具体的意义,只是为了便于管理通信变量。
    • 添加变量前,首先注意一下上位机变量类型与PLC变量类型的对应关系,如下所示:
    ble data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
    • 标签变量添加:标签变量是指无结构体和数组参与的变量,在通信组中,右击新增变量,添加一个通信变量,对于标签变量,直接按照实际PLC中的变量名称输入即可,我们添加一个PLC中名为grHWCs_PV变量:

    88d2658b2c5151381ac86b72c86ae20c.png

    19957aa410efa3b3cd3ab66c3ced9b75.png
    • 结构体变量添加:对于结构体中的变量添加,可以按照标签变量的方式,变量地址填写结构体名称.变量名,也可以通过先添加一个结构体变量,然后在这个结构体变量下,添加一个变量,一般建议用后者,这样比较直观,后续也便于管理。

    c3c0929a732c01ca35c139669a6f49d3.png

    fcf577d7016ad307c9a3210f8feb0e14.png

    fcf577d7016ad307c9a3210f8feb0e14.png
    • 数组变量添加:对于数组变量添加,可以按照标签变量的方式,变量地址填写数组名[索引],也可以通过先添加一个数组变量,然后在这个数组变量下,添加一个变量,一般建议用后者,这样比较直观,后续也便于管理。

    627e64e97c34be2777a60ab3959c531e.png

    90b859b160ebc2e488547d6c35f5d91a.png

    d1b8ac514c0f7acf28323377928792bf.png
    • 按照这种方式添加好变量后,保存并运行,然后测试结果是否正确。

    c8aa4a60932601bdb90fab6b097d7383.png

    c2693b0a356e5cf7cc6ec952df9da637.png
    • 测试完成读取后,通过修改查看,是否可以修改变量。

    4348524fcb38b21305768743755b7037.png
    展开全文
  • 以太网的其他名称就是内网和局域网。...也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点,如图所示,简单明了。 **交换机(Switch)????*
  • 以太网基础-MAC和PHY

    2020-09-21 21:42:40
    我们可以把帧看做是一种数据包,在数据包中不仅包含有数据信息,而且还包含有数据的发送地、接收地信息和数据的校验信息。 一个网卡主要包括OSI的最下面的两层,物理层和数据链路层 物理层定义了数据传送与接收所...
  • 工业以太网协议 (Ethernet/IP)

    千次阅读 2009-04-23 12:46:00
    工业以太网协议 (Ethernet/IP) 是由 ODVA 所开发并得到了罗克韦尔自动化的强大支持。...CIP 提供了一系列标准的服务,提供 “ 隐式 ” 和... CIP 数据包必须在通过以太网发送前经过封装,并根据请求服务类型而赋予一个报文
  • 一、网卡的主要特点 ...我们可以把帧看做是一种数据包,在数据包中不仅包含有数据信息,而且还包含有数据的发送地、接收地信息和数据的校验信息。 一块网卡包括OSI模型的两个层——物理层和数据链
  • 数据包在路由器中的通信过程 我们通过观察 PC1PC1PC1 和 PC2PC2PC2 的 IP 地址可以发现,这两台主机处于不同的以太网下。那么,它们之间是如何通信的呢...也就是 PC1 首先发送一种类型为 ARP 的以太网帧。(或者说一个
  • TsOverIP的发送

    千次阅读 2018-08-20 16:48:36
    考虑到以太网中数据帧的最大长度为1500字节,所以TSOverIP规定,每7个TS数据包封装在一起组成一个IP包进行发送。 网上的资料不多,我写一个发送psi的程序,却发现问题多多,逐个解决之后,总结一下: 1.一般情况下...
  • TCP/IP 协议

    2019-10-08 14:59:18
    http发送一个请求,应用层、传输层、网络层、链路层会一次对请求进行包装并携带对应的首部,最后会在链路层生成以太网数据包,数据包会通过物理物质传输到对方主机,接收到数据包之后,会采用对应的协议进行拆包,...
  • 其它方案使用专用交换机,并采用精确的时间控制方式分配以太网数据包。尽管这些解决方案能够比较快和比较准确地将数据包传送到所连接的以太网节点,但带宽的利用率却很低,特别是对于典型的自动化设备,因为即使对于...
  • NCNA认证课堂笔记(2)

    2019-04-21 12:25:43
    以太网数据包mtu = 1500B 整个帧的最大长度是 1500+18 =1518 一般封装设备与设备之间进行交互: 区分开帧结构的方法:查看type 类型 48个字节(bit):前24位,供应商代码。后24位,厂家自己分配 单播...
  • ARP协议

    2019-06-06 13:18:00
    1. arp协议由来:计算机通信基本靠吼,即广播的方式,所有上层的包到最后都要封装上以太网,然后通过以太网协议发送,在谈及以太网协议时候,我们了解到 通信是基于mac到广播方式实现,计算机在发包时,计算机在...
  • 以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。...,它用的是广播的方式,举个例子,a发送消息给b,它会向本网络内的所有计算机发送数据,再由接收的计算机
  • 互联网协议理解

    2018-11-30 10:34:46
    物理层: 不同电脑进行组网,可以用光缆、电缆、双绞线、无线电波等方式。这层主要把物理设备连接起来,传输0,1 信号 数据链路层: ...广播的方式发送给子网所有电脑数据包,电脑自己判断是否接...
  • 计算机网络1

    2020-01-04 21:14:40
    2.以太网数据包以广播方式发送。 3.浏览器与 Web 服务器之间使用的协议是HTTP。 4..一个 Web 站点,主机是 www.abc.com,端口是 8080,主页index.html,则客户端访问该站点时,在浏览器的地址栏中的有效输入是 ...
  • 数据链路层

    2020-11-24 22:18:59
    以太网的连接方式:总线式、交换式(集线器) 以通信介质分:共享介质型(半双工)、非共享介质型(全双工) MAC地址:硬件地址,48比特,前半段识别厂商,后半段厂商内识别码 环回口: 以太网就是把32位的IP地址...
  • 当同一网段中的任何一台主机发送一个数据包后,都会通过集线器以广播的方式发送到网络当中,处在同一网络中的所有其它主机都会看到这些数据包,然后通过查找数据包中的目的MAC地址来确认这个包是否是发给自己的。...
  • 1、引言 工业以太网协议 (Ethernet/IP) ...CIP数据包必须在通过以太网发送前经过封装,并根据请求服务类型而赋予一个报文头。这个报文头指示了发送数据到响应服务的重要性。通过以太网传输的CIP数据包具有特殊的以太.
  • 14.2.1 不同发送方式的比较 413 14.2.2 发送不同数据包长度的比较 420 14.2.3 不同接收方式的比较 423 14.3 小结 430 附录A 源语法规范 431 附录B 过滤表达式规范 433 附录C SYN洪泛攻击的详细资料 438 附录D ...
  • 计算机网络 - 网络层

    2020-12-22 11:13:42
    有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界...
  • STM32接收上位机以太网发来的数据包,然后要求返回包含测量数据的数据包,下位机接收到的数据包出现沾包的情况?(其是循环放在w5500 的接收缓冲区内部的) 出现沾包的问题,主要则是由两个的原因造成的,发送端,和...
  • 单片机enc28j60的ARP实验

    千次阅读 2016-12-29 22:46:50
    一、ARP的功能 ...ARP请求包--通过以太网广播的方式发送的,用于向具有某个IP地址的主机发送请求,希望该主机返回其MAC地址。 ARP应答包--收到ARP请求的主机会比对该数据包的IP地址与自己的IP地址是否符合,
  • UDP协议

    2020-07-26 16:07:44
    面向报文的传输方式决定了UDP的数据发送方式是一份一份的,也就是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。那么UDP的报文大小由哪些影响因素呢?UDP数据包的理论长度是多少,合适的UDP数据包...
  • 计算机网络复习题第三章(标有课本知识点)

    万次阅读 多人点赞 2019-06-21 09:47:48
    选择题 1.MAC 地址通常存储在计算机的(A )。 A.... B....C....D....知识点:第 3 章 数据链路层...数据包以广播方式发送 B.所有结点可以同时发送和接收数据 C.两个结点相互通信时,其它结点不检测总线上的信号 D.网络中...

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

以太网数据包发送方式