共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。
先来简介
什么是 HTTP?
HyperText Transfer Protocol
,超文本传输协议,是目前互联网上应用最广泛的一种网络协议,所有的 www
文件都必须遵守该标准。而 Http
又使用了可靠的数据传输协议 TCP
协议,不会产生数据丢失和损坏。
什么又是 TCP?
计算机和网络设备相互通信,必须满足的一种规则,我们称之为协议(
protocal
)
与 HTTP 密切关联的 TCP、IP 以及 DNS
IP 协议,位于网络层,作用是把各种数据包发送给对方,通过 IP 地址和 MAC 地址来保证数据传达。怎么保证呢?IP 地址指明了节点被分配的地址,MAC 地址是网卡所属的固定地址,彼此可进行配对,IP 地址可变,但 MAC 地址基本不变。
ARP(Address Resolution Protocol)
协议是一种解析地址的协议,可根据 IP 地址解析出对应的 MAC 地址。
TCP 协议是如何做到可靠的数据传输的?
首先,TCP 位于传输层,为了方便传输,将大块的数据分割成以报文为单位的数据包进行管理,即所谓的字节流服务。
三次握手策略(three-way handshaking
)。TCP 协议将数据发送出去后,一定会向对方确认数据是否送达,否则会按顺序重新发送相同的数据包。
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为 1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为 1。 |
PSH | 提示接收端应用程序立即从 TCP 缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为 1 |
FIN | 希望断开连接。 |
三次握手流程
四次挥手流程
在 HTTP1.1 中,默认连接是持久连接的(即 http keep-alive),特点是只要任意一端没有明确断开连接,则保持 TCP 连接状态。这样就可以做到同时并行的发送多个请求,而不需要一个个的等待响应。
DNS(Domain Name System)
也位于应用层的协议,它提供域名到 IP 地址的解析服务。
HTTP/1.1
HTTP 报文
传输速率的提升
数据传输的对象集合
内容协商
请求格式
响应格式
浏览器缓存
缺陷
高延迟,队头阻塞,带宽无法充分利用
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
Chrome 默认在同一个域名下,允许同时建立 6 个 TCP 持久连接,在当前请求没有结束之前,其他的请求只能处于被阻塞的状态;
解决办法:
- 将资源分配在不同的域名下
Spriting
合并多张小图为一张大图- 将多个体积较小的 Javascript 合并成一个较大的文件;但当其中一个文件改变时,会导致整个文件重新被下载。
无状态特性带来巨大的头部
- 携带过多的 header 信息,如 user-agent,cookie,accept 等;
- 请求报文有过多的重复字段,资源浪费;
明文传输的不安全性
不支持服务推送
HTTP/2
SPDY 协议
HTTP/ 2 是现行 HTTP 协议(HTTP/1.x)的替代,但它不是重写,HTTP 方法 / 状态码 / 语义都与 HTTP/1.x 一样。HTTP/ 2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接(connection)。
二进制传输
HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。
它把 TCP 协议的部分特性挪到了应用层,把原来的 ”Header+Body” 的消息 ” 打散 ” 为数个小片的二进制 ” 帧 ”(Frame), 用 ”HEADERS” 帧存放头数据、”DATA” 帧存放实体数据。HTP/ 2 数据分帧后 ”Header+Body” 的报文结构就完全消失了,协议看到的只是一个个的 ” 碎片 ”。
HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
Header 压缩
采用 HPACK
算法压缩头部,压缩率 50%-90%;
同时,同一个域名下的两个请求,只会发送差异数据,减少冗余的数据传输,降低开销。
多路复用
- 同一个域名下的所有通信都在单个连接上完成;
- 单个连接可以承载任意数量的双向数据流;
- 数据流以消息的形式发送,而消息由一个或多个帧组成,可以乱序发送,因为根据帧首部的流标识可以重新组装。
这样做直观的好处是:
- 同一个页面,只需要一个 TCP 慢连接的过程;
- 可以并行交错的发送请求,请求之间互不影响;
服务端推送
指的是服务端可以新建“流”主动向客户端发送消息,提前推送客户端需要的静态资源,减少等待的延迟。
提高安全性
为了兼容,HTTP2 也是明文的,只不过格式是二进制的,但 HTTP2 都是 https 协议的,跑在 TSL 上面。
缺陷
TCP+TLS 建立连接的时间是主要瓶颈
没有从根本上解决头阻塞问题,一旦遇到丢包,那么 TCP 协议还是会重新发送数据。
Future:HTTP/3
QUIC
- 基于 UDP 协议改造,实现了快速的握手;
- 集成了 TLS 的加密功能;
- 多路复用,彻底解决了头阻塞问题;
- 实现了类似 TCP 的流量控制、传输可靠性的功能;
参考
- https://blog.csdn.net/u013870094/article/details/79098628
- http://www.fly63.com/article/detial/5974
- https://www.cnblogs.com/heluan/p/8620312.html
- https://http2.akamai.com/demo
- https://blog.csdn.net/qq_38950316/article/details/81087809