Hacker News 中文摘要

RSS订阅

从示波器到Wireshark:UDP通信探秘(2022) -- From Oscilloscope to Wireshark: A UDP Story (2022)

文章摘要

文章讲述了作者从硬件层面分析UDP数据包的探索过程。作者使用示波器直接观测电路板上的信号,通过差分探头捕获网络交换机的物理层数据,逐步解析UDP协议。这种从最底层的物理信号开始逆向分析网络协议的方法,展现了不同于常规网络调试工具的技术路径。

文章总结

从示波器到Wireshark:一次UDP数据包的解码之旅

背景介绍

UDP(用户数据报协议)是OSI模型第四层(传输层)的通信协议,用于在IP网络中发送消息。本文作者通过硬件设备捕获UDP数据包,从物理层的电压波形开始,逐步解码至传输层的UDP数据包。

硬件准备

作者使用高速有源差分探头焊接在Oxide Computer Company的机架交换机上,直接捕获物理层信号。通过示波器观察,可以看到5GHz速率下传输的原始比特信号。

数据处理流程

  1. 波形捕获
    配置示波器以1 TSPS(每秒万亿次采样)的速率捕获100微秒的数据,保存为191MB的.wfm文件。通过Python或自定义的Rust解析器提取波形数据。

  2. QSGMII协议解码
    QSGMII(四通道串行千兆媒体独立接口)将4个SGMII通道合并为一个Tx/Rx对。数据采用8b/10b编码,需通过查找逗号字符(如00111111100000)同步数据流。

  3. 分离数据流
    QSGMII通过替换K28.5K28.1标识端口0,从而将混合数据流分离为4个独立的SGMII通道。

  4. 解析数据包
    根据IEEE 802.3标准,将代码组转换为有序集(如空闲集、数据包起始/结束标记)。在100M模式下,数据会重复10次,需去重后提取有效载荷。

  5. 生成PCAP文件
    使用pcap库将解码后的以太网帧写入文件,通过Wireshark或tshark工具验证数据包内容。最终捕获到IPv6格式的UDP数据包,源端口997,目标端口8。

技术细节

  • 8b/10b编码:确保数据流中0和1的平衡,便于时钟恢复。
  • 时钟同步:通过逗号字符和比特跳变保持采样同步。
  • 错误处理:检测并跳过无效数据包,如长度不足的帧。

成果

整个处理流程耗时约410毫秒,成功从物理层信号解码出UDP数据包,验证了硬件配置的正确性。作者还推荐了进一步学习的资源,如千兆以太网技术文档和开源工具glscopeclient

致谢

感谢Oxide团队的Eric、Arjen等人的支持,以及Tektronix提供的波形文件格式文档。


:本文内容经过简化,保留了核心技术和流程细节,省略了部分代码和次要背景信息。

评论总结

总结评论内容:

  1. 关于采样率的技术疑问
  • 评论1质疑"1 TSPS"的采样率可能存在笔误,认为当前技术难以达到如此高的采样率 关键引用: "Typo? I didn't think we had sample rates anywhere near that high!" ("笔误?我认为我们还没有接近这么高的采样率!")
  1. 关于预算型示波器的咨询
  • 评论2寻求推荐具有基本功能的平价示波器工具,希望了解所需采样率等参数和品牌建议 关键引用: "Could anyone recommend a budget tooling...features desired, cost and any recommended brand/models" ("有人能推荐预算工具吗...需要的功能、成本和任何推荐的品牌/型号")
  1. 关于示波器探头的趣味讨论
  • 评论3赞赏探头照片,推测其价格昂贵,并调侃贴纸是否会影响阻抗 关键引用: "I love the photo of the probe, and I bet it's very expensive. I wonder if the sticker changes the impedance" ("我喜欢探头的照片,我打赌它很贵。想知道贴纸是否会改变阻抗")