五层 & 七层
五层:物理、链路、网络、传输、应用
七层:物理、链路、网络、传输、会话、表示、应用
CDN
URI & URL
- Uniform Resource Identifier,统一资源标识符,可以唯一标记互联网资源
- Uniform Resource Locator,统一资源定位符,也就是地址,它是 URI 的子集
只要能唯一标识资源的就是 URI,在 URI 的基础上给出其资源的访问方式的就是 URL
HTTP 特征
- 支持客户端-服务器模式
- 简单快速:客户端向服务端请求只需要传送请求方法和路径。因为协议简单,所以服务器规模小所以通信速度很快
- 灵活可拓展:HTTP 允许传输任意类型的数据对象,由 Content-Type 标记类型
- 无连接:每次连接只处理一个请求,服务器处理完请求,并收到客户端的应答后,就断开连接
- 无状态:没有记忆能力
HTTP 报文
HTTP 协议由三大部分组成:
- 起始行:描述请求或响应的基本信息
- header
- body:实际传输的数据,不一定是纯文本,也可以是视频、图片等
header 和 body 之间会有一个空行,header 不能为空,body 可以为空
起始行
起始行包括三个字段:请求方法、URL、HTTP 版本号
HTTP 版本
HTTP 0.9
特性:
- 只有一个请求行,没有请求头和请求体
- 请求方法只有 GET
缺点:
- 响应只有 HTML 文档,文件格式只局限于 ASCII 编码
HTTP 1.0
特性:
- 引入了请求头和请求体,增加了状态码,支持多种文档类型
- 使用短连接,每次发送数据都要经过三次握手和四次挥手,效率低
- header 中只使用 If-Modified-Since 和 Expires 作为缓存
缺点:
- 只提供了基本的认证,用户名和密码都没有加密
- 不支持断点续传
- 每个 IP 只能有一个域名
- 在同一个 TCP 连接里面,请求顺序是固定的。服务器只有处理完一个请求的响应后,才会进行下一个请求的处理,如果前面请求的响应特别慢的话,就会造成许多请求排队等待的情况,也就是所谓的队头阻塞
- 需要在响应头设置 Content-Length,然后浏览器再根据设置的数据大小来接收数据,对于动态生成的数据无能为力
HTTP 1.1
特性:
- 使用摘要算法(MD5,加密不可逆,较为安全,只能通过暴力匹配破解)进行身份验证
- 引入了 cookie
- 默认使用持久连接,对应请求头 keep-alive
- 新增 E-tag、If-Match、If-None-Match 等缓存
- 支持断点续传,对应请求头 Range
- 因为虚拟机的发展,一个 IP 支持多个域名
缺点:
- 同时开启多条 TCP 连接时,连接之间会互相竞争带宽
- 队头阻塞
- TCP 的慢启动
- 请求头重复携带
HTTP 2.0
特性:
- 彻底的二进制协议,头和体都是二进制(HTTP 1.1 的头必须是 ASCII 编码)
- 多路复用。在一个连接中,客户端和服务器都可以同时发送多个请求或回应,而且不需要按照顺序发送
- 数据流概念。HTTP 2 的数据包是不按顺序发送的,同一个连接中的数据包可能来源于不同的请求,所以需要对数据包做标记,指明属于哪个请求
- 头部压缩,因为 HTTP 无状态,每次请求都必须带上所有的信息,所以很多的请求字段都是重复的,比如 User-Agent。一模一样的内容每次请求都要携带会浪费带宽,影响速度。通过 gzip 或者 compress 压缩头后再发送。另一方面,客户端和服务端都维护一张头信息表,部分字段会存储到表中,生成一个索引,以后相同的就只发送索引,不发生字段,这也叫 HPACK 算法。
- 允许服务器主动推送。HTTP 2 允许服务器未经请求,主动向客户端推送一些必要资源。
缺点:
因为 HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。由于多个数据流使用同一个 TCP 连接,遵守同一个流量状态控制和拥塞控制。只要一个数据流遭遇到拥塞,剩下的数据流就没法发出去,这样就导致了后面的所有数据都会被阻塞。HTTP/2 出现的这个问题是由于其使用 TCP 协议的问题,与它本身的实现其实并没有多大关系。
HTTP 3 (QUIC)
特性:
- Quick UDP Internet Connection
- 基于 UDP 实现了类似 TCP 的流量控制、可靠传输机制
- 继承了 TLS
- 使用了 HTTP 2 的多路复用,再加上使用了 UDP,真正解决了对头阻塞问题
- 快速握手,快速启动。因为基于 UDP
缺点:
- 服务端和客户端对 HTTP 3 的支持还不完善
- 可能会存在安全性问题