Skip to content

协议项目:解释字节内容与缺失的响应 ​

实验基线:自有的 Ubuntu Server 24.04 LTS 或 Rocky Linux 9 来宾系统;离线分析和有界回环流量

最后更新:2026 年 9 月 15 日

目的与入门要求 ​

专家级协议调查要把应用层声明关联到一次具体的数据交换,并说明证据无法证明哪些内容。 本练习手册将产出一份探测关联记录、一套 HTTP/TCP 证据包和一份协议边界报告。 这些是原创练习,不是大学评分项目的答案。

请先完成八节入门课程,包括恢复步骤和最后的服务诊断。 你应能区分地址、下一跳、DNS 答案、监听套接字和 HTTP 状态码。 你还需要具备基础 Python 阅读能力、熟悉字节/十六进制表示,并能够比较两个文件。

收集证据前,先阅读以下现有指南:

公开课程材料路线图 ​

资料可用性核对日期为 2026 年 9 月 15 日。 2026 年秋季 CS168 网站仍在建设中。 请按照以下阅读顺序使用可访问的2026 年夏季官方归档;其中的日期属于历史信息。 能够访问课程说明,并不代表已报名、能观看所有录像或能使用学校评分系统。

公开材料阅读目的本文中的原创产物
归档课程 Intro 1–3;CS168 教材中的分层、标头和设计解复用和尽力交付标注每个标头及负责解析它的组件
项目 1 指南和 项目 1A 说明有 TTL 限制的 UDP 探测和被引用的数据包项目 A:将响应与发送记录关联
项目 1B 说明不完整、无关和重复的响应拒绝误导性证据,不虚构中间跳点
归档课程 Routing 1–7;项目 2 说明区分路由状态和转发行为继续学习路由策略与收敛
归档课程 Transport 1–4;项目 3 说明序列空间、接收窗口、重传和定时器项目 B:区分字节流交付、消息成帧和拥塞
归档课程 DNS、HTTP/CDN 和端到端 TLS 阅读资料命名、安全和应用边界项目 C:为每个边界选择所需证据

CS168 项目 3 实现的是不包含拥塞控制的 TCP 子集。 拥塞控制需另外阅读相关课程;通过传输层作业并不能证明生产环境的拥塞控制器有效。 归档环境包含 Python 3.7 测试说明,也混用了不同学期的目录名。 如果选择该可选作业,请遵循其自身设置说明并记录实际下载的修订版本;不要为此降低本练习手册来宾系统的 Python 版本。 该教材自称 beta 版本;具体实现细节应以协议规范为准。

可选后续学习:在你能够分析字节流、资源所有权、构建工具和调试过程后,可学习 C++ 版 CS144。 本次核查时,历史入口 cs144.github.io 不可访问;报告中的 404 不能作为可用的实验前提。 选定学期前,请重新确认 Stanford 官方课程列表和当前说明。 记录实际可访问的起始仓库、许可证、编译器和测试。 本练习手册不保证能免费访问当前仓库/评分系统,也不提供报名渠道。 CS144 不是完成本文的必要条件,本文也不会复制作业的评分实现代码。

工具准备和证据约定 ​

请返回入门课程的来宾工具说明;命令是否可用必须先检查,不能想当然。 只在可随时丢弃的来宾系统内,按照该页指定的软件包预览/安装流程操作。 如果 Rocky 系统现有的 curl-minimal 可用,请继续使用它。

本练习中的用途Ubuntu 软件包/提供程序Rocky 软件包/提供程序本练习是否需要
HTTP 客户端和版本信息现有的 curl现有的 curl-minimal 或 curl是
有界服务器和分析工具python3,版本 3.9+python3,版本 3.9+是
套接字/地址观测iproute2iproute是
抓包及离线解码tcpdumptcpdump获取实测数据包证据时需要
执行时限和哈希coreutilscoreutils是
未来可能使用的探测路径traceroute;入门课程中的 tracepath 是另一种工具traceroute;tracepath 由 iputils 提供否,项目 A 为离线练习
可选 DNS 调查bind9-dnsutilsbind-utils不要求实时 DNS 查询

在来宾系统中,从本仓库的检出目录执行:

bash
command -v python3 curl ip ss timeout sha256sum tcpdump
python3 --version
curl --version
ip -Version
ss -V
tcpdump --version
sha256sum examples/networking/foundations/http_lab.py

记录来宾系统版本、内核、仓库修订版本、辅助程序哈希、工具版本和 curl 功能列表。 curl 缺少 HTTP2/HTTP3 功能,表示客户端能力有限,不代表服务器故障。 启动前检查 ss -ltn 'sport = :18080';如果已有任何监听器,请停止并一致地选择另一个空闲端口。 绝不要终止无关监听器。

