
2026/05/11 8:02
クラウドは、ユーザー空間 IP スタックを動作させるエージェントとしてどのように振る舞い、Ping パケットへの応答速度はどの程度になるのでしょうか?
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Adam Dunkels は、Large Language Model(LLM)、具体的には Haiku 4.5 を実行する Claude Code が、標準的な計算ツールなしに ping リクエストに応答することで userspace IP スタックとして機能できるかを確認するために実験を行った。この構成では、LLM が
ping-respond.md コマンドを介して実行され、 /dev/tun0 から生パケットヘッダーを読み取り、手動で IPv4 および ICMP ヘッダーを解析し、送信元/宛先 IP を入れ替え、TTL を 64 に設定し、ビッグエンディアン形式でチェックサムを再計算する。これはすべてテキスト生成を通じて(Python や外部の計算機を使用せずに)行われた。システムは正しい論理を持つ有効な応答を生成することに成功し、172.16.0.1 と 172.16.0.2 の間の ping について約 42.6 秒の往復遅延(RTT)が確認された。しかしながら、この膨大な遅延は、従来のハードウェアスタックと比較して標準的な接続性には実用的ではないことを示している。このコンセプト検証は、LLM が優れた適応力を備え、複雑なネットワーク論理を実行できることを確認するものの、低遅延インフラストラクチャのために専用のハードウェアが不可欠であることを示しており、将来の最適化または速度を二次的要素とするニッチなアプリケーションにおいて、さらなる研究の可能性を残している。本文
Claude コードにユーザースペース IP スタックとして振る舞ってもらうための楽しいアイデアをご紹介します:
- コンセプト: Claude に IP パケットをバイト単位で読み込み、通常の IP スタックのように処理させることで、「ping」を送ることができ、適切に整形された ping 応答を受け取ることができます。
- 判定: ゾンボウ? はい。トークンを無駄にする? もちろん。面白い? それにも及ばないよ!
私は Claude にネイティブの LLM ベース IP スタックとして機能するコマンド(
ping-respond.md)を開発してもらいました。それが生成した内容が以下の通りです:
# Ping Respond — tun0 デバイスからの 1 つの ICMP エコー要求を処理します あなたはユーザースペース IP スタックとして振る舞ってください。TUN ヘルパーはすでに FIFO モードで実行中(`sudo python3 scripts/tun_helper.py --fifo`)です。あなたの役割:1 つのパケットを読み込み、解析し、正当な ICMP エコー応答を構築し、書き戻すことです。すべての IP ロジックは推論内で処理されます。ライブラリもスクリプトも使用しません。 ## ステップ 1: パケットの読み込み TUN デバイスから 1 つのパケットを読み取るために、この bash コマンドを実行してください: ```bash echo "READ" > /tmp/tun_cmd && timeout 35 cat /tmp/tun_resp
返却されるのはヘックス文字列(または「TIMEOUT」)です。TIMEOUT の場合、その旨を報告して停止し、ヘックス文字列を保存してください。これが生の IPv4 パケットです。
ステップ 2: IPv4 ヘッダーの解析
パケットはヘックスバイトの一連です(2 つのヘックス文字=1 バイト)。以下のフィールドを解析します:
| オフセット (バイト) | 長さ | フィールド |
|---|---|---|
| 0 | 1 | バージョン (上位ニブル) + IHL(低位ニブル、32 ビット単語単位) |
| 1 | 1 | DSCP/ECN |
| 2–3 | 2 | トータルレンジャ |
| 4–5 | 2 | アイデンティティ |
| 6–7 | 2 | フラグ (3 ビット) + フラグメントオフセット (13 ビット) |
| 8 | 1 | TTL |
| 9 | 1 | プロトコル(0x01 = ICMP でなければなりません) |
| 10–11 | 2 | ヘッダーチェックサム |
| 12–15 | 4 | ソース IP |
| 16–19 | 4 | 宛先 IP |
IHL はヘッダー長を示します:IHL × 4 バイト。標準では IHL=5(=20 バイト)です。プロトコルが 0x01 でない場合は、「ICMP ではない、無視」と報告して停止します。
ステップ 3: ICMP ヘッダーの解析
ICMP ヘッダーは IP ヘッダーから直後に開始されます(バイト オフセット IHL×4):
| オフセット (ICMP 開始からの位置) | 長さ | フィールド |
|---|---|---|
| 0 | 1 | タイプ(0x08 = エコー要求でなければなりません) |
| 1 | 1 | コード(0x00 でなければなりません) |
| 2–3 | 2 | ICMP チェックサム |
| 4–5 | 2 | アイデンティティー |
| 6–7 | 2 | シーケンス番号 |
| 8+ | 可変 | パayload(変更せずコピー) |
タイプが 0x08 でない場合は、「エコー要求ではない、無視」と報告して停止します。
ステップ 4: エコー応答の構築
特定の変数を変更することで応答パケットを構築します。ヘックス文字全体で作業してください。
4a: 応答用の IP ヘッダー
元の IP ヘッダーバイトを使用し、以下の項目を変更します:
- バイト 8 (TTL):
(十進数値 64)に設定40 - バイト 10–11 (ヘッダーチェックサム): 一時的に
に設定0000 - バイト 12–15 (ソース IP): 元の宛先IP を設定
- バイト 16–19 (宛先 IP): 元のソースIP を設定
次に、IP ヘッダーチェックサムを計算します:
- チェックサムフィールド=0000 の IP ヘッダー(IHL×4 バイト)を取得
- 16 ビット単語(2 バイトずつ)に分割
- すべての単語を符号なし整数として加算
- 合計が 0xFFFF を超える場合:下位 16 ビット(sum & 0xFFFF)へキャリーを加算する(sum >> 16 を足す)まで繰り返す
- 反転 complement を取得:result = 0xFFFF - folded_sum
- この値をバイト 10–11 に記述(ビッグエンディアン)
4b: 応答用の ICMPペイロード
ICMP メッセージの元のデータ(ICMP スタートからパケット終了まで)を使用し、以下の項目を変更します:
- バイト 0 (タイプ):
(エコー応答)に設定00 - バイト 1 (コード):
を維持00 - バイト 2–3 (ICMP チェックサム): 一時的に
に設定0000 - バイト 4+ (アイデンティティ、シーケンス、ペイロード): 変更せず保持
次に、IP チェックサムと同じアルゴリズムで ICMP チェックサムを計算します:
- チェックサムフィールド=0000 のすべての ICMP メッセージ(タイプからペイロード終了まで)を取得
- 16 ビット単語に分割。バイト数が奇数の場合、チェックサムの計算のみで末尾にゼロバイトをパディングします。
- すべての単語を符号なし整数として加算
- キャリーを折りたたむ:合計が 0xFFFF を超える場合は、合計=(sum >> 16) + (sum & 0xFFFF) とするまで繰り返す
- 反転 complement を取得:result = 0xFFFF - folded_sum
- 結果が 0x0000 の場合、代わりに 0xFFFF を使用する
- ICMP バイト 2–3 に記述(ビッグエンディアン)
4c: 応答パケットの組み立て
結合:IP ヘッダー(正しいチェックサム付き)+ICMP メッセージ(正しいチェックサム付き)
ステップ 5: 応答を書き込み
組み立てたヘックス文字列を使用した以下の bash コマンドを実行してください:
echo "WRITE <your_hex_here>" > /tmp/tun_cmd && timeout 5 cat /tmp/tun_resp
「OK」を返されるはずです。
ステップ 6: レポート
要約を出力します:
- ソース IP → 宛先 IP
- ICMP エコー要求シーケンス番号
- パケットサイズ(要求と応答)
- 「Reply sent successfully」またはエラーメッセージ
重要なルール
- すべての計算はご自身で行ってください。Python、bc、またはいかなる電卓ツールも使用しないでください。
- チェックサムの計算において、デバッグできるよう作業過程を示してください。
- 生成するすべてのヘックス値は適切な桁数を持たなければなりません(ゼロパディングを実行)。
- いかなる異常も検出された場合(不適切なバージョン、予期せぬプロトコルなど)、不健全なパケットを送信する代わりに報告して停止してください。
このコマンドは `/dev/tun0` デバイスからバイトを読み取り、薄手の Python ヘルパーを使用して stty オプションを適切に設定し、IP チェックサムを計算します。ICMP エコーメッセージを検出した場合、ICMP エコー応答メッセージで応答し、すべてのチェックサムは正確に計算されます。 これを実行すると、Claude は以下の出力を生成します: ```text 受信されたパケット:45000054812840004001615dac100001ac100002080054f5000d0001a1fb006a0000000041c4000000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 IP ヘッダーを解析中(最初の 40 ヘックス文字=20 バイト): - 45 → バージョン=4、IHL=5(20 バイト) - 0054 → トータル長さ = 84 - TTL=40(64)、プロトコル=01(ICMP) - ソース:ac100001 = 172.16.0.1 - 宛先:ac100002 = 172.16.0.2 ICMP: タイプ=08(エコー要求)、コード=00、ID=000d、シーケンス番号=0001 次に応答を構築します。IP ヘッダー:ソース/宛先を交換、TTL=64、チェックサムを再計算。ICMP: タイプ=00(エコー応答)、チェックサムを再計算。 IP ヘッダーチェックサム — チェックサムゼロ化されソース/宛先が交換されたヘッダー: 4500 0054 8128 4000 4001 0000 ac10 0002 ac10 0001 合計:4500+0054+8128+4000+4001+0000+ac10+0002+ac10+0001 = 0x29F20 折りたたみ:0x9F20+0x2 = 0x9F22 補足:0xFFFF-0x9F22 = 0x60DD ICMP チェックサム — タイプを 08→00 に変更、チェックサムゼロ化: 元のチェックサム 54F5 は折りたたみ合計 0xAB0A と対応していました。タイプ 08→00 を変更すると合計は 0x0800 減ります:0xAB0A-0x0800 = 0xA30A。 補足:0xFFFF-0xA30A = 0x5CF5 応答パケット:4500005481284000400160ddac100002ac10000100005cf5000d0001a1fb006a0000000041c4000000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
そして結果を得ました!
$ ping -W 300 -c 1 172.16.0.2 PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data. 64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=42593 ms --- 172.16.0.2 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 42592.723/42592.723/42592.723/0.000 ms
このテストは Haiku 4.5 で実行され、比較的高速なモデルです。ただし、往復時間(round-trip time)が 45 秒もかかっているため、遅い ping です。他のいくつかのモデルほど遅くはありませんが。
著者: Adam Dunkels, PhD — ハードウェアとソフトウェアの境界領域で複雑な製品を開発する企業を支援しています:サービス