3月阅读周·HTTP权威指南:集成点之中继篇
【摘要】 引言HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解...
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
集成点:网关、隧道及中继
事实证明,Web是一种强大的内容发布工具。随着时间的流逝,人们已经从只在网上发送静态的在线文档,发展到共享更复杂的资源,比如数据库内容或动态生成的HTML页面。Web浏览器这样的HTTP应用程序为用户提供了一种统一的方式来访问因特网上的内容。
HTTP也已成为应用程序开发者的一种基本构造模块,开发者们可以在HTTP上捎回其他的协议内容(比如,可以将其他协议的流量包裹在HTTP中,用HTTP通过隧道或中继方式将这些流量传过公司的防火墙)。Web上所有的资源都可以使用HTTP协议,而且其他应用程序和应用程序协议也可以利用HTTP来完成它们的任务。
中继
HTTP中继(relay)是没有完全遵循HTTP规范的简单HTTP代理。中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。
HTTP很复杂,所以实现基本的代理功能并对流量进行盲转发,而且不执行任何首部和方法逻辑,有时是很有用的。盲中继很容易实现,所以有时会提供简单的过滤、诊断或内容转换功能。但这种方式可能潜在严重的互操作问题,所以部署的时候要特别小心。
某些简单盲中继实现中存在的一个更常见(也更声名狼藉的)问题是,由于它们无法正确处理Connection首部,所以有潜在的挂起keep-alive连接的可能。
发生的情况如下所述。
- Web客户端向中继发送了一条包含Connection:Keep-Alive首部的报文,如果可能的话要求建立一条keep-alive连接。客户端等待响应,以确定它要求建立keep-alive信道的请求是否被认可了。
- 中继收到了这条HTTP请求,但它并不理解Connection首部,因此会将报文一字不漏地沿着链路传递给服务器。但Connection首部是个逐跳首部;只适用于单条传输链路,是不应该沿着链路传送下去的。要有不好的事情发生了!
- 经过中继转发的HTTP请求抵达Web服务器。当Web服务器收到经过代理转发的Connection:Keep-Alive首部时,会错误地认为中继(对服务器来说,它看起来就和其他客户端一样)要求进行keep-alive的对话!这对Web服务器来说没什么问题——它同意进行keep-alive对话,并在回送了一个Connection: Keep-Alive响应首部。那么,此时,Web服务器就认为它是在与中继进行keep-alive对话,会遵循keep-alive对话的规则。但中继对keep-alive会话根本就一无所知。
- 中继将Web服务器的响应报文,以及来自Web服务器的Connection: Keep-Alive首部一起发回给客户端。客户端看到这个首部,认为中继同意进行keep-alive对话。此时,客户端和服务器都认为它们是在进行keep-alive对话,但与它们进行对话的中继却根本不知道什么keep-alive对话。
- 中继对持久对话一无所知,所以它会将收到的所有数据都转发给客户端,等待原始服务器关闭连接。但原始服务器认为中继要求服务器将连接保持在活跃状态,所以是不会关闭连接的!这样,中继就会挂起,等待连接的关闭。
- 当客户端收到回送的响应报文时,它会直接转向第二条请求,在keep-alive连接上向中继发送另一条请求。简单中继通常不会期待同一条连接上还会有另一条请求到达。浏览器上的圈会不停地转,但没有任何进展。
总结
有一些方法可以使中继稍微智能一些,以消除这些风险,但所有简化的代理都存在着出现互操作性问题的风险。要为某个特定目标构建简单的HTTP中继,一定要特别注意其使用方法。对任何大规模部署来说,都要非常认真地考虑使用真正的、完全遵循HTTP的代理服务器。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)