玩命加载中 . . .

6.1-HTTP


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来访问

301302都会在响应头里使用字段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)的优点

  1. 简单。报文格式是header+body,头部信息是key-value的形式,易于理解
  2. 灵活和易于扩展。HTTP协议里的各种请求方法、状态码、头字段等都允许开大人员自定义和扩充
  3. 应用广泛和跨平台

HTTP(1.1)的缺点

  1. 无状态。服务器没有记忆HTTP的状态,在进行有关联的操作时会比较麻烦。可以使用Cookie技术解决,通过在请求和响应报文中写入Cookie信息来控制客户端的状态
  2. 不安全
    • 明文传输。信息容易被窃取
    • 不验证通信方的身份
    • 无法证明报文的完整性

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的区别

  1. HTTP的信息是明文传输,存在安全风险;HTTPS在HTTP和TCP之间加入了SSL/TSL安全协议层,使得报文能耗加密传输
  2. HTTP连接建立相对简单,TCP三次握手之后就可以进行报文传输;而HTTPS在三次握手之后还需进行SSL/TSL的握手过程,才可以进行加密数据传输
  3. HTTP的端口号是80,HTTPS的端口号是443
  4. HTTPS协议需要向CA(Certificate Authority,证书权威机构)申请数字证书,来保证服务器的身份是可信的
1、混合加密

HTTPS采用的是对称加密和非对称加密结合的混合加密方式:

  • 在通信前采用『非对称加密』交换「会话秘钥」
  • 在通信过程中,使用「会话秘钥」进行『对称加密』

采用混合加密的原因:

  • 『对称加密』只使用一个秘钥,运算速度快,秘钥必须保密,无法做到安全的秘钥交换
  • 『非对称加密』使用两个秘钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了秘钥交换的问题,但速度较慢
2、摘要算法

摘要算法能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险

3、数字证书

公钥是服务器给的,如何保证公钥不被篡改?

需要借助第三方权威机构,将服务器公钥放在数字证书中,只要证书是可信的,公钥就是可信的

HTTPS连接建立

SSL/TSL协议基本流程

  • 客户端向服务器索要并验证服务器的公钥
  • 双方协商生产「会话秘钥」
  • 双方采用「会话秘钥」进行加密通信

SSL/TSL握手阶段

1、 ClientHello

首先,客户端向服务器发起加密通信请求,发送以下信息:

(1)客户端支持的SSL/TSL协议版本,如TSL 1.2版本
(2)客户端生成的随机数Client Random
(3)客户端支持的密码套件,如RSA加密算法

2、ServerHello

服务器收到客户端请求后,向客户端发出响应,包括以下内容:

(1)确认SSL/TSL协议版本
(2)服务器生产的随机数Server Random
(3)确认使用的加密算法
(4)服务器的数字证书

3、客户端回应

客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的CA公钥,确认服务器的数字证书的真实性,如果证书没问题,就从证书中提取服务器的公钥,然后使用公钥加密报文,向服务器发送以下信息:

(1)一个随机数per-master key
(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」紧密通信
(3)客户端握手结束通知

服务端收到后,双方都有了三个随机数(Client RandomServer Randompre-master key),接着就用双方协商的加密算法,生成本次通信的「会话秘钥」

4、服务器的最后回应

服务器收到客户端的响应后,计算出本次通信的「会话秘钥」,然后,向客户端发送最后的信息:

(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」进行加密通信
(2)服务器握手结束通知


HTTP/2 的优化

HTTP 1.1的性能瓶颈

  • 请求和响应头部未经压缩就发送,首部信息越多延迟越大,只能压缩body部分
  • 服务器是按请求的顺序响应的,存在队头阻塞问题
  • 没有请求优先级控制
  • 请求只能从客户端开始,服务器只能被动响应

HTTP/2 的改进

1、头部压缩

如果多个请求的头部是相似的,协议会消除重复的部分。使用HPACK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引,这样就不用发送同样的字段了,只发送索引号就行

2、二进制格式

HTTP/2不再使用纯文本,而是采用二进制格式,头信息和数据体都是二进制,统称为帧:头信息帧(Header Frame)和数据帧(Data Frame

3、数据流

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之间没有依赖,都是独立的

2、更快的连接建立

HTTP/2中,TCP和TLS是分层的,所以通信前需要先TCP握手,再TLS握手;

QUIC协议内部包含了TLS,所以只需要三次握手就可以建立连接

3、连接迁移

基于TCP的HTTP协议,由于是通过四元组(源IP、源端口、目的IP、目的端口)确定一条TCP连接,当设备的网络切换时,意味着IP地址变化了,所以就必须断开连接,再重新建立连接,连接的迁移成本较高

而QUIC是通过连接ID来标记通信的两个端点,因此即使设备的网络发生变化导致IP地址变化了,只要仍保有上下文信息,就可以复用原连接,达到连接迁移的功能


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录