我在大学里做 HTTP 方面的工作,并试图解释当客户端和服务器之间建立 HTTP 连接时会发生什么。为此,我在 Ubuntu 终端上使用“curl -v -i”命令,该命令显示 HTTP 连接的标头。在这种情况下,与服务器的连接是使用 HTTP/1.1 版本建立的。
我想使用最新的资源。首先,我引用了文档 RFC2616,但在这篇博客中(https://www.mnot.net/blog/2014/06/07/rfc2616_is_dead) 中说最新的文档是 RFC 7231。我的问题是:这是真的吗?所有 HTTP/1.1 连接都使用 RFC 7231 规范吗?RFC 7231 是否可能已经被更现代的文档取代了?
非常感谢。
答案1
HTTP/1.1 由 6 个 RFC 正式描述:
- RFC 7230、HTTP/1.1:消息语法路由
- RFC 7231、HTTP/1.1:语义和内容
- RFC 7232、HTTP/1.1:条件请求
- RFC 7233、HTTP/1.1:范围请求
- RFC 7234、HTTP/1.1:缓存
- RFC 7235、HTTP/1.1:身份验证
然而,其中大部分内容都有勘误表。
这些 RFC 当前也正在再次修订由HTTP 工作组的因特网工程任务组并且预计将“很快”被正式化为 RFC,这可能会“取代”这 6 个。
当然还有HTTP/2 RFC但我会忽略这一点,因为你专门讨论的是 HTTP/1.1,而 HTTP/1.1 和 HTTP/2 几乎具有相同的语义。关于这一点HTTP/3也即将“出版”。
此外,还有许多 RFC 通过附加标头等来扩展 HTTP。
正如另一个答案所指出的,许多服务器并没有严格遵循规范,这是因为存在错误,甚至是因为实现者明确决定不遵循。HTTP 是一种丰富、庞大且复杂的协议,与某些计算领域相比,网络一直相当宽容,在这些领域中,一个缺失或不正确的分号就可能停止整个程序。甚至有一条著名的格言叫做 Postel 定律,它指出“做事要保守,接受别人的东西要宽容”。因此,许多实现都接受了严格阅读规范所不允许的消息。不过,关于这个问题,应该指出的是,IETF 已经另一个 RFC 草案认为 Postel 定律(又称“稳健性原则”)是有害的。
答案2
答案3
仅仅因为有新的 RFC 并不意味着客户端和服务器已经更新以实现新的/更改的内容。即使是旧的 RFC 或某个 RFC,客户端和服务器也可能无法完全实现它或使用自己的扩展来实现它。
我建议要么严格遵循 RFC,将其全部以流程图/图表/UML、伪代码等形式呈现,要么确定它在某些较流行的服务器和客户端中是如何实际实现的。由于它们是开源的,因此源代码就是您问题的明确答案。
希望源代码能够很好地注释,不仅指出正在做什么,而且指出为什么要这样做(即,它适用于 RFC 的哪一部分),但这仅是我的典型白日梦。
答案4
截至 2022 年,没有。有一个新的 RFC 系列定义了各种 HTTP 版本及其共享语义。这些是适用于 HTTP/1.1 的版本:
https://www.rfc-editor.org/rfc/rfc9110.html https://www.rfc-editor.org/rfc/rfc9111.html https://www.rfc-editor.org/rfc/rfc9112.html