HTTP是一个在计算机世界里专门在『两点』直接传输文字、图片、音频、视频等『超文本』数据的约定和规范
状态码
1xx
类状态码表示提示信息2xx
类状态码表示服务器成功处理了客户端的请求
- 『200 OK』表示一切正常。如果是非
HEAD
请求,服务器返回的响应都会有body数据 - 『204 No Content』也是成功,但响应头没有body数据
- 『206 Partial Content』是应用于HTTP分块下载或断点续传,表示响应返回的body数据并不是全部资源,而是其中的一部分
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的URL重新发送请求,也就是重定向
- 『301 Move Permanently』表示永久重定向,说明请求的资源已经不存在,需改用新的URL再次访问
- 『302 Found』表示临时重定向,说明资源还在,但暂时需要用另一个URL来访问
301
和302
都会在响应头里使用字段Location
,指明后续要跳转的URL,浏览器会自动重定向新的URL
- 『304 Not Modified』表示资源未修改,重定向已存在的缓存文件,告知客户端可以继续使用缓存资源
4xx
类状态码表示客户端发送的报文有误,服务器无法处理
- 『400 Bad Request』表示客户端发送的报文有错误
- 『403 Forbidden』表示资源禁止访问
- 『404 Not Found』表示资源不存在
5xx
类状态码表示服务器发送错误
- 『500 Internet Server Error』表示服务器发生了错误
- 『501 No Implemented』表示客户端请求的功能还不支持
- 『502 Bad Gateway』网关错误
- 『503 Service Unavailable』表示服务器暂时无法响应
GET与POST
- GET是从服务器获取指定的资源
- POST是对指定的资源做出处理
- 『安全』是指请求方法不会破坏服务器上的资源
- 『幂等』是指多次执行相同的操作,结果都是相同的
GET是安全且幂等的,POST是不安全的,也不是幂等的
HTTP特性
HTTP(1.1)的优点
- 简单。报文格式是
header+body
,头部信息是key-value
的形式,易于理解 - 灵活和易于扩展。HTTP协议里的各种请求方法、状态码、头字段等都允许开大人员自定义和扩充
- 应用广泛和跨平台
HTTP(1.1)的缺点
- 无状态。服务器没有记忆HTTP的状态,在进行有关联的操作时会比较麻烦。可以使用
Cookie
技术解决,通过在请求和响应报文中写入Cookie
信息来控制客户端的状态 - 不安全
- 明文传输。信息容易被窃取
- 不验证通信方的身份
- 无法证明报文的完整性
HTTP(1.1)的改进
1、长连接早期HTTP/1.0每次请求都要重新建立连接,增加了通信的开销,HTTP/1.1使用长连接,减少了TCP连接的重复建立和断开所造成的的额外开销
2、管线化HTTP/1.0使用串行的请求-应答模式,只有接收到上一个请求的应答后,才能发送下一个请求,这样如果上一个请求的应答迟迟未到,之后就请求就一直被阻塞无法发送了
HTTP/1.1使用管线化,即可在同一个TCP连接里面,客户端可以发送多个请求,也就是不必等上一个请求的应答回来,就可以发送下一个请求了,这样可以减少响应时间。但是服务器必须按照接收请求的顺序对这些请求进行响应,如果一个请求的响应时间较长,后面的请求的处理就会被阻塞,称为队头阻塞
所以,HTTP/1.1管线化解决了请求的队头阻塞,但是没有解决响应的队头阻塞
HTTPS
HTTP与HTTPS的区别
- HTTP的信息是明文传输,存在安全风险;HTTPS在HTTP和TCP之间加入了SSL/TSL安全协议层,使得报文能耗加密传输
- HTTP连接建立相对简单,TCP三次握手之后就可以进行报文传输;而HTTPS在三次握手之后还需进行SSL/TSL的握手过程,才可以进行加密数据传输
- HTTP的端口号是80,HTTPS的端口号是443
- HTTPS协议需要向CA(Certificate Authority,证书权威机构)申请数字证书,来保证服务器的身份是可信的
HTTPS采用的是对称加密和非对称加密结合的混合加密方式:
- 在通信前采用『非对称加密』交换「会话秘钥」
- 在通信过程中,使用「会话秘钥」进行『对称加密』
采用混合加密的原因:
- 『对称加密』只使用一个秘钥,运算速度快,秘钥必须保密,无法做到安全的秘钥交换
- 『非对称加密』使用两个秘钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了秘钥交换的问题,但速度较慢
摘要算法能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险
3、数字证书公钥是服务器给的,如何保证公钥不被篡改?
需要借助第三方权威机构,将服务器公钥放在数字证书中,只要证书是可信的,公钥就是可信的
HTTPS连接建立
SSL/TSL协议基本流程
- 客户端向服务器索要并验证服务器的公钥
- 双方协商生产「会话秘钥」
- 双方采用「会话秘钥」进行加密通信
SSL/TSL握手阶段
1、 ClientHello首先,客户端向服务器发起加密通信请求,发送以下信息:
(1)客户端支持的SSL/TSL协议版本,如TSL 1.2版本
(2)客户端生成的随机数Client Random
(3)客户端支持的密码套件,如RSA加密算法
服务器收到客户端请求后,向客户端发出响应,包括以下内容:
(1)确认SSL/TSL协议版本
(2)服务器生产的随机数Server Random
(3)确认使用的加密算法
(4)服务器的数字证书
客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的CA公钥,确认服务器的数字证书的真实性,如果证书没问题,就从证书中提取服务器的公钥,然后使用公钥加密报文,向服务器发送以下信息:
(1)一个随机数per-master key
(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」紧密通信
(3)客户端握手结束通知
服务端收到后,双方都有了三个随机数(Client Random
、Server Random
、pre-master key
),接着就用双方协商的加密算法,生成本次通信的「会话秘钥」
服务器收到客户端的响应后,计算出本次通信的「会话秘钥」,然后,向客户端发送最后的信息:
(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」进行加密通信
(2)服务器握手结束通知
HTTP/2 的优化
HTTP 1.1的性能瓶颈
- 请求和响应头部未经压缩就发送,首部信息越多延迟越大,只能压缩body部分
- 服务器是按请求的顺序响应的,存在队头阻塞问题
- 没有请求优先级控制
- 请求只能从客户端开始,服务器只能被动响应
HTTP/2 的改进
1、头部压缩如果多个请求的头部是相似的,协议会消除重复的部分。使用HPACK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引,这样就不用发送同样的字段了,只发送索引号就行
2、二进制格式HTTP/2不再使用纯文本,而是采用二进制格式,头信息和数据体都是二进制,统称为帧:头信息帧(Header Frame
)和数据帧(Data Frame
)
HTTP/2中每个请求的数据包称为一个数据流(Stream
),每个数据流都有一个编号,不同Stream
的帧是可以乱序发送的,因此可以并发不同的Stream
,因为每个帧的头部都有编号信息,所以接收端可以通过编号有序组装HTTP消息
客户端还可以指定数据流的优先级,优先级高的请求,服务器就先响应该请求
4、多路复用HTTP/2可以不按顺序处理请求,这样就不会有响应的队头阻塞问题。如果一个请求非常耗时,可以先回应处理好的部分,先去处理其他请求,过后再来处理
5、服务器推送服务器可以主动向客户端发送消息,改善了传统的请求-应答工作模式
HTTP/2的不足
HTTP/2通过Stream的并发能力,解决了应用层的队头阻塞问题,但因为是基于TCP来传输数据,而TCP必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区中的数据上交给HTTP应用进程,如果当前有一个报文段还没有到达,后面收到的报文段只能暂时存放在内存缓冲区中,只有等到这一个报文段到达到达时,才能一起上交给应用进程
一旦发生了丢包现象,就会触发TCP的重传机制,这样其他先到达的报文段都必须等待这个丢失的报文段被重传回来
HTTP/3 的优化
HTTP/3为解决传输层的队头阻塞问题,将传输层协议换成了基于UDP的QUIC协议,可以实现类似TCP的可靠传输
QUIC有3个特点
1、无队头阻塞QUIC协议可以在一条连接上传输多个Stream,每个Stream可以看成一条HTTP请求。当某个流发生丢包时,只会阻塞这个流,其他流不会受影响,因此就不存在队头阻塞问题
所以,QUIC连接上的多个Stream之间没有依赖,都是独立的
HTTP/2中,TCP和TLS是分层的,所以通信前需要先TCP握手,再TLS握手;
QUIC协议内部包含了TLS,所以只需要三次握手就可以建立连接
3、连接迁移基于TCP的HTTP协议,由于是通过四元组(源IP、源端口、目的IP、目的端口)确定一条TCP连接,当设备的网络切换时,意味着IP地址变化了,所以就必须断开连接,再重新建立连接,连接的迁移成本较高
而QUIC是通过连接ID来标记通信的两个端点,因此即使设备的网络发生变化导致IP地址变化了,只要仍保有上下文信息,就可以复用原连接,达到连接迁移的功能