当 Claude 作为用户态 IP 协议栈时,它对 Ping 的响应速度有多快?
摘要
本文介绍了一个有趣的实验:使用 Claude Code 充当用户态 IP 协议栈来处理 ICMP ping 请求,并测量响应延迟。
暂无内容
查看缓存全文
缓存时间: 2026/05/11 03:47
# Claude 作为用户态 IP 栈响应 Ping 的速度有多快?
来源:https://dunkels.com/adam/claude-user-space-ip-stack-ping/
这里有一个有趣的想法:如果我们让 Claude Code 充当用户态 IP 栈,它能多快响应 Ping?也就是说,我们指示 Claude 逐字节读取 IP 数据包,并像正常的 IP 栈那样处理它们。最终结果是,我们可以 Ping Claude,并让它用格式正确的 Ping 回复回应我们。
荒谬吗?是的。浪费 Token 吗?当然。有趣吗?太有趣了!
我要求 Claude 开发一个名为 `ping-respond.md` 的命令,使其充当这种原生 LLM IP 栈,以下是它生成的内容:
ping-respond.md(点击展开)
```markdown
# Ping Respond — 从 tun0 处理一个 ICMP 回显请求
你正在充当用户态 IP 栈。TUN 辅助程序已经以 FIFO 模式运行(`sudo python3 scripts/tun_helper.py --fifo`)。你的任务:读取一个数据包,解析它,构造一个有效的 ICMP 回显回复,并将其写回。所有的 IP 逻辑都在你的推理中完成——不使用库,也不使用脚本。
## 第 1 步:读取数据包
运行以下 bash 命令从 TUN 设备读取一个数据包:
echo "READ" > /tmp/tun_cmd && timeout 35 cat /tmp/tun_resp
你将收到一个十六进制字符串(或“TIMEOUT”)。如果出现 TIMEOUT,请报告并停止。保存十六进制字符串——这是原始的 IPv4 数据包。
## 第 2 步:解析 IPv4 头部
数据包是一系列十六进制字节(2 个十六进制字符 = 1 字节)。解析以下字段:
| 偏移量(字节) | 长度 | 字段 |
| -------------- | ------ | --------------------------------------------------------- |
| 0 | 1 | 版本(高 4 位)+ IHL(低 4 位,以 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+ | 可变 | 负载(原样复制) |
如果类型不是 0x08,报告“不是回显请求,忽略”并停止。
## 第 4 步:构造回显回复
通过修改特定字段来构建回复数据包。全程使用十六进制运算。
### 4a: 回复的 IP 头部
从原始 IP 头部字节开始,更改:
- **第 8 字节 (TTL):** 设置为 `40`(十进制 64)
- **第 10–11 字节(头部校验和):** 暂时设置为 `0000`
- **第 12–15 字节(源 IP):** 设置为原始的**目的** IP
- **第 16–19 字节(目的 IP):** 设置为原始的**源** IP
现在计算 IP 头部校验和:
1. 取校验和字段为 0000 的 IP 头部(IHL×4 字节)
2. 拆分为 16 位字(每 2 字节一个字)
3. 将所有字作为无符号整数求和
4. 当和超过 0xFFFF 时:将进位(sum >> 16)加到低 16 位(sum & 0xFFFF)
5. 取反码:result = 0xFFFF - folded_sum
6. 将该值写入第 10–11 字节(大端序)
### 4b: 回复的 ICMP 负载
从原始 ICMP 数据(从 ICMP 起始处到数据包末尾)开始,更改:
- **第 0 字节(类型):** 设置为 `00`(回显回复)
- **第 1 字节(代码):** 保持 `00`
- **第 2–3 字节(ICMP 校验和):** 暂时设置为 `0000`
- **第 4+ 字节(标识符、序列、负载):** 保持不变
现在使用与 IP 校验和相同的算法计算 ICMP 校验和:
1. 取校验和字段为 0000 的整个 ICMP 消息(从类型到负载末尾)
2. 拆分为 16 位字。如果字节数为奇数,仅在计算校验和时在末尾填充一个零字节。
3. 将所有字作为无符号整数求和
4. 折叠进位:当 sum > 0xFFFF 时,执行 sum = (sum >> 16) + (sum & 0xFFFF)
5. 取反码:result = 0xFFFF - folded_sum
6. 如果结果为 0x0000,则使用 0xFFFF
7. 写入 ICMP 的第 2–3 字节(大端序)
### 4c: 组装回复
连接:IP 头部(带有正确的校验和)+ ICMP 消息(带有正确的校验和)
## 第 5 步:写入回复
使用你组装的十六进制字符串运行此 bash 命令:
echo "WRITE " > /tmp/tun_cmd && timeout 5 cat /tmp/tun_resp
你应该收到“OK”作为返回。
## 第 6 步:报告
打印摘要:
- 源 IP → 目的 IP
- ICMP 回显请求序列号
- 数据包大小(请求和回复)
- “回复发送成功”或任何错误
## 重要规则
- 自行完成所有算术运算。不要使用 Python、bc 或任何计算器工具。
- 显示校验和计算过程,以便调试错误。
- 你生成的每个十六进制值都必须具有正确的位数(用前导零填充)。
- 如果任何内容看起来不正确(版本错误、意外协议等),请报告并停止,而不是发送格式错误的数据包。
```
该命令从 `/dev/tun0` 设备读取字节,使用一个简单的 Python 辅助程序来设置正确的 `stty` 选项,然后计算 IP 校验和。如果它看到 ICMP 回显消息,它就会以 ICMP 回显回复消息响应,所有校验和都正确计算。
运行此命令后,Claude 会输出类似以下内容:
```
Received packet: 45000054812840004001615dac100001ac100002080054f5000d0001a1fb006a0000000041c4000000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
Parsing the IP header (first 40 hex chars = 20 bytes):
- 45 → version=4, IHL=5 (20 bytes)
- 0054 → total length = 84
- TTL=40 (64), Protocol=01 (ICMP)
- Source: ac100001 = 172.16.0.1
- Dest: ac100002 = 172.16.0.2
ICMP: type=08 (echo request), code=00, id=000d, seq=0001
Now constructing the reply. IP header: swap src/dst, TTL=64, recompute checksum. ICMP: type=00 (echo reply), recompute checksum.
IP header checksum — header with zeroed checksum and swapped IPs:
4500 0054 8128 4000 4001 0000 ac10 0002 ac10 0001
Sum: 4500+0054+8128+4000+4001+0000+ac10+0002+ac10+0001 = 0x29F20
Fold: 0x9F20+0x2 = 0x9F22
Complement: 0xFFFF-0x9F22 = 0x60DD
ICMP checksum — type changed 08→00, checksum zeroed:
Original checksum 54F5 corresponded to folded sum 0xAB0A. Changing type 08→00 reduces sum by 0x0800: 0xAB0A-0x0800 = 0xA30A. Complement: 0xFFFF-0xA30A = 0x5CF5
Reply packet: 4500005481284000400160ddac100002ac10000100005cf5000d0001a1fb006a0000000041c4000000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
```
我们得到了结果!
```bash
$ 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,这是一个相当快的模型。但是,往返时间为 45 秒,这算是一个缓慢的 Ping。不过还没有这些(https://blug.linux.no/rfc1149/writeup/)那么慢。
Adam Dunkels, PhD
##### 由 Adam Dunkels, PhD 撰写
帮助公司在硬件和软件的交叉领域构建复杂产品:服务 (https://dunkels.com/adam/consulting.html)
相似文章
@petergyang: 有时候我给 Claude Code 发消息时,它会卡住 3 分钟,我根本不知道它是否还在运行。……
有用户反映,Claude Code 有时会卡住三分钟,且不提供任何状态更新或反馈,让人无法判断它是否仍在处理。
@HoodyLiu: Claude Code 改代码的那几分钟你们会干点什么?
This post asks the community what they do while waiting for Claude Code to modify their codebase, highlighting the latency of AI coding assistants.
@Axel_bitblaze69:Claude code 没有使用限制……是的,你可以通过免费提供商路由……使用这个仓库……每一个 claude code……
# 一个 GitHub 仓库,可将 Claude Code 的 Anthropic API 调用代理到免费或替代提供商 该仓库支持 NVIDIA NIM、OpenRouter、DeepSeek 以及本地模型(Ollama、LM Studio),在保留 Claude Code 界面的同时绕过使用限制。配置仅需约 5 分钟,并支持可选的 Discord/Telegram 机器人封装。
Claude 更高用量限制及与 SpaceX 的计算资源合作(3 分钟阅读)
Anthropic 宣布与 SpaceX 达成合作,接入 Colossus 1 数据中心的庞大计算能力,从而提升 Claude Code 和 Claude API 的用量限制。
@abhishekray:推出 Opslane,在真实浏览器中测试你的 Claude 代码改动 灵感来自 @garrytan 的 GStack /qa 技能。——读取规…
Opslane 是一款新工具,让开发者能在真实浏览器中测试 Claude 生成的代码改动:读取需求文档、构建验收标准,并针对本地开发服务器运行测试。