HTTP 协议的基本内容
· 什么是 HTTP 协议?
协议,是指计算机通信网络中两台计算机之间进行通信所必须共同遵守有规则的文本格式。
一旦有了协议,就可以使很多公司分工起来,有些公司做 Server 端,如 Tomcat,而有些公司就可以做浏览器了。这样大家只要一套约定,彼此的通讯就会相互兼容。
什么是 HTTP?
HTTP 是基于 TCP/IP 的应用层通信协议,它是客户端和服务器之间相互通信的标准。它规定了如何在互联网上请求和传输内容。
通过应用层协议,它只是一个规范了主机(客户端和服务器)如何通信的抽象层,并且它本身依赖于 TCP/IP 来获取客户端和服务器之间的请求和响应。
默认的 TCP 端口是 80 端口,当然,使用其他端口也是可以的。然而,HTTPS 使用的端口是 443 端口。
第一阶段,1996 年之前。
第一版的 HTTP 文档是 1991 年提出来的 HTTP/0.9,其主要特点有:
(1)它仅有一个 GET 方法。
(2)没有 header 数据块。
(3)必须以 HTML 格式响应。
第二阶段,HTTP/1.0 - 1996.
HTML 格式响应,HTTP/1.0 能够处理其他的响应格式,例如:图像、视频文件、纯文本或其他任何的内容类型(Content-Type 来区分)。
它增加了更多的方法(即 POST 和 HEAD),请求 / 响应的格式也发生了改变,请求和响应中均加入了 HTTP 头信息。
响应数据还增加了状态码标识,还介绍了字符集的支持、多部分发送、权限、缓存、内容编码等很多内容。
HTTP/1.0 的主要缺点之一是,你不能在每个连接中发送多个请求。
也就是说,每当客户端要向服务器端请求东西时,它都会打开一个新的 TCP 连接,并且在这个单独请求完成后,该连接就会被关闭。
每一次连接里面都包含了着名的三次握手协议。
于是有些 HTTP/1.0 的实现试图通过引入一个新的头信息 Connection: keep-alive,来解决这个问题。
第三个阶段,HTTP/1.1 - 1999.
HTTP/1.0 发布之后,随着 HTTP 开始普及之后,它的缺点也开始展现。
时隔三年,HTTP/1.1 便在 1999 年问世,它在之前的基础上做了很多的改进。主要内容包含:
新增的 HTTP 方法有 PUT、PATCH、HEAD、OPTIONS、DELETE.
主机名标识。在 HTTP/1.0 中,Host 头信息不是必须项,但 HTTP/1.1 中要求必须要有 Host 头信息。
持久性连接。正如前面所说,在 HTTP/1.0 中每个连接只有一个请求,且在这个请求完成后该连接就会被关闭,从而会导致严重的性能下降及延迟问题。HTTP/1.1 引入了对持久性连接的支持,例如:默认情况下连接不会被关闭,在多个连续的请求下它会保存连接的打开状态。想要关闭这些连接,需要将 Connection: close 加入到请求的头信息中。客户端通常会在最后一次请求中发送这个头信息用来安全的关闭连接。
管道机制。HTTP/1.1 也引入了对管道机制的支持,客户端可以向服务器发送多个请求,而无需等待来自同一连接上的服务器响应,并且当收到请求时服务器必须以相同的顺序来响应。但你可能会问客户端是怎么知道第一个响应下载完成和下一个响应内容开始的?要解决这个问题,必须要有 Content-Length 头信息,客户端可以用它来确定响应结束,然后开始等待下一个响应。
第四个阶段,SPDY - 2009.
Google 走在前面,它开始试验一种可替换的协议来减少网页的延迟,使得网页加载更快、提升 Web 安全性。
2009 年,他们称这种协议为 SPDY.SPDY 的功能包含多路复用、压缩、优先级、安全等。
2015 年,谷歌不想存在两个相互竞争的标准,因此他们决定把它合并到 HTTP 中成为 HTTP/2,同时放弃 SPDY.
第五个阶段,HTTP/2 - 2015.
HTTP/2 是专为低延迟传输的内容而设计。关键特征或与 HTTP / 1.1 旧版本的差异如下。
(1)二进制协议。
HTTP/2 倾向于使用二进制协议来减少 HTTP/1.x 中的延迟。二进制协议更容易解析,而不具有像 HTTP/1.x 中那样对人的可读性。
HTTP/2 中的数据块是帧和流。
HTTP 消息是由一个或多个帧组成的。有一个叫做 HEADERS 的帧存放元数据,真正的数据是放在 DATA 帧中的。
帧类型定义在 the HTTP/2 specs(HTTP/2 规范),如 HEADERS、DATA、RST_STREAM、SETTINGS、PRIORITY 等。
每个 HTTP/2 请求和响应都被赋予一个唯一的流 ID 且放入了帧中。帧就是一块二进制数据。
一系列帧的集合就称为流。每个帧都有一个流 id,用于标识它属于哪一个流,每一个帧都有相同的头。
同时,除了流标识是唯一的,值得一提的是,客户端发起的任何请求都使用奇数和服务器的响应是偶数的流 id.
除了 HEADERS 和 DATA, 另外一个值得说一说帧类型是 RST_STREAM,它是一个特殊的帧类型,用于中止流,如客户端发送这儿帧来告诉服务器我不再需要这个流了。
在 HTTP/1.1 中只有一种方式来实现服务器停止发送响应给客户端,那就是关闭连接引起延迟增加,因为后续的请求就需要打开一个新的连接。
在 HTTP/2 中,客户端可以使用 RST_FRAME 来停止接收指定的流而不关闭连接且还可以在此连接中接收其它流。
(2)多路复用。
由于 HTTP/2 现在是一个二进制协议,且是使用帧和流来实现请求和响应。
一旦 TCP 连接打开了,所有的流都通过这一连接来进行异步的发送而不需要打开额外的连接。
反过来,服务器的响应也是异步的方式,如响应是无序的、客户端使用流 id 来标识属于流的包。
更多武汉IT培训相关资讯,请扫描下方二维码