返回 Webship 博客

Webship 工程

Webship:世界上最符合 RFC 的网页服务器

Webship 将 RFC 要求转化为在 HTTP/1.1、HTTP/2、HTTP/3、QUIC、TLS、缓存、反向代理、WebTransport、ACME 和新的 QUERY 方法中的明确行为。探索完整的 52 个 RFC 标准地图。

网络是通过精确的协议维系的。Content-Length 字段在每一个节点必须具有相同的意义。缓存不得重用需要验证的响应。格式错误的 HTTP/3 字段部分必须在正确的范围内失败。安全方法在通过反向代理后必须保持安全。

Webship 1.3.1 的核心原则是:速度只有在字节保持其意义时才算数。

这就是为什么我们将 Webship 描述为世界上与 RFC 最兼容的通用 Web 服务器。这是一个具有可见边界的工程声明,而不是声称每个 RFC 中的每个可选功能都存在。下图列出了影响 Webship 的活动服务器行为或其自有协议基础的 52 个 RFC。目前的标准优先显示。被取代的文档被标识为兼容性血统。草稿规范不会重新标注为 RFC。

兼容性是行为,不是徽章

Webship 在生产服务器最容易出现歧义的地方应用标准:

  • HTTP/1.1 帧处理会拒绝冲突的长度、无效的传输编码、超大的请求目标、格式错误的分块以及请求走私形态。
  • HTTP/2 和 HTTP/3 拒绝禁止的连接字段,验证伪字段,限制压缩字段部分,并将流错误与连接错误分开。
  • 静态文件保留 HEAD 语义、验证器、前置条件顺序、字节范围、重定向和内容类型。
  • 反向代理在剥离逐跳字段的同时,保留了框架、取消、尾随信息、升级、安全重试和转发身份。
  • 缓存计算年龄、新鲜度、重新验证、Vary、失效和过期使用规则,而不是将缓存视为键值快捷方式。
  • TLS、QUIC、ACME、早期数据和 WebTransport 使用有界状态和明确的失败策略。

快速路径上也适用相同的规则。Webship 并没有定义一个“正确”的路径和一个不同的基准路径。

