HTTP协议的新手指南

137 阅读8分钟

HTTP*(超文本传输协议*)是TCP/IP的应用协议之一,该协议套件为互联网提供动力。

让我纠正一下:它不是协议之一,它是最成功和最流行的协议,无论如何。

HTTP是使万维网运行的原因,它给浏览器提供了一种语言来与承载网页的远程服务器进行通信。

HTTP于1991年首次被标准化,这是蒂姆-伯纳斯-李自1989年以来在欧洲核子研究中心(CERN)所做工作的结果。

其目的是为了让研究人员能够轻松地交换和相互连接他们的论文。它旨在为科学界提供一种更好的工作方式。

当时,互联网的主要应用基本上包括FTP(文件传输协议)、电子邮件和Usenet(新闻组,今天几乎被放弃)。

1993年,第一个图形化的网络浏览器Mosaic被发布,事情从那里开始飞速发展。

网络成为互联网的杀手级应用。

随着时间的推移,网络和围绕它的生态系统发生了巨大的变化,但基本的东西仍然存在。进化的一个例子。除了网页之外,HTTP现在还支持REST API,这是一种通过互联网以编程方式访问服务的常见方式。

1997年,HTTP在HTTP/1.1中进行了一次小的修订,2015年,它的继任者HTTP/2被标准化,现在全球各地使用的主要网络服务器都在实施它。

HTTP协议被认为是不安全的,就像其他没有通过加密连接提供服务的协议(SMTP、FTP...)一样。这就是为什么现在大力提倡使用HTTPS,即通过TLS提供HTTP服务。

也就是说,HTTP/2和HTTPS的构建模块都源于HTTP,在这篇文章中,我将介绍HTTP的工作原理。

HTML文档

HTTP是Chrome、Firefox、Edge等网络浏览器(从这里开始也称为客户端)与网络服务器通信的方式。

超文本传输协议的名称来自于传输的需要,不仅仅是文件,如FTP--"文件传输协议",而是超文本,这些超文本将用HTML编写,然后由浏览器用漂亮的演示和交互式链接以图形方式表示。

链接是推动采用的动力,同时也是创建新网页的便利。

HTTP是在网络上传输这些超文本文件(以及我们将看到的图像和其他文件类型)的工具。

超链接

在网络浏览器中,一个文件可以通过链接指向另一个文件。

一个链接由第一部分组成,它决定了协议和服务器地址,可以通过域名或IP。

当然,这个部分并不是HTTP所独有的。

然后是文档部分。任何附加在地址部分的东西都代表文档路径。

例如,这个文档地址是https://flaviocopes.com/http/

  • https 是协议。
  • flaviocopes.com 是指向我的服务器的域名
  • /http/ 是相对于服务器根路径的文档URL。

路径可以嵌套:https://flaviocopes.com/page/privacy/ ,在这种情况下,文档的URL是/page/privacy

网络服务器负责解释请求,并在分析后,提供正确的响应。

一个请求

一个请求里有什么?

首先是URL,我们之前已经看过了。

当我们在浏览器中输入一个地址并按下回车键时,服务器会向正确的IP地址发送这样的请求。

GET /a-page

其中/a-page是你请求的URL。

第二件事是HTTP方法(也叫动词)。

在早期的HTTP定义了3种方法。

  • GET
  • POST
  • HEAD

和HTTP/1.1介绍

  • PUT
  • DELETE
  • OPTIONS
  • TRACE

我们将在一分钟内看到它们的细节。

第三件事是组成一个请求的一组HTTP头

头信息是一组key: value ,用于向服务器传达预先定义的特定信息,以便服务器能够知道我们的意思。

我在HTTP请求头文件列表中详细描述了它们。

请快速浏览一下该列表。所有这些头信息都是可选的,除了Host

HTTP方法

GET

GET是这里使用最多的方法。当你在浏览器地址栏中输入一个URL,或者点击一个链接时,就会使用这种方法。

它要求服务器将请求的资源作为响应发送。

HEAD

HEAD和GET一样,但告诉服务器不要把响应体送回来。只有头文件。

POST

客户端使用POST方法来发送数据给服务器。它通常用于表单,例如,也用于与REST API交互时。

PUT

PUT方法的目的是在该特定的URL上创建一个资源,并在请求正文中传递参数。主要用于REST APIs

DELETE

DELETE方法是针对一个URL调用的,请求删除该资源。主要用于REST APIs

OPTIONS

