当 Claude 作为用户态 IP 协议栈时,它对 Ping 的响应速度有多快?

Hacker News Top 新闻

摘要

本文介绍了一个有趣的实验:使用 Claude Code 充当用户态 IP 协议栈来处理 ICMP ping 请求,并测量响应延迟。

暂无内容
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 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)

相似文章

@Axel_bitblaze69:Claude code 没有使用限制……是的,你可以通过免费提供商路由……使用这个仓库……每一个 claude code……

X AI KOLs Timeline

# 一个 GitHub 仓库,可将 Claude Code 的 Anthropic API 调用代理到免费或替代提供商 该仓库支持 NVIDIA NIM、OpenRouter、DeepSeek 以及本地模型(Ollama、LM Studio),在保留 Claude Code 界面的同时绕过使用限制。配置仅需约 5 分钟,并支持可选的 Discord/Telegram 机器人封装。