每次尝试使用一个独立的证据目录,执行 mkdir -m 700 protocol-evidence-01 创建;如果目录已存在,请换一个新名称。 下方示例假定从仓库根目录使用该名称。 抓包中只能包含本课程生成的合成内容;不需要凭证、Cookie 或真实用户流量。 为每个项目标注 measured、imported、synthetic 或 design-only,并记录时间、观察者、命名空间和抓包过滤器。 提供的文字记录不是在你的来宾系统中测得的结果。

带入每个项目的概念 ​

边界不变量或区别不足以得出结论的证据
IP → 传输层Protocol/Next Header 字段选择下一个解析器单凭 443 端口不能确认使用 HTTPS 或 QUIC
探测 → ICMP 错误错误消息会引用触发它的数据包仅凭外层路由器地址无法识别某次探测
TCP → 应用程序TCP 交付有序字节流send() 或 recv() 的边界不是 HTTP 消息边界
接收方 → 发送方通告的接收窗口限制接收方造成的压力分配的接收缓冲区不是拥塞窗口
网络 → 发送方拥塞控制限制网络路径上的负载单次重传不能定位拥塞发生的位置
应用程序 → 用户HTTP 状态/正文描述应用结果TCP 建立连接不能证明请求的操作成功

有关字节流语义和序列空间,请参阅 TCP RFC 9293。 从窗口角度解释时,允许的有效在途数据量取决于 cwnd 和接收窗口,并需扣除尚未确认的字节。 发送节奏、可用的应用数据和实现细节也会限制发送量。 纯 ACK 不消耗序列空间;SYN 和 FIN 各消耗一个序列位置。

项目 A:建立探测关联记录 ​

目的:解释不完整的路由观测,不要把无关响应当作路由跳点。 环境:纸面练习或本地编辑器;不发送数据包,也不创建路由器。 阅读 CS168 的 traceroute 指南,然后阅读 ICMP RFC 792。 使用路由/ICMP 指南了解其中的 ICMP Echo 探测方式;这与 CS168 的 UDP 方式不同。

创建以下原创的合成发送记录。下方地址是文档示例地址,不是探测目标:

text
run,probe,ttl,src,dst,protocol,sport,dport
paper-01,A,1,192.0.2.10,198.51.100.20,UDP,41000,33451
paper-01,B,2,192.0.2.10,198.51.100.20,UDP,41000,33452
paper-01,C,3,192.0.2.10,198.51.100.20,UDP,41000,33453

将以下内容视为解码后的记录,不是 pcap,也没有实测时间信息:

记录,按接收顺序外层响应被引用的原始数据包处理任务
R1192.0.2.1,ICMP 11/0A 的完整 IPv4 + UDP 标头填写
R2192.0.2.1,ICMP 11/0与 R1 相同的引用内容填写
R3203.0.113.7,ICMP 11/0B 的五元组,但目标地址为 198.51.100.99填写
R4198.51.100.20,ICMP 3/3C 的完整 IPv4 + UDP 标头填写
R5203.0.113.8,ICMP 11/0被引用的 IPv4 标头在 UDP 端口前就结束填写

建立包含 record、candidate_probe、decision、reason、confidence 和 missing_fields 字段的记录表。 分别使用已匹配、重复、无关和证据不足等判定。 不要为了让图上的路径连续而虚构 B 的响应。

然后自行增加三种情况:

  1. 上一次运行的迟到响应,并且两次运行重用了相同端口。
  2. 含选项的有效 IPv4 标头,因此其长度超过 20 字节。
  3. 在声明的观测截止时间之后收到的响应。

说明哪些标识符以及发送/接收时间范围可以区分各情况;还要说明现有引用内容何时不足以区分。 ICMP 引用部分可能太短,无法包含应用随机数;不要依赖拿不到的字节。 如果使用 ICMP Echo 探测,应按被引用的标识符/序列号进行关联,而不是虚构 UDP 端口。

预期观测:A 支持存在一个 TTL 为 1 的响应;与 C 相关联的 Port Unreachable 响应,支持该 UDP 探测已到达目标。 反向观测:R2 不是新的探测结果;R3 不能作为 B 的响应;R5 无法唯一识别一个五元组。 在采集窗口内没有匹配的 B 响应,表示状态未知,即使之后出现了更远的跳点响应也是如此。 这不能证明 B 的路由器丢弃了转发中的应用流量。

traceroute RTT 包含响应返回路径和路由器响应行为的影响。 更换探测端口可能改变 ECMP 路径;一串有响应的地址不证明应用流量只有一条稳定路径。 恢复:保持原始记录不变;如果重新开始,只丢弃自行生成的临时记录表。 完成标准:每项判定都引用被引用数据包的字段或指出具体缺失字段;三个新增情况均有明确的拒绝/不确定性规则。

