【问题标题】:How do you send an Ethernet frame with a corrupt FCS?如何发送带有损坏 FCS 的以太网帧?
【发布时间】:2009-04-06 23:30:16
【问题描述】:

我不确定这是否可能,因为这可能在硬件中处理,但我需要发送一些带有错误的以太网帧。我希望能够创建 runts、jabber、misalignment 和 bad FCS 错误。我正在使用 Python。

【问题讨论】:

    标签: python networking automated-tests ethernet


    【解决方案1】:

    可以在硬件中处理,但并非总是如此——即使是这样,您也可以将其关闭;请参阅ethtool 卸载参数。

    关于获得对您创建的框架的完全控制 - 查看PF_PACKET(一种方法)或the tap driver(另一种方法)。

    这是一篇关于using PF_PACKET to send hand-crafted frames from Python的文章。

    【讨论】:

      【解决方案2】:

      首先,禁用以太网卡的校验和:

      sudo ethtool -K eth1 tx off
      

      然后,您从 python 发送损坏的帧:

      #!/usr/bin/env python
      
      from socket import *
      
      #
      # Ethernet Frame:
      # [
      #   [ Destination address, 6 bytes ]
      #   [ Source address, 6 bytes      ]
      #   [ Ethertype, 2 bytes           ]
      #   [ Payload, 40 to 1500 bytes    ]
      #   [ 32 bit CRC chcksum, 4 bytes  ]
      # ]
      #
      
      s = socket(AF_PACKET, SOCK_RAW)
      s.bind(("eth1", 0))
      src_addr = "\x01\x02\x03\x04\x05\x06"
      dst_addr = "\x01\x02\x03\x04\x05\x06"
      payload = ("["*30)+"PAYLOAD"+("]"*30)
      checksum = "\x00\x00\x00\x00"
      ethertype = "\x08\x01"
      s.send(dst_addr+src_addr+ethertype+payload+checksum)
      

      A similar question

      【讨论】:

      • 嗨@brice 我是网络事物的初学者。您能否为您提到的每个变量添加一个衬里/示例。 IP 地址需要是十进制还是十六进制格式?需要更改哪些值?
      【解决方案3】:

      尝试使用 scapy for python,有一些例子可以生成巨型帧,还有一个矮帧。 http://www.dirk-loss.de/scapy-doc/usage.html

      【讨论】:

      • 感谢您的指点,但请始终在答案中发布示例,因为链接处的内容会发生变化,我们无法始终找到所需的内容。例如,我在这里找不到 jumbo 或 runt 的示例。 (巨型机很简单,只需使用大负载即可。)
      【解决方案4】:

      该程序未按预期运行以生成 FCS 错误。

      网络驱动程序再次在生成的帧末尾添加了正确的校验和。当然,该解决方案很可能适用于某些卡,但我敢肯定英特尔的任何卡都不会。 (对我来说,它也可以在没有任何 ethtool 更改的情况下工作。)

      至少有一个 Intel e1000e 网卡,您需要对上面的代码进行一些小改动: 在“s = socket(AF_PACKET, SOCK_RAW)”之后添加以下行:

      s.setsockopt(SOL_SOCKET,43,1)
      

      这告诉 NIC 驱动程序使用 socket.h 中定义的“SO_NOFCS”选项并在不计算和添加 FCS 的情况下发送帧。

      您可能还对以下 C 程序感兴趣,它确实向我展示了如何做到这一点:http://markmail.org/thread/eoquixklsjgvvaom

      但请注意,如果不进行小的更改,该程序将无法在最近的内核上运行。 SOL_SOCKET 似乎在过去某个时间将数字 ID 从 42 更改为 43。

      根据原作者的说法,该功能至少适用于以下驱动程序:e100、e1000 和 e1000e。 3.16.0 内核源代码中的快速 grep 表明 ixgbe igb 和 i40e 也应该可以工作。如果您不使用这些卡中的任何一个,则此插槽选项可​​能不可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2014-04-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-10
        相关资源
        最近更新 更多