Overview

优质
小牛编辑
133浏览
2023-12-01

HTTP是一种允许获取资源的协议,例如HTML文档。它是Web上的任何数据交换和客户端 - 服务器协议的基础,这意味着请求由接收者(通常是Web浏览器)发起。一个完整的文档是根据不同的子文档重新获得的,例如文本,布局描述,图像,视频,脚本等等。

客户和服务器通过交换单个消息进行通信(而不是数据流)。客户端发送的消息(通常是Web浏览器)称为请求,而服务器发送的作为答案的消息称为响应

HTTP是在20世纪90年代初期设计的,它是一种随着时间推移而发展的可扩展协议。它是通过TCP或通过TLS加密的TCP连接发送的应用层协议,但理论上可以使用任何可靠的传输协议。由于其可扩展性,它不仅用于提取超文本文档,还用于图像和视频或将内容发布到服务器,例如HTML格式的结果。HTTP还可用于获取部分文档以按需更新网页。

基于HTTP的系统的组件

HTTP是一种客户端 - 服务器协议:请求由一个实体,用户代理(或代表它的代理)发送。大多数情况下,用户代理是一个Web浏览器,但它可以是任何东西,例如抓取Web以填充和维护搜索引擎索引的机器人。

每个单独的请求被发送到一个服务器,它将处理它并提供一个称为响应的答案。例如,在这个请求和响应之间有许多实体,总称为代理,它们执行不同的操作并充当网关或高速缓存。

实际上,在浏览器和处理请求的服务器之间有更多的计算机:有路由器,调制解调器等等。由于Web的分层设计,这些隐藏在网络层和传输层中。HTTP在应用程序层处于顶层。尽管诊断网络问题很重要,但底层与HTTP描述无关。

Client: the user-agent

所述用户代理是作用于用户的代表任何工具。这个角色主要由Web浏览器执行; 一些例外情况是工程师使用的程序和Web开发人员调试其应用程序。

浏览器始终是发起请求的实体。它永远不是服务器(尽管多年来添加了一些机制来模拟服务器启动的消息)。

为了呈现网页,浏览器发送原始请求以从页面获取HTML文档。然后解析该文件,获取与执行脚本相对应的其他请求,要显示的布局信息(CSS)以及页面中包含的子资源(通常为图像和视频)。Web浏览器然后混合这些资源以向用户呈现完整的文档,网页。浏览器执行的脚本可以在以后阶段获取更多资源,浏览器会相应地更新网页。

网页是超文本文件。这意味着显示文本的某些部分是可以被激活的链接(通常通过点击鼠标)来获取新的网页,允许用户指导他们的用户代理并通过网络进行导航。浏览器在HTTP请求中转换这些方向,并进一步解释HTTP响应以向用户提供明确的响应。

Web服务器

在通信通道的另一侧,是服务器,它按照客户的要求提供文档。一台服务器虚拟出现的只是一台机器:这是因为它实际上可能是一组服务器,共享负载(负载平衡)或一个复杂的软件,询问其他计算机(如缓存,数据库服务器,电子商务服务器,...),完全或部分按需生成文档。

服务器不一定是一台机器,但可以在同一台机器上托管多台服务器。使用HTTP / 1.1和Host头部,他们甚至可以共享相同的IP地址。

代理

在Web浏览器和服务器之间,许多计算机和机器都会转发HTTP消息。由于Web堆栈的分层结构,其中大多数可以在传输层,网络层或物理层进行操作,在HTTP层变得透明,并可能对性能产生重大影响。那些在应用层操作的通常称为代理。这些可以是透明的,也可以不是(改变请求不通过它们),并且可以执行许多功能:

  • caching (the cache can be public or private, like the browser cache)
  • filtering (like an antivirus scan, parental controls, …)
  • load balancing (to allow multiple servers to serve the different requests)
  • authentication (to control access to different resources)
  • logging (allowing the storage of historical information)

HTTP的基本方面

HTTP很简单

即使在HTTP / 2中通过将HTTP消息封装到帧中而引入更复杂的情况下,HTTP通常被设计为简单且可读的。HTTP消息可以被人阅读和理解,提供更简单的开发人员测试,并降低新手的复杂度。

HTTP是可扩展的

在HTTP/1.0中引入HTTP头使得该协议易于扩展和实验。新功能甚至可以通过客户端和服务器之间关于新头的语义的简单协议来引入。

HTTP是无状态的,但不是无时间的

HTTP是无状态的:两个请求之间没有连续的连接。这对于尝试连贯地与某些页面进行交互的用户(例如,使用电子商务购物篮)来说可能会产生问题。但HTTP本身的核心是无状态的,HTTP cookie允许使用有状态会话。使用头可扩展性,HTTP Cookies被添加到工作流中,允许在每个HTTP请求上创建会话以共享相同的上下文或相同的状态。

HTTP和连接

连接在传输层进行控制,因此基本上超出了HTTP的范围。虽然HTTP不需要基础传输协议是基于连接的; 只要求它是可靠的,或不会丢失消息(所以至少出现错误)。在互联网上最常见的两种传输协议中,TCP是可靠的,而UDP不是。HTTP随后依赖基于连接的TCP标准,即使不总是需要连接。

HTTP/1.0为每个请求/响应交换打开了一个TCP连接,引入了两个主要缺陷:打开连接需要几次往返消息,因此速度较慢,但在发送多条消息时变得更高效,并定期发送:连接比的更有效率。