当服务器收到OPTIONS请求时,它应该发回该特定URL所允许的HTTP方法列表。

TRACE

将收到的请求返回给客户端。用于调试或诊断目的。

HTTP客户/服务器通信

HTTP和大多数属于TCP/IP套件的协议一样,是一个无状态协议。

服务器不知道客户端的当前状态是什么。他们所关心的是,他们收到了请求并需要满足这些请求。

在这种情况下,任何先前的请求都是没有意义的,这使得网络服务器有可能变得非常快,因为需要处理的内容更少,而且它还提供了处理大量并发请求的带宽。

HTTP也是非常精简的,就开销而言,通信是非常快的。 这与HTTP问世时使用最多的协议形成了对比。TCP和POP/SMTP,即邮件协议,它们在接收端需要进行大量的握手和确认。

图形化的浏览器对所有这些通信进行了抽象化,但为了学习,我们将在这里进行说明。

一条信息由第一行组成,它以HTTP方法开始,然后包含资源的相对路径和协议版本。

GET /a-page HTTP/1.1

在这之后,我们需要添加HTTP请求头。如上所述,有许多头信息,但唯一必须的是Host

GET /a-page HTTP/1.1
Host: flaviocopes.com

你如何测试呢?使用telnet。这是一个命令行工具,让我们连接到任何服务器并向其发送命令。

打开你的终端,然后输入telnet flaviocopes.com 80

这将打开一个终端,它告诉你

Trying 178.128.202.129...
Connected to flaviocopes.com.
Escape character is '^]'.

你已经连接到为我的博客提供动力的Netlify网络服务器。你现在可以输入。

GET /axios/ HTTP/1.1
Host: flaviocopes.com

并在一个空行上按回车键来发出请求。

响应将是。

HTTP/1.1 301 Moved Permanently
Cache-Control: public, max-age=0, must-revalidate
Content-Length: 46
Content-Type: text/plain
Date: Sun, 29 Jul 2018 14:07:07 GMT
Location: https://flaviocopes.com/axios/
Age: 0
Connection: keep-alive
Server: Netlify

Redirecting to https://flaviocopes.com/axios/

看,这是我们从服务器上得到的一个HTTP响应。这是一个301永久移动的请求。参见HTTP状态代码列表,了解更多关于状态代码的信息。

它基本上告诉我们,该资源已经永久地移动到另一个地方。

为什么呢?因为我们连接到80端口,这是HTTP的默认端口,但在我的服务器上,我设置了一个自动重定向到HTTPS。

新的位置是在Location HTTP响应头中指定的。

还有其他的头信息,都在HTTP响应头信息列表中描述。

在请求和响应中,都有一个空行将请求头和请求体分开。本例中的响应体包含字符串

Redirecting to https://flaviocopes.com/axios/

它的长度为46字节,在Content-Length 标头中指定。当你打开页面时,它会显示在浏览器中,同时自动将你重定向到正确的位置。

在这种情况下,我们使用的是telnet,这是一种低级的工具,我们可以用它来连接任何服务器,所以我们不能有任何形式的自动重定向。

让我们再做一次这个过程,现在连接到443端口,这是HTTPS协议的默认端口。我们不能使用telnet,因为必须进行SSL握手。

让我们保持简单,使用curl ,另一个命令行工具。我们不能直接输入HTTP请求,但我们会看到响应。

curl -i https://flaviocopes.com/axios/

这就是我们将得到的回报。

HTTP/1.1 200 OK
Cache-Control: public, max-age=0, must-revalidate
Content-Type: text/html; charset=UTF-8
Date: Sun, 29 Jul 2018 14:20:45 GMT
Etag: "de3153d6eacef2299964de09db154b32-ssl"
Strict-Transport-Security: max-age=31536000
Age: 152
Content-Length: 9797
Connection: keep-alive
Server: Netlify

<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>HTTP requests using Axios</title>
....

我剪切了响应,但你可以看到现在返回的是页面的HTML。

其他资源

一个HTTP服务器不只是传输HTML文件,通常它还会提供其他文件。CSS、JS、SVG、PNG、JPG,很多不同的文件类型。

这取决于配置。

HTTP也完全能够传输这些文件,而且客户端会知道文件的类型,从而以正确的方式解释它们。

这就是网络的工作方式:当一个HTML页面被浏览器检索时,它被解释,任何其他需要显示属性的资源(CSS、JavaScript、图像......)都是通过对同一服务器的额外HTTP请求来检索。