基于罗德与施瓦茨RTO示波器的100BASE-TX协议解码分析

科技时尚 2025-01-18 荣骊达人 3020

今天我们以太网连接两台电脑,然后用示波器解码。一边做实验一边讲解百兆以太网波形和帧结构,最终还会讲解以太网如何从波形得到数据的整个解码过程

准备工作

我们需要准备一台电脑运行简单的UDP发送程序:

并且将这台电脑通过百兆以太网口接上另一台电脑,同时我们用差分探头和夹具在网线中间探测波形,观察波形是否能与程序中发的数据对应。

4350f776-cf10-11ef-9310-92fbcf53809c.png

(连线图)

黄色网线接DUT(运行udp_send.py的电脑),灰色网线接Link Partner(另一台电脑,可接收到udp数据)。

(udp_send.py代码截图)

DUT信息:

MAC地址:004C5F:18

IP地址:192.168.2.123

Link Partner信息:

MAC地址:0033D3:B9

IP地址:192.168.2.100

我们提前了解过,网线中一共有4对差分线,100Base-TX只在其中2对差分线上单向发送信号的。DUT发往Link Partner的1对差分线线是夹具上的A,反方向的1对差分线是夹具上的B。当我们探头按连线图这样接线时,测的波形只是从DUT电脑发出的。

(以太网解码设置)

我们可以开启百兆以太网解码,并按上图选择100BASE-TX,还可以点击自动设置。

(以太网显示设置)

在显示设置中,右侧的数据格式指的是对于解出数据结果如何显示,如果要观察MAC地址建议选十六进制,如果要观察IP地址建议选无正负(整数),最终要对比4B5B结果时建议选二进制。解码层也很重要,尤其是后面对比波形和解码结果时,打开后会在彩色解码结果下出现额外的蓝色结果,我们会在文章的后半部分对其详细讲解。

以太网帧结构

我们可以先来大致看一下以太网解码结果。

电脑发送UDP数据后,建议示波器使用Normal触发,并点击Single,这样示波器在抓到以太网数据后就会暂停,方便观察。

43ba5e8c-cf10-11ef-9310-92fbcf53809c.png

(1 MAC结构)

你可以看到缩放窗口中是完整的以太网数据,开头是前导码,后面淡蓝色是SFD,然后是目标MAC和源MAC,绿色是LenType,橙色是数据,数据后面是FCS也就是CRC,再然后深灰色是EOS,浅灰色是IDLE。

可以观察到目标MAC和源MAC确实与Link Partner和DUT的MAC地址是对应的。

大家习惯的MAC地址都是用16进制显示,所以显示页面中数据格式要选择“十六进制”。

43de1cc8-cf10-11ef-9310-92fbcf53809c.png

(2 IP结构)

我们再看一下橙色数据,Data13~16对应的是192.168.2.123也就是DUT的IP。

Data17~20对应的是192.168.2.100,也就是Link Partner的IP。

由于IP地址普遍习惯用十进制数表示,因此显示页面中数据格式要选择“无正负(整形)”。

43f1bc9c-cf10-11ef-9310-92fbcf53809c.png

(3载荷内容)

再往后看到Data29~Data31,它们是0x31,0x32,0x33,也就是字符串“123”对应的ASCII码,这个字符串正好就是我们电脑上python程序中发送的数据。到此为止,我们就成功地用示波器解码出了电脑发出的数据。

解码过程

我们以Data30这个数据的解码流程为例,讲述百兆以太网解码流程

通过上面的实验,你大致了解了以太网帧的结构,但你有可能会问,示波器是如何解出0x31,0x32,0x33这样的结果的?它们与模拟波形的关系是怎样的呢?我们能否用肉眼从模拟波形中解出这个结果?

答案显然是肯定的,下面我们以Data30这个数据的解码流程为例,讲述百兆以太网解码流程。

我们放大Data30,它对应的载荷数据内容是0x32。但为了尽量接近原始数据,建议显示中数据格式选择为二进制,这样橙色结果中就会显示为0011 0010,它与我们电脑发的十六进制数0x32是对应的。接下来我们一步步演示怎样从模拟波形解出这个橙色结果。

先把解码层选择为边沿。

4419039c-cf10-11ef-9310-92fbcf53809c.png

(4解码层边沿)

从上图可以看到,现在蓝色的解码层结果是与模拟波形电平对应的,高电平对应1,0V附近对应0,低电平对应-1,这就是通常我们理解的三电平波形。

然后,我们把解码层改为二进制。

443115d6-cf10-11ef-9310-92fbcf53809c.png

(5解码层二进制)

这时候虽然原始波形和最终数据没变,但蓝色解码层结果有变化,现在变成了模拟波形无跳变时对应0,按类似正弦波的规律跳变时对应1,这符合MLT-3。

最后,我们把解码层改为解扰。

444b020c-cf10-11ef-9310-92fbcf53809c.png

(6解码层解扰)

这时候,蓝色解码层结果又变了,它是把之前的二进制数据做了解扰运算后的结果(与解扰码10010 00100求异或),我们观察到橙色波形Data30下的蓝色部分,一共对应了10个数据,10100 10101。如果我们查询4B5B对应关系,这两个5B结果对应的应该是0010和0011,然后再把这两组4B数据交换,就能得0011和0010,也就是Data30的橙色部分。

445f95e6-cf10-11ef-9310-92fbcf53809c.png

(4B5B对应表)

你可能会问,我们是怎么知道这时候要用10010 00100作为解扰码的?

44735554-cf10-11ef-9310-92fbcf53809c.png

(用来生成解扰码的移位寄存器)

答:解扰码是使用11位的线性反馈移位寄存器(LFSR)来生成2047位长的伪随机数[2],这串数据是固定的,因此事先已知。但我们事先无法知道的是从解扰码的哪个位置起作为开头与波形的二进制数据开头来做异或运算。我们只能前后滑动解扰码,直到能解出符合我们预期的结果后才知道正确的偏移位置。这个前后滑动的尝试,可能会高达8000次。

4486ee70-cf10-11ef-9310-92fbcf53809c.png

(帧结构和起始结束符号示意图)

上图上半部分与我们在示波器界面上看到的MAC帧结构一致,下半部分是经过正确解扰后的结果,在Preamble刚出现时对应的2个符号应该是J(11000)和K(10001)。上图中未画出的IDLE部分应该在Preamble之前和FCS之后,对应的符号是11111。

也就是说如果你前后滑动解扰码,并做异或运算,直到得到了11111 11000 10001,那么你就找出了正确的解扰码起始位置[1],同时也找出了MAC帧从哪里开始(从J开始)。

你可能还会问为什么做了4B5B对应后,还要按下图的方式把连续两个4B交换?

4496a1bc-cf10-11ef-9310-92fbcf53809c.png

(Nibble交换)

44a39d86-cf10-11ef-9310-92fbcf53809c.png

(MII接口和PHY芯片)

这是因为MII接口传输的半字节(Nibble)流和PHY芯片内的串行比特流的顺序对应关系导致的。

罗德与施瓦茨业务涵盖测试测量、技术系统、网络与网络安全,致力于打造一个更加安全、互联的世界。成立90 年来,罗德与施瓦茨作为全球科技集团,通过发展尖端技术,不断突破技术界限。公司领先的产品和解决方案赋能众多行业客户,助其获得数字技术领导力。罗德与施瓦茨总部位于德国慕尼黑,作为一家私有企业,公司在全球范围内独立、长期、可持续地开展业务。