项目 B:单条 TCP 流上的 HTTP 边界 ​

目的:说明应用长度、TCP 字节和观测到的分段分别回答不同问题。 环境:一台自有来宾系统,客户端/服务器位于 127.0.0.1:18080,不连接外部目标或代理。 仅抓包操作需要 sudo;服务器和客户端均以普通用户身份运行。 仅按以下要求逐一发送请求;总数不超过 10 个,且每个请求正文不超过 4096 字节。

在终端 A 中,从仓库根目录启动现有辅助程序:

bash
python3 examples/networking/foundations/http_lab.py --port 18080 --duration 180

看到监听器出现后,在终端 B 中同样从仓库根目录启动抓包:

bash
sudo timeout --signal=INT --kill-after=2s 20s \
  tcpdump -i lo -p -nn -U -s 512 -c 120 -w - \
  'tcp port 18080' > protocol-evidence-01/http.pcap \
  2> protocol-evidence-01/capture.log

等待日志中出现抓包正在监听的行后,再从终端 C 发送请求。 Shell 会以当前用户身份创建输出文件;tcpdump 会将 pcap 字节写到标准输出。 抓包在达到 120 个数据包或 20 秒时停止;退出状态 124 表示计时器到期,不能据此证明网络故障。 保留退出状态和最终抓包计数。512 字节的 snap length 可能会截断载荷;请记录此限制。

bash
curl --disable --noproxy '*' --max-time 3 --http1.1 -i \
  http://127.0.0.1:18080/lesson
curl --disable --noproxy '*' --max-time 3 --http1.1 -I \
  http://127.0.0.1:18080/lesson
printf 'phase=one\nphase=two\n' | \
  curl --disable --noproxy '*' --max-time 3 --http1.1 -i \
  --data-binary @- http://127.0.0.1:18080/echo
curl --disable --noproxy '*' --max-time 3 --http1.1 -i \
  http://127.0.0.1:18080/missing

Echo 输入为 20 字节,其中包含两个 LF 字符。 在笔记中分别保存每个响应,并找到状态码、Content-Length 和实际内容。 GET /lesson 返回 6 个内容字节;HEAD 描述同一资源表示,但不返回正文。 缺失路径应返回 HTTP 404;未使用 --fail 时,curl 对此 HTTP 错误仍可能成功退出。 这表示 HTTP 通信成功,但资源查询失败。

无需特权即可解码已完成的抓包:

bash
tcpdump -nn -tttt -vv -r protocol-evidence-01/http.pcap \
  'tcp port 18080'
sha256sum protocol-evidence-01/http.pcap

请参考 tcpdump 手册,解释标志、序列号范围和抓包丢弃。 根据通信双方的端点对选择一条连接,并在数据中能够找到时识别 SYN、SYN-ACK、ACK、载荷范围和关闭过程。 不要要求固定的数据包数,也不要假设每个请求对应一个分段;将缺少握手/关闭过程标注为采集范围限制。 关于 HTTP 原始字节规则,请参阅 RFC 9112和 curl 手册。

原创成帧练习,离线完成:设计一种解析器,读取两字节无符号大端长度,再读取相应长度的载荷;最大长度限制为 64 字节。 合成输入为 00 03 63 61 74 00 02 6f 6b;这是自定义协议,不是 HTTP。 跟踪以下数据交付分区:一次交付全部字节;每次交付一个字节;在第一个长度字节后拆分;在正文中间拆分。 记录每次交付后已缓冲字节数、所需字节数和已输出的记录。 增加正文中途 EOF 和长度为 65 两种情况;定义有界失败行为,不要无限等待或进行无界内存分配。 你可以自行实现离线解析器,但填写状态表并覆盖所有情况也符合要求。

原创窗口练习,离线完成:假设 MSS 为 1000 字节、cwnd 为 4 个分段、接收窗口为 9000 字节,且已有 3000 字节在途。 使用 max(0, min(cwnd × MSS, rwnd) − outstanding) 计算额外允许发送的字节数;忽略 pacing,并假设应用有数据可发送。 然后仅将 rwnd 改为 3500 字节重复计算,再将 rwnd 设为 0;指出每种情况下是哪一侧构成限制。 说明接收窗口为零并不能证明网络拥塞,也说明为什么单次重传不能证明接收方资源耗尽。 这些是合成状态快照,并非完整 TCP 发送方的模拟,也不是性能测量结果。

预期观测:在每种完整的数据分区下,都能得到相同的两个逻辑记录;HTTP 回显保留 20 个输入字节。 反向观测:不完整记录不能标记为完整,超长帧也不能被接受。 按照上述简化模型,这些窗口快照分别允许额外发送 1000、500 和 0 字节;负数额度应截断为零。 观测到的出站校验和错误可能来自卸载功能;抓包丢弃不能自动视为网络路径丢包。 恢复:只用 Ctrl+C 停止自己在前台运行的辅助程序,或等待其 180 秒计时器到期;抓包另有自身时限。 重新检查监听器过滤结果。保留证据;如要丢弃,只删除明确指定的文件/目录。

