Http
Contents
概念
HTTP是一种超文本传输协议(Hypertext Transfer Protocol)
,HTTP是一个基于TCP实现的应用层协议。一个两点之间传输数据的约定和规范。
组成
分为三部分,超文本、传输、协议
- 超文本是不止文本,还包含图片、音频、视频等数据
- 传输是数据从一端系统传送到另一端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。
- 协议是指传输的规范、规则。
特点
- 灵活可扩展。一个是语法上只规定了基本格式,空格分隔单次,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据。
- 请求-应答模式。通常而言,就是一发发送消息,另外一方接受消息 。
- 可靠传输,http是基于TCP/IP,因此把这一特性继承下来。
- 无状态,只负责发信息,不保存信息,需要通过cookie等保存信息。
缺点
- 明文传输。即协议中的报文(主要指头部)不适用二进制数据,而是文本形式。这让HTTP的报文信息暴露给了外界,给攻击者带来了便利。
- 队头阻塞。当http开启长连接时,共用一个TCP连接,当某个请求时间过长时,其他的请求只能处于阻塞状态。
- 无状态,只负责发信息,不保存信息。
http 1.0
-
标准:
- 任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。
- 通常每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)
-
性能:
- HTTP 1.0 被设计用来使用短连接,即每次发送数据都会经过 TCP 的三次握手和四次挥手,效率比较低。
- 不支持断点续传,也就是说,每次都会传送全部的页面和数据。
- 只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。
-
方法:
- 支持GET、POST、HEAD
-
安全:
- HTTP 1.0 仅仅提供了最基本的认证,这时候用户名和密码还未经加密,因此很容易收到窥探。
http 1.1
与http1.0区别
-
标准
- 虚拟主机的支持:使用虚拟网络,在一台服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且共享一个IP地址
- 引入Cookie。
-
性能:
- 引入持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。长连接的连接时长可以通过请求头中的
keep-alive
来设置。 - 引入管道机制。即在同一个TCP连接里,客户端可以同时发送多个请求。
- 缓存处理:HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。
- 支持断点续传,通过使用请求头中的
range
来实现。
- 引入持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。长连接的连接时长可以通过请求头中的
-
方法:
- 新增PUT、 PATCH、 OPTIONS、 DELETE。
-
安全:
- 使用摘要算法进行身份验证。
存在问题
- 队头阻塞问题,HTTP/1.1 默认允许复用TCP连接,但是在同一个TCP连接里,所有数据通信是按次序进行的,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞。
- 在传输数据过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。
http 2.0
特性
- 多路复用(即一个tcp/ip连接可以并发请求多个资源)
- 头部压缩(http头部压缩,减少体积)
- 二进制分帧(在应用层跟传送层之间增加了一个二进制分帧层,将数据切分为数据帧,改进传输性能,实现低延迟和高吞吐量)
- 服务器端推送(即SSE,服务端可以对客户端的一个请求发出多个响应,可以主动通知客户端)
- 请求优先级(如果流被赋予了优先级,它就会基于这个优先级来处理,由服务器决定需要多少资源来处理该请求。)
与http1.1不同点
- http1.1中,一个TCP请求可以发送多个请求,但只能按顺序一个一个请求。如果想并发多个请求,必须使用多个 TCP/ip链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制。
- http2.0中,只要一个tcp请求可以并发请求多个资源,分割成更小的帧请求,速度明显提升。
HTTP 队头阻塞
我们之前讨论了 HTTP 队头阻塞的问题,其根本原因在于HTTP 基于请求-响应
的模型,在同一个 TCP 长连接中,前面的请求没有得到响应,后面的请求就会被阻塞。
后面我们又讨论到用并发连接和域名分片的方式来解决这个问题,但这并没有真正从 HTTP 本身的层面解决问题,只是增加了 TCP 连接,分摊风险而已。而且这么做也有弊端,多条 TCP 连接会竞争有限的带宽,让真正优先级高的请求不能优先处理。
队头阻塞
而 HTTP/2 便从 HTTP 协议本身解决了队头阻塞
问题。注意,这里并不是指的TCP队头阻塞
,而是HTTP队头阻塞
,两者并不是一回事。TCP 的队头阻塞是在数据包
层面,单位是数据包
,前一个报文没有收到便不会将后面收到的报文上传给 HTTP,而HTTP 的队头阻塞是在 HTTP 请求-响应
层面,前一个请求没处理完,后面的请求就要阻塞住。两者所在的层次不一样。