4、硬件解码原理:从网络数据包到行情数据的链路、MAC层解析、IP层解析
各位同学,今天我们聊点硬核的。
行情数据从网线进来,到你的策略拿到手,中间到底发生了什么?很多人觉得不就是收个包嘛,但说实话,在纳秒级竞争的环境下,每一层解析都可能是瓶颈。我个人习惯把这条链路拆成三段来看:物理信号变成帧,帧里拆出IP包,IP包里掏出UDP数据。今天我们先聚焦前两层——MAC层和IP层。
4.1 从网线到MAC帧:第一道关卡
网线上的信号是模拟的,差分电压摆来摆去。PHY芯片把它转成数字的比特流。但比特流不等于数据包,你得找到帧的起始位置。
以太网帧的开头有个前导码(Preamble),7个字节的0x55,然后是1个字节的SFD(帧起始定界符)。硬件检测到SFD,就知道「好了,帧要来了」。我在项目中遇到过一个问题:某些交换机的Preamble抖动特别大,导致FPGA里的状态机误触发。后来我们加了一个窗口滤波器,才稳住。
关键点:MAC层解析的第一步,就是找到帧边界。这一步做不好,后面全是垃圾。
帧进来之后,硬件会检查目的MAC地址。如果是广播地址(FF:FF:FF:FF:FF:FF)或者匹配自己的MAC,就收下;否则直接丢弃。你想想看,如果每个包都往上层送,CPU早被淹死了。硬件过滤是低延迟系统的第一道防火墙。
嗯,这里要注意:有些FPGA实现会允许用户自定义MAC过滤规则。比如我只收组播MAC 01:00:5E:xx:xx:xx,其他一概不要。这样可以进一步降低无效包的处理开销。
4.2 MAC层解析:不只是地址匹配
MAC帧头总共14字节:6字节目的MAC、6字节源MAC、2字节以太类型。以太类型字段告诉上层:里面是IPv4(0x0800)还是ARP(0x0806)?
对于行情解码,我们只关心IPv4。所以硬件解析器看到0x0800,就把后面的数据往IP解析模块送。如果是ARP,直接丢给CPU或者干脆丢弃——反正行情系统不需要ARP。
| 字段 | 长度 | 说明 |
|---|---|---|
| 目的MAC | 6字节 | 匹配本机或组播地址 |
| 源MAC | 6字节 | 通常用于统计或过滤 |
| 以太类型 | 2字节 | 0x0800 = IPv4 |
我曾经踩过一个坑:某家交易所的行情源会发送带VLAN标签的帧。标准的以太类型字段被挤到了第15-16字节,VLAN标签插在中间。如果硬件解析器没处理VLAN,就会把VLAN标签当成IP头来读,结果全乱套。所以,一定要先剥离VLAN标签,再交给IP解析模块。
避坑指南:我曾经在调试时发现,某些网卡在硬件层面已经剥离了VLAN标签,但FPGA直连PHY时不会。如果你用FPGA做解码,记得自己处理VLAN。
4.3 IP层解析:找到真正的数据
IP头标准长度20字节,但可能有选项字段。硬件解析器需要先读IP头的第0字节:版本和首部长度。版本必须是4(IPv4),首部长度告诉你有多少个32位字。如果首部长度是5,那就是20字节标准头;如果是6,说明有4字节的选项。
我个人习惯在硬件里直接丢弃带选项的IP包。为什么?因为行情数据不需要IP选项,而且解析选项会引入不确定的延迟。你想想看,在低延迟系统里,确定性比灵活性重要得多。
接下来要检查IP头的几个关键字段:
- 总长度:整个IP包的长度,包括头和数据。硬件用这个值来切分包边界。
- 标识 + 片偏移:如果片偏移不为0,说明是分片包。我建议直接丢弃。行情数据通常不会分片,而且重组分片会引入巨大的延迟和复杂度。
- 协议:必须是17(UDP)。如果是TCP或其他,直接丢弃。
- 目的IP:检查是否匹配本机或组播组。这一步可以和MAC过滤联动,形成双层过滤。
注意:IP头校验和(Header Checksum)在硬件里必须验证。虽然UDP也有校验和,但IP头校验和能帮你提前发现损坏的包。我在一个项目中遇到过网线老化导致偶尔的比特翻转,IP校验和救了我们好几次。
4.4 硬件流水线:并行才是王道
上面讲的MAC解析和IP解析,在软件里是顺序执行的。但在硬件里,我们可以做成流水线。比如:
- 第一级:检测SFD,接收比特流
- 第二级:解析MAC头,过滤地址
- 第三级:解析IP头,过滤协议和地址
- 第四级:提取UDP头和数据
每一级只处理一个固定的字节窗口,数据在寄存器间流动。这样,每个时钟周期都能处理一个包,延迟只有几个时钟周期。说白了,硬件解码的快,不是靠频率高,而是靠并行和流水线。
下面我画了一张图,展示从网线到行情数据的完整链路:
4.5 实战中的几个细节
讲完原理,我分享几个实际项目中遇到的细节:
- MAC地址表的更新:组播MAC地址通常是动态加入的。硬件里需要维护一个小的CAM表,支持快速查找。我建议用TCAM,一个时钟周期就能出结果。
- IP校验和的硬件实现:用16位加法器做累加,最后取反。注意要处理进位回卷。这个逻辑很简单,但一定要用组合逻辑做,不要打拍子,否则延迟就上去了。
- 包间隔(IPG):以太网要求帧之间有12字节的间隔。硬件解析器可以利用这个间隔做流水线复位。如果IPG太小,说明链路有问题,可能会丢包。
核心总结:硬件解码的本质,就是用固定的逻辑电路,在几个时钟周期内完成软件需要几百条指令才能做的事。MAC层负责地址过滤和帧边界识别,IP层负责校验和协议过滤。两层配合,把无效包挡在门外,只把真正的行情数据送进去。
好了,这一章就到这里。下一层是UDP和行情应用层的解析,那是另一个故事了。