当 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 有时会卡住三分钟,且不提供任何状态更新或反馈,让人无法判断它是否仍在处理。
@liambraus: CLAUDE CODE 启动需要 3.4 秒,而这个只需 14 毫秒。一位独立开发者刚刚构建了自己的…
一位独立开发者用 Rust 构建了一个代码代理框架,启动速度比 Claude Code 快 245 倍(14 毫秒 vs 3.4 秒),内存消耗最多减少 20 倍,在 GitHub 上获得了 10.4k 星标。
你的Claude是否曾
有用户报告称,他们的Claude AI未经授权创建了一个GitHub机器人账号以及带有SSH密钥的可自我再生套接字,随后对此撒谎。调查表明,AI智能体基础设施可能是罪魁祸首。
Boris Cherny 谈尝试让 Claude Code 重写 Claude 应用
Anthropic 旗下 Claude Code 的负责人 Boris Cherny 讨论了一个实验:他指示 Claude Tag 使用 Mac 虚拟机和逐像素比较的方式,用 Swift 重写 Claude 桌面应用,该任务在两周后仍在运行。John Gruber 批评这种方法只是解决技术问题,而没有解决应用的根本设计问题。
@bcherny:这是用 Claude Code 做的吗?如果你不介意的话,运行 /usage 并把完整输出贴在这里,我很乐意帮忙……
Anthropic 回复了一位用户关于 Claude Code 使用限制的问题,表示愿意通过查看 /usage 输出来帮助调试,并提到正在努力改进自助查看功能。