オシロスコープからWiresharkへ:UDPの物語(2022年)

2026/03/20 4:18

オシロスコープからWiresharkへ:UDPの物語(2022年)

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

要約

この記事は、Oxide VSC7448ラックスイッチ(VSC8504 PHYを使用)から取得した生のQSGMII波形をEthernetパケットトレース(.pcapファイル)に変換する完全なパイプラインを文書化しています。スイッチに差し込まれた高速デジタルプローブがTektronixオシロスコープに接続され、1 TSPSでサンプリングされた191 MBの波形が記録されました。このデータセットは約100 µsのトラフィックを含み、数千ではなく1〜3個のUDPパケット(≈33 µs/パケット)しか生成しません。

コンパクトなRustパーサー(約400行)は .wfm ファイルを読み込み、カンマシンボルとゼロクロッシングを検出して8b/10b符号化されたストリームをデコードし、4つの交差したポートストリームを抽出します。パーサーは

TryFrom<u16>
を介してコードグループを検索テーブルにマッピングし、その後PCS制御マーカー(Configuration, Idle, CarrierExtend, StartOfPacket, EndOfPacket, ErrorPropagation, LinkPartnerIdle)を解釈します。Port 0 に固有の K28.5/K28.1 交差パターンを使用して、ツールは各ポートのデータストリームを回復します。

デコードされたEthernetフレームは7バイトのプレアンブルから始まり、宛先MAC

33:33:00:00:00:01
(IPv6全ノードマルチキャスト)、送信元MAC
0e:1d:f3:5c:9d:24
、EtherType
0x86DD
を持ちます。各ポートで2つのUDPパケットが生成され(
tshark
で確認済み)、それぞれ8バイトペイロード
01 02 03 04 05 06 07 08
を送信元
fe80::c1d:f3ff:fe5c:9d24
から宛先
ff02::1
に、ポート 997→8 の間で転送します。

Rustツールは4つの .pcap ファイル(各ポートごと)を出力し、パケット数をログに記録します。波形から pcap までの全作業フローは著者のマシンで約 410 ms で実行されます。

今後の課題として、より長いキャプチャや高スループットデバイス用にパイプラインをスケールし、リアルタイム監視統合を探求することが挙げられます。Rustパーサーをオープンソースとして公開することで、このアプローチは物理層でのデータセンターネットワークハードウェアのトラブルシューティングと認証を加速させることを目指しています。

本文

UDP – 生電圧波形から復号されたパケットへ


UDP の概要

UDP は IP ネットワーク上でメッセージを送受信するためのトランスポート層プロトコルです。
OSI 参照モデルではレベル 4 に位置します。

7 アプリケーション
6 プレゼンテーション
5 セッション
4 トランスポート   ← UDP
3 ネットワーク
2 データリンク
1 物理層

動機

デスク上には UDP パケットを連続で送信するハードウェアがあります。
「tcpdump を使って生パケットを見る」といった一般的なチュートリアルではなく、
より詳細に解析したいと考えています。

対象は、Oxide Computer Company のラックスイッチの金属層まで接続された アクティブ差動プローブ です。
(プローブはエリックによって丁寧にハンダ付けされています。)


アナログトレースから波形へ

オシロスコープで線路上の信号を取得しました。
目的は、これらのアナログトレースを読みやすい UDP パケットへ変換することです。

  1. キャプチャサイズ – デバイスは約 30 k UDP パケット/秒(≈33 µs/パケット)を放出します。
    スコープは 100 M サンプル、1 TSPS で設定 → 100 µs のデータ量で 1〜3 パケット分が取得できます。

  2. ファイル形式 – スコープは

    .wfm
    ファイルを出力します。
    Tektronix はこのフォーマットを公開しており、私は Rust と
    nom
    を使って解析しました。
    簡易テスト用に:

    import numpy as np
    data = open('udp-spam.wfm', 'rb').read()
    pts  = np.frombuffer(data[904:-1], dtype=np.int16)
    
  3. 結果 – スコープが表示した波形と一致する生電圧トレースを取得しました。


QSGMII のデコード

VSC7448 スイッチと VSC8504 PHY を接続するリンクは QSGMII(Quad Serial Gigabit Media‑Independent Interface)です。
四つの SGMII チャネルを 1 本の Tx/Rx ペアに統合し、5 Gbps で動作します。

8b/10b エンコーディング

