如何在软件中可靠地生成以太网帧错误?

Posted

技术标签:

【中文标题】如何在软件中可靠地生成以太网帧错误?【英文标题】:How to reliably generate Ethernet frame errors in software? 【发布时间】:2011-09-13 20:21:21 【问题描述】:

问题:

我正在测试一段电缆故障查找软件,我想在 cat5 电缆上可靠且可重复地生成电缆故障。

目前我正在使用一米长的未绞合电缆,并在电源旁边手动扭动电缆,但我无法检测到应用程序中的任何故障(我正在从以太网 ASIC 读取以太网故障计数器.)这是因为没有产生故障,还是因为软硬件检测有故障,我无法判断。

有没有办法在软件中做到这一点?

我会满足于用更高级的语言编写一些东西,比如 Java 或 python,作为最后的手段,我愿意用 C 把它放在一起,但我真的不想纯粹重写以太网驱动程序修复一个可能的错误。

[编辑]:我想创建电缆故障 - 不检测它们。

[编辑]:我已经通过 FTP 和 SCP 传输大文件,但修改后的电缆没有问题,并且在使用 wireshark 检查流量时没有发现任何错误

[编辑]:另见similar question in python。

解决方案:

好吧,在和 C 打了一天多之后,这就是 python 的解决方案。

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

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)

谁说一定要复杂...

PS:我爱 Python。

【问题讨论】:

您是否尝试检测您的软件如何响应错误的数据包?还是您的软件无法识别此类格式错误的数据包及其格式错误的原因? 推测“故障检测器”正在执行基于校验和的检查。如果您准备生成自己的以太网帧,那么您可能会注入错误的校验和? @Oli - 是的,你是对的。它只是基于校验和的检查。你有什么软件可以让我把自己的以太网帧放在一起吗? 看起来你应该能够在软件中做到这一点,但这取决于你是否可以“领先”故障查找软件。作为一名前电子技术人员,在电缆本身中制造短路和开路应该非常简单。 (如果需要,使用两根电缆,一根短路,一根开路。)其他故障会有点棘手。 @brice:如果您使用 C 语言,您可以使用 socket(AF_INET, SOCK_RAW, ...) 发送一个原始以太网帧,并将一个指向您自己生成的原始缓冲区的指针传递给它(例如,通过以下en.wikipedia.org/wiki/Ethernet_frame 的框架布局。 【参考方案1】:

如果您使用 C 语言,您可以使用 socket(AF_PACKET, SOCK_RAW, ...) 发送原始以太网帧,并将指针传递给您自己生成的原始缓冲区(例如,通过遵循 wikipedia 的帧布局) .

很久没做这个了,不打算写一个有代表性的代码sn-p...

【讨论】:

以上是关于如何在软件中可靠地生成以太网帧错误?的主要内容,如果未能解决你的问题,请参考以下文章

为什么以太网上的帧最小要64字节

:数据链路层

以太网帧结构

以太网帧结构

以太网帧结构

计算机网络—— 数据链路层(89):集线器与交换机的区别以太网交换机自学习和转发帧的流程