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种方法。
GETPOSTHEAD
和HTTP/1.1介绍
PUTDELETEOPTIONSTRACE
我们将在一分钟内看到它们的细节。
第三件事是组成一个请求的一组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请求来检索。