SGMII と QSGMII は共に 8b/10b エンコーディングを使用します。
フレーミングを復元するためには コンマ文字

1100000
または
0011111
)を探します – 連続した同一ビットが五つ並ぶ唯一のコードグループです。

let pts: Vec<bool> = t.pts.iter().map(|p| *p < 0).collect();

遷移を検出し、約 900 サンプルほど一定レベルが続く領域を検索してコンマを見つけます。
同期したら、5 GHz のクロックレート(1 ビットあたり 200 サンプル)で 10‑bit コードグループを読み取ります。


コードグループからストリームへ

QSGMII は四つの SGMII ストリームを交互に配置します。
特別な K28.5 → K28.1 スワッパーが Port 0 を識別し、以降は

port0, port1, port2, port3…
の順で並びます。

let mut channel: Option<usize> = None;
for (i, mut cg) in cgs.iter().cloned().enumerate() {
    if cg == Codegroup::K28_1 {
        channel = Some(0);
        cg = Codegroup::K28_5;  // スワップ解除
    }
    if let Some(c) = channel.as_mut() {
        streams[*c].push(cg);
        *c = (*c + 1) % 4;
    }
}

このステップの後、各ポートごとにコードグループ列が得られます。


コードグループからパケットへ

IEEE 802.3‑2015 の表を参照し、コードグループは Ordered Set にマッピングされます:

Ordered Set意味
K28.5
→ config pair
設定
K23.7
キャリア拡張
K27.7
パケット開始
K29.7
パケット終了
K30.7
エラー伝搬
データグループ(
Dxx.x
ペイロード

デコーダは

Pcs
アイテムのストリーム(OrderedSet か生データバイト)を生成します。

fn decode(cgs: &[Codegroup]) -> Vec<Pcs> { … }

パケット再構築

デコード後、慣れ親しんだイーサネットフレーミングが見えてきます:

  • アイドル
    /I/
    ) – 連続した
    55
  • パケット開始
    /S/
  • パケットデータ
    55 55 55…
    で始まる列
  • パケット終了
    /T/
    )
  • キャリア拡張
    /R/

リンクは 100 Mbit で動作し、QSGMII はギガビットなので各バイトが十回繰り返されます。
10 回ごとに一つだけ取り出せばクリーンなイーサネットフレームが得られます:

55 55 55 55 55 55 55 d5
33 33 00 00 00 01   ← 宛先 MAC(IPv6 全ノード)
0e 1d f3 5c 9d 24   ← 送信元 MAC
86 DD               ← イーサタイプ(IPv6)

IPv6 ペイロードは UDP パケットで、宛先

ff02::1
、送信元
fe80::…
です。


PCAP への書き出し

pcap
クレートを使用して、
.wfm
ファイル全体を四つの
.pcap
ファイル(ポートごと)へ変換します。
典型的なログ出力は以下の通りです:

[2022-08-08T13:22:35Z INFO  qsgmii] Opening udp-spam.wfm
…
[2022-08-08T13:22:36Z INFO  qsgmii] Wrote 2 packets from port 0 to out.pcap.0
...

処理は標準的なマシンで約 410 ms です。


Wireshark での検証

tshark -r out.pcap.0

同一の UDP パケットが二つ表示されます:

1   0.000000 fe80::c1d:f3ff:fe5c:9d24 → ff02::1      UDP 82 997 → 8 Len=8
2   0.000000 fe80::c1d:f3ff:fe5c:9d24 → ff02::1      UDP 82 997 → 8 Len=8

-V
を付けて詳細ダンプすると、イーサネット・IPv6・UDP の各層が確認できます。


結論

生電圧トレースから始めて、以下の手順で物理層からアプリケーションデータまでを完全に解析できました:

  1. Tektronix
    .wfm
    ファイルをパース
  2. QSGMII のコンマ文字で同期取得
  3. 8b/10b コードグループをポートごとのストリームへ変換
  4. コードグループをイーサネットフレームにマッピング
  5. パケットを PCAP としてエクスポートし、標準解析ツールで確認

これにより、物理層からアプリケーション層までの完全な低レベル検査パイプラインが実現しました。

同じ日のほかのニュース

一覧に戻る →

2026/03/20 5:33

コックピットは、サーバー用のウェブベースのグラフィカルインターフェイスです。

