1.HTTP协议
HTTP协议(Hyper Text Transfer Protocol,即超文本传输协议)是一个简单的请求响应协议,它通常运行在TCP之上,是互联网上应用最为广泛的一种网络协议。HTTP协议定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档穿到浏览器。从层次的角度看,HTTP协议是面向事务的应用层协议,它是万维网上能够可靠地交换文件的基础。
2.常见的HTTP协议版本
HTTP协议最为常见的的版本有四种,分别是HTTP1.0、HTTP1.1、HTTP2以及HTTP3等。不同版本的http协议有这很大的不同。
2.1 HTTP1.0
特点:
- 浏览器每发一个请求都会与服务器建立一个TCP请求,当请求结束后该TCP连接就会断开。(无连接)
- 服务器不会跟踪每一个客户端也不会记录过去的请求。(无状态)
- 在HTTP0.9的版本时,只能支持GET方法,到了HTTP1.0版本,增加了HEAD、POST两种请求方式。
- 增加了响应状态码,标记可能的错误原因。
- 引入了协议版本号的概念。
- 引入了HTTP header的概念,让HTTP处理请求和响应更加灵活。
- 传输的数据不再局限于文本,还可以传输图片、音乐等文件。
HTTP1.0最主要的缺点还是跟HTTP0.9一样,每次浏览器发送请求就要创建一个TCP连接,请求结束后就TCP连接就会断开。频繁的TCP连接创建和断开无疑增加了服务器的开销,并且TCP连接初始的时候发送数据的速度相对较慢,有一个慢启动和拥塞避免的阶段。
2.2 HTTP1.1
特点:
- 在HTTP1.0中默认使用Connection:close。在HTTP1.1中已经默认使用Connection:keep-alive,避免了连接建立和释放的开销。一个TCP默认不关闭,可以被多个请求复用。只有当设定的时间过了该连接才会断开。(长连接)
- 引入了管道机制,一个TCP连接可以同时发送多个请求。
- 对一个域名的请求允许分配多个长链接(缓解了长连接中对头阻塞的问题)。
- 新增了一些缓存的字段(If-Modified-Since, If-None-Match)。
- 请求头中引入了range字段,支持断点续传。
- 强制要求Host头,让互联网主机托管成为可能。
- 增加了 PUT、DELETE、OPTIONS、PATCH 等新的方法。
HTTP管道机制是指在一个TCP连接中,多个HTTP请求可以并行,客户端不用等待上一个请求结果返回就可以发出下一个请求,但是服务器端必须按照接收到客户端请求的先后顺序依次返回响应结果。
HTTP1.1虽然通过长连接减少了大量TCP的创建过程,但如果前面的请求没有结束之前,其他的请求只能处于阻塞状态。
2.3 HTTP2
特点:
- 二进制协议:在HTTP1.1版本的头部信息是文本,数据部分可以是文本也可以是二进制。在HTTP2版本的头部和数据部分都是二进制,且统称为帧。
- 多路复用:废弃了HTTP1.1中的管道,同一个TCP连接里面,客户端和服务器可以同时发送多个请求和多个响应,且不用按照顺序来,这样避免了队头阻塞的问题。
- 头部信息压缩:使用专用算法压缩头部,减少数据传输量,主要是通过服务器和客户端共同维护一张头部信息表,所有的头部信息在表里面都会有对应的记录,并且会有一个索引号,这样后面只需要发送索引号即可。
- 服务器主动推送:允许服务器主动向客户推送数据。
- 数据流:HTTP2中每一个请求或者响应的所有数据包,成为一个数据流,并且每一个数据流都有一个唯一ID,请求数据流的ID为奇数,响应数据流的ID是偶数。每个数据包在发送的时候带上对应数据流的ID,这样服务器和客户端就能分区是属于哪一个数据流。
HTTP2虽然解决了许多问题,在TCP协议级别上仍然存在类似的队头问题,而TCP仍然是Web的构建基础。当TCP数据包在传输的过程中丢失时,在服务器重新发送丢失的数据包之前,接收方无法确认传入的数据包。由于 TCP 在设计上不遵循 HTTP 之类的高级协议,因此单个丢失的数据包将阻塞所有进行中的 HTTP 请求的流,直到重新发送丢失的数据为止。
2.4 HTTP3
HTTP3的目的是解决HTTP2的传输问题。在所有形式的设备上提供快速、可靠和安全的Web连接。为此,它使用了一种不同的传输层网络协议,称为QUIC。
特点:
- HTTP3底层是基于UDP实现的,而UDP不需要三次握手、四次挥手的过程,所以天生比TCP快。
- QUIC不再以四元组标识,而是以一个 64 位的随机数作为 ID 来标识,而且 UDP 是无连接的,所以当 IP 或者端口变化的时候,只要 ID 不变,就不需要重新建立连接。
- QUIC 的流量控制也是通过 window_update,来告诉对端它可以接受的字节数。但是 QUIC 的窗口是适应自己的多路复用机制的,不但在一个连接上控制窗口,还在一个连接中的每个 stream 控制窗口。
- 集成了TLS加密功能。QUIC并不是简历在TLS之上,而是内部包含了TLS。它使用自己的帧接管了TLS里面的记录,握手消息、警报消息都不使用TLS记录,直接封装成QUIC的帧发送,省掉一次开销。
- HTTP3 没有指定默认的端口号,也就是说不一定非要在 UDP 的 80 或者 443 上提供 HTTP/3 服务。
- 为了实现可靠性,QUIC 也有个序列号,是递增的。任何一个序列号的包只发送一次,下次就要加一了。即使丢包重传,序列号也会加一,并且QUIC 定义了一个 offset 概念。QUIC 既然是面向连接的,也就像 TCP 一样,是一个数据流,发送的数据在这个数据流里面有个偏移量 offset,可以通过 offset 查看数据发送到了哪里,这样只要这个 offset 的包没有来,就要重发;如果来了,按照 offset 拼接,还是能够拼成一个流。
3.各版本HTTP的对比
协议版本 | 解决的核心问题 | 解决方式 |
---|---|---|
0.9 | HTML 文件传输 | 确立了客户端请求、服务端响应的通信流程 |
1.0 | 不同类型文件传输 | 设立头部字段 |
1.1 | 创建/断开 TCP 连接开销大 | 建立长连接进行复用 |
2 | 并发数有限 | 二进制分帧 |
3 | TCP 丢包阻塞 | 采用 UDP 协议 |
4.HTTP与HTTPS的区别
由于HTTP协议采取的是明文传输,所以安全上存在以下三个风险:
- 窃听风险:比如通信链路上可以获取通信内容,用户号容易没。
- 篡改风险:比如强制植入垃圾广告,视觉污染,用户眼睛容易瞎。
- 冒充风险:比如冒充淘宝网站等。
如上图所示(左边为HTTP协议,右边为HTTPS协议),为了解决HTTP的安全问题,HTTPS在HTTP与TCP层之间加入了SSL/TLS协议,可以很好的解决上述的风险。
HTTPS 是如何解决上⾯的三个⻛险的? - HTTPS采用对称加密和非对称加密结合的混合加密的方式。在通信建立前采用非对称加密的方式交换会话密钥,后续就不再使用非对称加密。在通信过程中全部使用对称加密的会话密钥的方式加密明文数据。
- 采用摘要算法来实现完整性,能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险。
- 通过数字证书的⽅式保证服务器公钥的身份,解决冒充的⻛险。
区别:
- https协议需要到CA申请证书,一般免费整数较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL/TLS加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;https协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。