Skip to content

HTTP 特性整理

五层模型

  • 应用层:HTTP, FTP, DNS(具体应用)

  • 传输层:TCP, UDP(消息的可靠传递)

  • 网络层:IP, 路由器(在互联网中找到对方)

  • 数据链路层:MAC, 交换机(在子网中找到对方)

  • 物理层:电缆(如何用信号表示)

在网络通信中,数据依次经过每一层的处理,发出的时候封装,接收的时候解封装

URL 的定义

URL 即统一资源定位符

标准 http 的 URL 构成:{schema}://{domain}:{port}:{query}#{hash}

HTTP 请求的构成

  • 请求行 Line:包含请求方法、请求路径、版本号

  • 请求头 Header:请求头部信息,例如 Content-Type

  • 请求体 Body:传输的数据(类型需要跟服务端约定)

响应状态码

1xx:收到请求,需要继续执行

100 临时响应,可以继续请求

101 根据客户端请求切换协议,例如 websocket 或 http2

2xx:请求成功

200 成功

201 已创建

202 已接收请求,尚未处理

203 返回的信息来自另一个来源

204 无返回内容

205 重置内容

206 成功处理了部分请求

3xx:重定向或缓存

300 多种选择

301 永久重定向

302 临时重定向

303 查看其它位置

304 资源未发生变更,通知客户端可以使用缓存

305 使用代理

4xx:请求错误

400 错误的请求,服务器不理解

401 要求进行身份验证

403 拒绝请求

404 未找到请求的资源

405 禁止使用此方法

406 不接受响应的资源

407 需要代理授权

408 请求超时

5xx:服务器错误

500 服务器内部错误

501 不具备完成请求的功能

502 错误的网关

503 服务不可用(超载或停机维护)

504 网关超时

505 不支持的 http 版本

版本

到目前为止,HTTP 常⻅到版本有 HTTP/1.0,HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的 HTTP 特性 是不一样的。

HTTP 0.9

  1. 支持 GET

  2. 没有请求头

  3. 只能返回 HTML 字符串

  4. 服务端响应后立即关闭 TCP

HTTP 1.0

  1. 新增 POST, HEADER 方法

  2. 加入请求头和响应头

  3. 请求行加入版本号标识

  4. 支持传输数据格式:图片、音视频、二进制

HTTP 1.1(主流)

  1. 支持长连接

请求头中包含此属性Connection: keep-alive表示开启长连接,通常浏览器默认自动带上。

  1. 管道化传输

请求可以连续发出,不需要等待上一条响应。(解决队头阻塞问题)

但是响应数据仍然按接收的顺序依次发出。(队尾阻塞)

  1. 支持缓存处理

响应头的 Cache-Control 和 Expired 字段,表示过期的相对时间或绝对时间,具体实现则是在浏览器完成。

  1. 增加 PUT 和 DELETE 方法

  2. 支持断点传输

解决上传和下载的中断问题

HTTP 2.x

  1. 二进制分帧

1.x 是基于文本传输的,效率较低,而 2.x 通过二进制将信息分割成小块,提高传输效率。

  1. 多路复用

请求数据基于二进制分帧,按小块乱序发送,服务端自行拼凑成完整的数据去处理。

  1. 头部压缩

由客户端和服务端共同维护一份头部信息字典,减少头部的重复信息,达到压缩的目的

  1. 服务器推送

服务器可以主动向客户端推送资源

TCP 三次握手和四次挥手

三次握手

TCP 建立连接时需要经过三次握手

客户端 ------>   SYN    ------> 服务端(我需要请求信息)
客户端 <------ SYN+ACK ------- 服务端(已收到信息,你能不能接收信息)
客户端 ------>   ACK    ------> 服务端(我可以接收信息)
客户端 ------>   SYN    ------> 服务端(我需要请求信息)
客户端 <------ SYN+ACK ------- 服务端(已收到信息,你能不能接收信息)
客户端 ------>   ACK    ------> 服务端(我可以接收信息)

三次握手的目的,是为了双方互相确认对方的发送能力和接收能力是正常的,避免浪费资源,为后序的可靠性传输做准备。

四次挥手

TCP 断开连接时需要经过三次握手

客户端 ------> FIN ------> 服务端(我准备断开连接了)
客户端 <------ ACK ------- 服务端(已收到,但是响应数据没发完,等我信号)
客户端 <---- ACK+FIN ----- 服务端(可以断开连接了)
客户端 ------> ACK ------> 服务端(已断开连接)
客户端 ------> FIN ------> 服务端(我准备断开连接了)
客户端 <------ ACK ------- 服务端(已收到,但是响应数据没发完,等我信号)
客户端 <---- ACK+FIN ----- 服务端(可以断开连接了)
客户端 ------> ACK ------> 服务端(已断开连接)

四次挥手的原因是因为服务器需要等报文发送完毕后才能断开。

HTTPS

概念

HTTPS 就是在 TCP 和 HTTP 网络层之间加上一层 SSL/TLS 协议层。

HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。

HTTP 默认端口为 80,而 HTTPS 默认端口为 443。

HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

HTTPS 解决了 HTTP3 大风险:

  1. 窃听风险

  2. 篡改风险

  3. 冒充风险

HTTPS 的特点:

  1. HTTPS 采用了对称加密非对称加密结合的混合加密方式。

  2. 摘要算法+数字签名

为了保证传输的内容不被篡改,我们需要对内容计算出一个「指纹」,然后同内容一起传输 给对方。

对方收到后,先是对内容也计算出一个「指纹」,然后跟发送方发送的「指纹」做一个比 较,如果「指纹」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。

https摘要算法

  1. 数字证书

在计算机里,权威的机构就是 CA (数字证书认证机构),将服务器公钥放在数字证书 (由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。

HTTPS 建立连接的过程

前置重要知识点:

  1. 非对称加密,是指有两把密钥,公钥加密后只能用公钥解,私钥加密后只能用公钥解

  2. 对称加密是指双方都使用同一个密钥来加密和解密,而第三方没有密钥则不能解

SSL/TLS 协议基本流程:

  1. 客户端向服务器索要公钥

  2. 客户端向 CA 获取证书,验证服务器的公钥是否可信(避免中间人劫持)

  3. 双方协商生产「会话秘钥」,客户端通过公钥生成对称密钥,发给服务端解密(非对称加密)

  4. 双方采用「会话秘钥」进行加密通信(对称加密)