HTTP是一套用于请求网络资源(例如HTML文档)的协议。它规范了在Web页面上,客户端与服务器之间的数据交换,这个客户端通常是浏览器。一份完整的文档通常来自多个资源,如文本内容、布局规则、图片、视频、声音、脚本等等。
客户端与服务器之间通过个人消息交换进行通信,客户端发出的消息被成为请求(Request),服务器发出的应答被成为响应(Response)。
自1990年代早期,HTTP作为一套可扩展的协议逐步发展至今。它是一种应用层协议,依赖TCP、TLS或任何理论上可用的可靠传输协议。基于其可扩展性,HTTP协议不止用于获取超文本文档,还可以用于图片和视频,或者提交内容到服务器,比如HTTP表单。HTTP协议也可以在需要时获取文档的局部来更新页面。
HTTP是客户端/服务器协议。发送请求的实体被称为用户代理(User-Agent或ua),大多数情况下用户代理是网页浏览器,但其实它可以是任何东西,比如用于维护搜索引擎索引的爬虫机器人。
每当个人请求发送到服务器,服务器会处理它并返回响应。在客户端和服务器之间还有若干实体,它们被称为代理服务器,代理服务器起到不同的作用,比如网关或缓存。
事实上,在浏览器与服务器之间存在更多的计算机在处理请求,如路由器、调制解调器等等。由于网络的分层设计,它们被隐藏在了网络层和传输层,而HTTP在顶部的应用层。尽管底层协议对于诊断网络问题很重要,但与 HTTP 的描述大多无关。
通信通道的另一端是服务器,它根据客户端的请求提供文档。服务器在直觉上是一台单一的机器,但是实际上它可能是一组共享负载(负责均衡)的服务器,或其他软件(如缓存、数据库、或电子商务服务器),它们根据需要生成完整或局部的文档。
服务器也许不是一个唯一的机器,但多个服务软件实例可以运行在同一个机器上。通过HTTP/1.1和Host头,这些实例甚至可以共享同一个IP地址。
在浏览器和服务器之间,大量计算机和机器转发着HTTP消息。由于网络传输的分层模型,它们中的大多数在传输、网络和物理层面运行,这使它们对HTTP所在的层透明,但可能对性能产生重大影响。而那些工作在应用层的通常称为代理服务器。这些代理服务器可以是透明的——不做任何更改地转发它们收到的请求,也可以是不透明的——以某种方式修改请求后再传递给服务器。代理服务器可以具备很多功能:
HTTP被设计为精简的人类可阅读的,即使HTTP/2将HTTP消息封装到帧中增加了复杂性。HTTP消息可以被人类阅读并理解,使开发人员更容易进行调试,同时降低了对于新手的复杂性。
无状态意味着在同一连接上连续执行的两个请求之间没有联系。着会给试图与某些页面进行连贯交互的用户带来问题,例如电子商务。但是HTTP的核心是无状态的,但HTTP cookies允许使用有状态会话。利用消息头的可扩展性,HTTP cookies被添加到工作流程中,允许在每个HTTP请求上创建会话以共享相同的上下文或相同的状态。
连接由传输层控制,因此从根本上来说超出了 HTTP 的范围。HTTP 不要求底层传输协议基于连接;它只要求它可靠,或者不丢失消息(至少在这种情况下会出现错误)。在互联网上最常见的两种传输协议中,TCP 是可靠的,而 UDP 则不可靠。因此,HTTP 依赖于基于连接的 TCP 标准。
在客户端和服务器交换 HTTP 请求/响应对之前,它们必须建立 TCP 连接,这个过程需要多次往返。HTTP/1.0 的默认行为是为每个 HTTP 请求/响应对打开一个单独的 TCP 连接。当多个请求连续发送时,这比共享单个 TCP 连接效率低。
为了减轻这个缺陷,HTTP/1.1引入了管道(事实证明很难实现)和持久连接:可以使用Connection消息头部分控制底层TCP连接。 HTTP/2 更进一步,通过单个连接复用消息,帮助保持连接热度且更高效。
目前正在进行实验,以设计更适合 HTTP 的更好的传输协议。例如,Google 正在试验基于 UDP 的 QUIC,以提供更可靠、更高效的传输协议。
随着时间的推移,HTTP 的这种可扩展性使 Web 的控制和功能更加强大。缓存和身份验证方法是 HTTP 早期处理的功能。相比之下,放宽来源约束的能力直到 2010 年代才被添加。
以下是可使用 HTTP 控制的常见功能列表:
当一个客户端想要和服务器通信,不论是终端服务器还是中间代理服务器,都要执行一下步骤:
1. 打开一个TCP连接:TCP连接用于发送一个或多个请求,并接收应答。客户端可以打开一个新连接、复用一个已经建立的连接、或打开数个TCP连接到服务器。
2. 发送一个HTTP消息:HTTP消息(在HTTP/2之前)是可阅读的。在HTTP/2里,这些简单的消息被封装到了帧里,使得它们无法被直接阅读,但是原理还是一样的。例如:
3. 读取服务器发送的响应。例如:
4. 关闭连接或重用连接发送其他请求
在HTTP/1.1及以前,HTTP消息是可读的。在HTTP/2中,这些消息被嵌入到一个二进制结构(帧)中,从而允许进行诸如头压缩和多路复用之类的优化。即使在此版本的HTTP中仅发送原始HTTP消息的一部分,每条消息的语义也不会改变,客户端会(虚拟的)重新构造原始的HTTP/1.1请求。因此这对于理解使用HTTP/1.1格式的HTTP/2消息很有用。
有两种HTTP消息,请求和响应,它们都有自己的格式。
请求包含以下内容:
响应包含以下内容:
Web前端最常用的基于HTTP的API是Fetch API,可以通过JavaScript构造HTTP请求。Fetch API取代了XMLHttpRequest API。
另一个 API,即服务器发送事件,是一种单向服务,允许服务器使用 HTTP 作为传输机制将事件发送到客户端。使用 EventSource 接口,客户端打开连接并建立事件处理程序。客户端浏览器会自动将到达 HTTP 流的消息转换为适当的 Event 对象。然后,如果已知事件类型,它会将它们传递给已注册的事件处理程序,或者如果未建立特定于类型的事件处理程序,则将它们传递给 onmessage 事件处理程序。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/42852.html