An overview of HTTP

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

在这里插入图片描述
客户端和服务器通过交换单独的消息(而不是数据流)进行通信。由客户机(通常是Web浏览器)发送的消息称为请求,而由服务器作为应答发送的消息称为响应。

在这里插入图片描述
HTTP是在20世纪90年代初设计的,它是一种随时间而发展的可扩展协议。它是通过TCP或tls加密的TCP连接发送的应用层协议,尽管理论上可以使用任何可靠的传输协议。由于其可扩展性,它不仅用于获取超文本文档,还用于获取图像和视频,或者将内容发布到服务器,比如HTML表单结果。HTTP还可以用于获取部分文档,以按需更新Web页面。

基于http的系统组件

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

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

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

Client: the user-agent

用户代理是代表用户的任何工具。这个角色主要由Web浏览器执行,但也可以由工程师和Web开发人员用于调试应用程序的程序执行。

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

为了显示Web页面,浏览器发送一个原始请求来获取表示该页面的HTML文档。然后,它解析这个文件,发出与执行脚本、要显示的布局信息(CSS)和页面中包含的子资源(通常是图像和视频)相对应的附加请求。然后,Web浏览器将这些资源组合起来,以显示完整的文档,即Web页面。浏览器执行的脚本可以在以后的阶段获取更多的资源,浏览器会相应地更新Web页面。

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

The Web server

在通信通道的另一端是服务器,它按照客户机的请求提供文档。服务器实际上只表现为一台机器;但它实际上可能是一组共享负载的服务器(负载平衡),或一个复杂的软件询问其他计算机(如缓存、DB服务器或电子商务服务器),完全或部分地按需生成文档。

服务器不一定是一台机器,但是可以在同一台机器上托管多个服务器软件实例。使用HTTP/1.1和主机报头,它们甚至可以共享相同的IP地址。

Proxies

在Web浏览器和服务器之间,许多计算机和机器都在中继HTTP消息。由于Web堆栈的分层结构,其中大多数操作在传输、网络或物理层,在HTTP层变得透明,并可能对性能产生重大影响。那些在应用层操作的程序通常称为代理。它们可以是透明的,转发它们收到的请求,而不以任何方式更改请求;也可以是非透明的,在这种情况下,它们将在将请求传递给服务器之前以某种方式更改请求。代理可以执行许多功能:

  • 缓存(缓存可以是公共的,也可以是私有的,比如浏览器缓存)
  • 过滤(如防病毒扫描或家长控制)
  • 负载平衡(允许多个服务器处理不同的请求)
  • 身份验证(控制对不同资源的访问)
  • 日志记录(允许存储历史信息)

HTTP的基本方面

HTTP is simple

HTTP通常被设计成简单和人类可读的,即使在HTTP/2中通过将HTTP消息封装到帧中引入了额外的复杂性。HTTP消息可以被人类阅读和理解,为开发人员提供了更容易的测试,并为新人减少了复杂性。

HTTP is extensible

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

HTTP is stateless, but not sessionless

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

HTTP and connections

连接是在传输层控制的,因此根本不属于HTTP的范围。HTTP不要求底层传输协议是基于连接的;它只要求它是可靠的,或者不丢失消息(在这种情况下,至少显示错误)。在互联网上最常见的两种传输协议中,TCP是可靠的,而UDP不是。因此,HTTP依赖于基于连接的TCP标准。

在客户机和服务器交换HTTP请求/响应对之前,它们必须建立一个TCP连接,这个过程需要多次往返。HTTP/1.0的默认行为是为每个HTTP请求/响应对打开一个单独的TCP连接。当多个请求紧密地连续发送时,这比共享一个TCP连接的效率要低。

为了缓解这个缺陷,HTTP/1.1引入了管道(事实证明很难实现)和持久连接:底层的TCP连接可以使用connection头部分控制。HTTP/2更进一步,通过在单个连接上多路复用消息,帮助保持连接的温暖和更高效。

设计一个更适合HTTP的更好的传输协议的实验正在进行中。例如,谷歌正在试验建立在UDP之上的QUIC,以提供更可靠和高效的传输协议。

HTTP可以控制什么

随着时间的推移,HTTP的这种可扩展特性允许对Web进行更多的控制和功能。缓存和身份验证方法是HTTP历史早期处理的功能。相比之下,放宽原产地限制的能力是在2010年代才增加的。

以下是HTTP可控制的一些常见特性:

  • 文档缓存的方式可以由HTTP控制。服务器可以指示代理和客户端缓存什么内容以及缓存多长时间。客户机可以指示中间缓存代理忽略存储的文档。
  • 放宽来源限制为了防止窥探和其他隐私侵犯,Web浏览器强制严格区分网站。只有来自同一来源的页面才能访问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
Host: developer.mozilla.org
Accept-Language: fr
  • 读取服务器发送的响应,例如:
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>(here come the 29769 bytes of the requested web page)
  • 关闭或重用该连接以进行进一步的请求。

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

HTTP消息

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

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

Requests

HTTP请求示例:

在这里插入图片描述
请求由以下元素组成:

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

Responses

一个回应的例子:

答复包括以下内容:

  • 它们遵循的HTTP协议版本。
  • 状态码,表示请求是否成功,以及原因。
  • 状态消息,对状态码的非权威短描述。
  • HTTP报头,就像请求的报头一样。
  • 可选地,包含获取的资源的主体。

基于HTTP的API

最常用的基于HTTP的API是XMLHttpRequest API,它可以用于在用户代理和服务器之间交换数据。现代的Fetch API提供了同样的功能,并提供了更强大和灵活的功能集。

另一个API是服务器发送事件,它是一种单向服务,允许服务器将事件发送到客户机,使用HTTP作为传输机制。使用EventSource接口,客户端打开一个连接并建立事件处理程序。客户端浏览器自动将HTTP流上到达的消息转换为适当的Event对象。然后,它将它们交付给已经为事件类型注册的事件处理程序(如果已知),或者交付给onmessage事件处理程序(如果没有建立特定于类型的事件处理程序)。

结论

HTTP是一种易于使用的可扩展协议。客户机-服务器结构,加上添加头部的能力,允许HTTP与Web的扩展功能一起发展。

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

原文

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值