项目 C:证明边界,而不是只看端口号 ​

目的:规划最少需要哪些证据,才能区分名称解析、传输、安全和应用故障。 环境:使用已有自有跟踪记录撰写离线报告;不要求探测公共网站。

情况应请求的证据应避免的错误结论
DNS 返回 A 记录;TCP 连接失败解析结果、选定地址、连接错误和端点抓包“DNS 成功证明服务可用”
存在 AAAA 记录,但来宾系统没有可用 IPv6 路由地址族对应的路由/地址状态及客户端选择情况“有 IPv6 DNS 答案就证明 IPv6 可达”
TCP 连接成功;TLS 证书验证失败预期主机名、信任/验证错误和 TLS 端点身份“禁用证书验证就能证明恢复成功”
HTTPS 请求协商使用 HTTP/1.1客户端功能及协商出的 HTTP 版本“443 端口或 --http2 能证明使用了 HTTP/2”
HTTP/2 在一个 TCP 连接上承载多个流流 ID 以及连接/传输层丢包证据“多路复用消除了 TCP 队头阻塞”
怀疑使用 HTTP/3来自端点的 QUIC/版本和应用协商证据“每个 UDP/443 数据包都是 HTTP/3”

阅读 HTTP/2 RFC 9113、QUIC RFC 9000和 HTTP/3 RFC 9114。 HTTP/2 在 TCP 上复用应用流;缺失的 TCP 字节可能延迟这些流的数据交付。 QUIC 在 UDP 之上提供流、可靠性和拥塞控制,并整合 TLS;HTTP/3 将 HTTP 映射到 QUIC 上。 影响某个 QUIC 流的丢包不一定会阻塞其他流的交付,但共享的拥塞限制和应用依赖仍然存在。 被动加密抓包通常无法提供 HTTP 内容;端点的明文日志属于另一个观测位置。

针对每种情况画出相关边界,并写明一项肯定结论、一项否定结论和一项下一步观测。 说明 curl 的 --resolve 如何在保留用于 TLS 的 URL 主机名时单独测试地址选择,但不能声称它测试了 DNS。 区分 --http3 的回退行为和 --http3-only;设计测试前先确认本地客户端支持情况。 项目 B 中仅支持 IPv4 的辅助程序,不会因为更改客户端标志就变成 IPv6/TLS/HTTP2 服务器。

使用 IPv6 RFC 8200和 ICMPv6 RFC 4443在纸面上扩展项目 A。 将 TTL 替换为 Hop Limit,将 IPv4 标头长度解析替换为 IPv6/扩展标头解析,并将 IPv4 ICMP 类型替换为 ICMPv6 类型。 IPv6 路由器不会对转发的数据包进行分片;Packet Too Big 证据与 Time Exceeded 的作用不同。 在记录表中包含地址族和作用域;IPv6 邻居发现并非 ARP。

预期观测:报告能够区分应用已验证响应、网络可达性和客户端能力。 反向观测:不支持的工具和缺少的跟踪记录都应标记为不可用,不能说成远程协议测量失败。 恢复:不更改运行时状态;保留导入证据的原始内容及其来源信息。

完成与作品集交接 ​

  • [ ] 记录阅读资料 URL/学期、访问日期、来宾系统/工具版本及辅助程序修订版本/哈希。
  • [ ] 解释项目 A 的五条记录和新增的三种情况,不要虚构缺失跳点。
  • [ ] 保留实测 HTTP 证据,包括状态码、内容长度、单条 TCP 连接及抓包限制。
  • [ ] 展示成帧对数据分区不敏感,并覆盖格式错误/不完整的两种否定情况。
  • [ ] 解释接收流量控制与拥塞控制的区别,并说明为何此小型负载不能作为任何一方的基准测试。
  • [ ] 完成全部六种边界情况和 IPv6 扩展。
  • [ ] 展示监听器/抓包已终止,并指出仍未完成的观测。
  • [ ] 完成测验,并解释哪些备选结论不成立。

如果没有抓包权限,请完成离线练习,并将数据包采集标注为待处理。 导入的抓包可用于分析,但不能冒充为新近复现的实验。 作品集用于证明观测和故障推理能力;它不是证书,也不能证明你掌握所有协议细节。

返回专家课程路线图,继续学习路由,或通过 Linux 性能深入了解主机证据。 将这套证据约定延续到自动化综合练习。

向文档提问

按 Enter 发送,按 Shift+Enter 换行。