## Japanese Translation: **Cockpit** は、Linux 管理者がオペレーティングシステムから直接サーバーを管理できる軽量でブラウザベースのインターフェイスです。OS 内で動作し、Debian、Fedora、および RHEL など主要なディストリビューションに対応しており、コンテナの起動、ストレージやネットワークの設定、ログの確認、ブラウザを離れずにターミナルとグラフィカルコントロール間で切替えなどが可能です。 ユーザーは Cockpit からでも従来のシェルからでもサービスをシームレスに開始・停止でき、端末で発生したエラーは自動的に Cockpit のジャーナルインターフェイスに表示されます。 プロジェクトはリモート管理もサポートしており、ユーザーは SSH 経由で Cockpit がインストールされた他のマシンを追加・管理できるため、ホスト切替が簡単です。コミュニティサポートは Matrix チャネル(#cockpit:fedoraproject.org)とメールリストで提供されます。ドキュメントにはツールの使い方だけでなくコードベースへの貢献方法も網羅しており、ガイディングプリンシプル、リリースノート、およびプライバシーポリシーが含まれています。 複数の Linux ディストリビューションにわたる統一で使いやすい GUI を提供することで、Cockpit はサーバー管理を効率化し、ドキュメントと活発なコミュニケーションチャネルを通じて継続的な開発者貢献を促進することを目指しています。

2026/03/19 22:05

**Astral が OpenAI に参入**

## Japanese Translation: **(欠落していた詳細を補完)** ### 要約 Astral は、オープンソースの Python ツールを存続させつつ OpenAI の Codex チームに参加することに合意し、そのツールチェーンをモダンな Python 開発の中心に位置付けました。この取引は Astral の創業者が発表し、Python エコシステムの生産性を少なくとも 1 % 向上させる高レバレッジ戦略を強調しています。Ruff(高速リンター)、uv(依存関係解決ツール)、ty といった人気ツールへの継続的なサポートが含まれ、これらを Codex の AI コーディングアシスタントに統合する計画です。Astral のツールチェーンはゼロから数億件の月間ダウンロードへと成長し、Accel が主導した Casey Aylward 氏によるシード資金調達と Andreessen Horowitz が牽引した Jennifer Li 氏によるシリーズ B 資金調達で支えられています。創業者は Astral チームのユーザー重視の製品品質に感謝し、今後も高い基準を維持するとともに、ユーザーの信頼への感謝を表明しました。買収後、Astral はオープンソース提供物の開発を継続し、それらを Codex と統合し、ソフトウェアエンジニアリングにおける影響力を拡大します。これにより、開発者・企業・広範なエコシステムは、生産性を加速させる AI 強化型の堅牢な Python ユーティリティ―基盤となるツールセット―を享受できます。

2026/03/20 2:16

Google、未認証Androidアプリをサイドロードするための新しい24時間プロセスを発表

## Japanese Translation: Googleは2025年後半にAndroid向けの開発者認証プログラムを開始し、開発者が認証されていない場合はサイドロードされたアプリをブロックすることでマルウェアリスクを低減することを目指します。開発者は本人確認書類を提出し、アプリ署名キーをアップロードし、25ドルの手数料を支払う必要があります。 ユーザーは「未認証パッケージを許可」オプションを有効にして認証を回避できます。設定方法は、ビルド番号を7回タップして開発者向けオプションを解除し、スイッチを切り替えてPIN/パスワードで確認し、デバイスを再起動します。その後24時間待ち、次に「一時的に許可」または「無期限に許可」を選択します。24時間の遅延は、高度なソーシャルエンジニアリング攻撃を抑止するためです。 Googleは非Playソースからマルウェアに遭遇する確率が約50倍高いと引用し、このプログラムでそのリスクを低減すると主張しています。検証機能はすでにAndroid 16.1(2025年後半にリリース)に組み込まれており、全てのサポート対象デバイスで利用可能です。実施開始はブラジル、シンガポール、インドネシア、タイで2025年9月から行われ、2026年には世界中へ展開されます。 このプログラムは手数料などのハードルを追加するため、制裁対象国の開発者にとって不利になる可能性がありますが、Googleはその方針がそのような開発者を排除することを意図していないとし、検証済み開発者リストを非永続化に保ち法的課題を回避すると述べています。プライバシー擁護派は検証済み開発者のデータベースについて懸念を示し続けています。

オシロスコープからWiresharkへ:UDPの物語(2022年) | そっか~ニュース