HTTP 语义、分帧、缓存和代理

  • RFC 3986 — 统一资源标识符 (URI):通用语法。Webship 在缓存失效决策之前,会规范化相对的 Location 和 Content-Location 引用,包括点段。
  • RFC 6455 — WebSocket 协议。反向代理升级会验证 WebSocket 密钥、接受的值、子协议、扩展以及隧道转换。
  • RFC 6585 — 补充 HTTP 状态码。对于超大的请求字段,使用定义的 431 响应,当 HTTP 响应仍然可能时。
  • RFC 6797 — HTTP 严格传输安全。Strict-Transport-Security 仅在安全传输中发送,并且绝不会从传输中立的缓存条目泄露到明文 HTTP。
  • RFC 7235 — HTTP/1.1 身份验证。身份验证方案令牌是大小写不敏感解析的,包括受保护的 MCP 控制面。其通用 HTTP 语义现在位于 RFC 9110 中。
  • [RFC 7239 — 转发的 HTTP 扩展](https://www.rfc-editor.org/rfc/rfc7239.html)。操作员可以选择基于标准的转发字段、遗留的 X-Forwarded 字段、两者皆可选择,或两者皆不选择;不可信的入站身份字段会优先移除。
  • RFC 7540 — HTTP/2。这被保留为 HTTP/2 兼容性沿袭;活跃的 HTTP/2 协议是其继任者 RFC 9113。
  • RFC 7541 — HPACK:用于 HTTP/2 的头部压缩。Webship 拥有的 HTTP/2 栈在保持 HPACK 传输格式和哈夫曼编码的同时,对解码器状态和编码器表进行限制。
  • RFC 7838 — HTTP 替代服务。Alt-Svc 宣告一个 HTTP/3 端点而不改变 URL 所表示的源。
  • RFC 8441 — 使用 HTTP/2 引导 WebSockets。Webship 支持下游的扩展 CONNECT 协商基础。它不会假装 HTTP/1.1 上游实现了 HTTP/2 扩展 CONNECT;不支持的上游组合会明确失败。
  • RFC 8470 — 在 HTTP 中使用早期数据。Webship 不会处理的早期请求将收到 425 Too Early,而不是在不安全重放假设下处理。
  • RFC 8941 — HTTP 的结构化字段值。HTTP 优先级值使用结构化字段字典解析;格式错误的可选字段将被整体忽略。
  • RFC 9110 — HTTP 语义。方法、状态码、字段、验证器、前置条件、重定向、内容元数据、HEAD、CONNECT、OPTIONS 以及范围语义在各协议版本中共享一个当前契约。
  • RFC 9111 — HTTP 缓存。Webship 实现了修正年龄、显式新鲜度、Vary、only-if-cached、must-revalidate、proxy-revalidate、安全过期使用,以及有效和相关 URI 的失效处理。
  • RFC 9112 — HTTP/1.1。请求行、字段、主体长度、传输编码、块、尾部、持续连接和关闭定界规则在应用分发之前执行。
  • RFC 9113 — HTTP/2。伪字段顺序、authority、禁止的连接字段、TE 限制、流生命周期、流量控制、GOAWAY 和错误范围由 Webship 自有的 H2 路径处理。
  • RFC 9114 — HTTP/3。Webship 拥有其 HTTP/3 服务器使用的请求、控制流、SETTINGS、关键流、取消以及流与连接错误路径。
  • RFC 9204 — QPACK: 用于 HTTP/3 的字段压缩。动态表的容量受广告限制的约束,指令流在零容量下仍然可解析,无效状态将成为所需的 QPACK 错误。
  • RFC 9218 — HTTP 可扩展优先级方案。紧急性和增量交付指导 HTTP/3 调度,同时未知的优先级参数保持可扩展性。
  • RFC 9220 — 使用 HTTP/3 启动 WebSockets。Webship 实现了现代隧道协议使用的 HTTP/3 扩展 CONNECT SETTINGS 基础;这并不意味着接受所有可能的 CONNECT 协议。
  • RFC 9297 — HTTP 数据报和胶囊协议。WebTransport 会话使用有边界的胶囊解码和 HTTP 数据报关联,未知胶囊作为扩展点处理,而不是解析器失败。
  • RFC 9421 — HTTP 消息签名。可选的 Ed25519 响应来源证明可以覆盖 Webship 发布和配置身份,而无需替代 TLS 或应用程序认证。
  • RFC 10008 — HTTP QUERY 方法。Webship 将 QUERY 视为安全且幂等,通过代理保留其主体,在缓存标识中包括主体和表示元数据,禁止启发式新鲜度,支持条件和范围行为,并且从不仅因为使用了 QUERY 就使缓存失效。

QUIC 传输和拥塞控制

TLS、证书以及自动证书管理

WebTransport:关于标准化的具体内容

通过 HTTP/3 的 WebTransport 不被计为第五十三号 RFC。截至 Webship 1.3.1,其传输映射仍然是 draft-ietf-webtrans-http3-16。Webship 在标准化的 HTTP/3、扩展 CONNECT、QUIC DATAGRAM、HTTP Datagram 以及上述命名的 Capsule 层上实现了该草案。它还实现了协商的 RESET_STREAM_AT 扩展,以在 WebTransport 流被重置时保持可靠的会话标识前缀。

这种区别很重要。仅仅将草案称为 RFC 并不会提高标准的兼容性。提高标准兼容性的方法是明确跟踪草案,将其与普通 HTTP 路径隔离,协商每一个扩展,限制每一个会话资源,并测试取消和失败行为。

为什么这一广度在生产中很重要

标准漏洞很少是孤立的。错误的 HSTS 处理可能跨越缓存边界。格式错误的 QPACK 指令可能终止无关的请求。一个不安全的早期数据假设可能会重放操作。省略请求正文的 QUERY 缓存键可能返回不同查询的结果。剥离尾部或错误处理取消的代理可能会悄悄更改应用协议。

Webship 的架构将这些视为相关的关注点。解析器限制、安全检查、缓存、反向代理、传输状态和监控共享明确的协议。其结果是一个服务器可以在 HTTP/1.1、HTTP/2、HTTP/3、静态交付、反向代理、流媒体和 WebTransport 之间切换,而无需为每种模式给出不同的正确性定义。

核实该声明

不要轻信夸张的说法。阅读 [Webship 1.3.1 文档](/docs/1.3.1),检查配置和协议边界,并重现已发布的行为。然后 [下载 Webship](/downloads) 并测试对你的系统重要的边缘情况。