为了减轻这些缺陷,HTTP / 1.1引入了流水线(难以实现)和持久连接:底层TCP连接可以使用Connection头部分进行部分控制。通过在单个连接上复用消息,HTTP / 2更进一步,帮助保持连接温暖,并且更高效。

正在进行实验来设计更适合HTTP的更好的传输协议。例如,Google正在试验基于UDP的QUIC,以提供更可靠和更高效的传输协议。

什么可以被HTTP控制

随着时间的推移,HTTP的这种可扩展性使得Web可以实现更多的控制和功能。缓存或身份验证方法是在HTTP历史记录中早期处理的函数 相比之下,放松原产地限制的能力仅在2010年才增加。

这里列出了可以用HTTP控制的常用功能。

  • 缓存

如何缓存文档可以通过HTTP进行控制。服务器可以指示代理和客户端,缓存的内容和时间。客户端可以指示中间缓存代理忽略存储的文档。

  • 放宽原点约束

为防止窥探和其他隐私入侵,Web浏览器强制严格分离网站。只有来自同一来源的页面才能访问网页的所有信息。虽然这样的约束对服务器来说是一种负担,但HTTP头可以放宽服务器端的严格分离,从而使文档成为来自不同域的信息的拼凑体(甚至可能存在与安全相关的原因)。

  • 身份验证

某些页面可能受到保护,因此只有特定用户才能访问它 基本身份验证可以由HTTP提供,可以使用WWW-Authenticate类似的头文件,也可以使用HTTP cookie设置特定的会话。

  • 代理和隧道

服务器和/或客户端通常位于内联网上,并向其他人隐藏其真实IP地址。HTTP请求然后通过代理来跨越这个网络障碍。并非所有的代理都是HTTP代理。例如,SOCKS协议的运行水平较低。其他的,比如ftp,可以由这些代理来处理。

  • 会话

使用HTTP cookie允许您将请求与服务器的状态关联。尽管基本HTTP是一种无状态协议,但这会创建会话。这不仅适用于电子商务购物篮,而且适用于任何允许用户配置输出的站点.HTTP流程当客户想要与服务器通信时,无论是最终服务器还是中间代理,它都会执行以下步骤:

  • 打开TCP连接:TCP连接将用于发送一个或多个请求,并接收答案。客户端可能会打开一个新连接,重新使用现有连接,或打开多个到服务器的TCP连接。
  • 发送HTTP消息:HTTP消息(在HTTP / 2之前)是人类可读的。对于HTTP / 2,这些简单的消息被封装在框架中,使得它们不可能直接读取,但原理保持不变。GET / HTTP / 1.1主机:developer.mozilla.org Accept-Language:fr
  1. 阅读服务器发送的响应:HTTP / 1.1 200 OK Date:Sat,09 Oct 2010 14:28:02 GMT Server:Apache Last-Modified:Tue,01 Dec 2009 20:18:22 GMT ETag:“51142bc1-7449 -479b075b2891b“Accept-Ranges:bytes Content-Length:29769 Content-Type:text / html <!DOCTYPE html ...(这里是29769字节的请求的网页)
  1. 关闭或重新使用连接以获取更多请求。

如果HTTP流水线被激活,则可以发送多个请求而无需等待第一个响应被完全接收。HTTP流水线已被证明难以在现有网络中实现,在现有网络中,旧版软件与现代版本共存。HTTP流水线已经在HTTP / 2中被一个帧中更强大的多路复用请求所取代。

HTTP消息

HTTP / 1.1和更早版本的HTTP消息是人类可读的。在HTTP / 2中,这些消息被嵌入到一个新的二进制结构,一个框架中,允许优化压缩报头和复用。即使在此版本的HTTP中仅发送了部分原始HTTP消息,每条消息的语义也不会改变,并且客户端重新构建(虚拟)原始的HTTP / 1.1请求。因此,理解HTTP / 1.1格式的HTTP / 2消息很有用。

有两种类型的HTTP消息,请求和响应,每种都有其自己的格式。

要求

一个HTTP请求示例:

请求由以下元素组成:

  • 一种HTTP方法,通常是一个动词GETPOST或者一个名词,OPTIONS或者HEAD定义客户想要执行的操作。通常,客户希望获取资源(使用GET)或发布HTML表单(使用POST)的值,但在其他情况下可能需要更多的操作。
  • 要获取的资源的路径; 例如没有协议(http://),域(在这里developer.mozilla.org)或TCP 端口(在这里),从上下文中显而易见的元素中去除资源的URL 80
  • HTTP协议的版本。
  • 传递服务器附加信息的可选标题。
  • 或者是一个正文,对于一些POST类似于响应中的方法,这些方法包含发送的资源。

回应

示例回应:

回应包括以下内容:

  • 他们遵循的HTTP协议版本。
  • 状态码,指示请求是否成功,以及为什么。
  • 状态消息,状态码的非权威性简短描述。
  • HTTP标头,就像那些请求一样。
  • 可选地,包含获取资源的主体。

结论

HTTP是一个易于使用的可扩展协议。客户机 - 服务器结构与简单添加标头的能力相结合,可以使HTTP随着Web的扩展功能一起提升。

虽然HTTP / 2增加了一些复杂性,但通过将HTTP消息嵌入到帧中以提高性能,自HTTP / 1.0以来,消息的基本结构保持不变。会话流程很简单,可以通过简单的HTTP消息监视器进行调查和调试。

在MDN上编辑此页面