当前位置:   article > 正文

网络传输协议之:Http1、Http2、Http3_http1 http2

http1 http2

目录

一、什么是HTTP?

二、HTTP1.0

三、HTTP1.1

四、SPYD协议

五、HTTP2

 六、HTTP3

 七、总结


一、什么是HTTP?

HTTP(HyperText Transfer Protocol),是超文本传输协议,是目前互联网上要用最广泛的一种网络协议,所有的 WWW文件都必须遵守该标准。HTTP又使用了可靠的数据传输协议TCP协议,不会产生数据丢失和损坏。(HTTP协议属于应用层协议)

HTTP的工作流程

  • 浏览器与服务器建立TCP连接,即三次握手
  • TCP连接成功,浏览器发出HTTP请求命令
  • 服务端接收请求并返回HTTP响应
  • 服务器关闭连接,即四次挥手
  • 浏览器解析请求的资源

HTTP报文

分为请求和响应报文 

  • 请求行:包含请求方法,请求的URI(统一资源标识符)和HTTP版本
  • 状态行:包含响应结果的状态码
  • 首部字段:包含请求和响应的各种条件、属性的各类首部
  • 其他:包含未定义的首部如Cookie等

connection:keep-alive可以让TCP连接保持打开,浏览器可通过相同的连接发送请求

队头阻塞是指:当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。

解决队头阻塞:

  • 将同一页面的资源分散到不同域名下 ,提示连接上限。Chrome,对于同一个域名允许同时建立6个TCP持久连接,使用TCP连接时,虽然能共用一个TCP管道,但在一个管道中同一时刻只能处理一个请求。
  • Spriting合并多张小图2位一张大图,再用JavaScript或Css将小图重新分割
  • 内联,将图片的原始数据嵌入在Css文件里面的URL里减少网络请求次数 

二、HTTP1.0

HTTP协议的第二个版本,是第一个在通讯中指定版本号的HTTP协议版本。

特点:

  • 每次请求都必须新建一次连接,必须通过TCP的三次握手才能开始传输数据,连接结束之后还要经历四次挥手。
  • 不跟踪每个浏览器的历史请求

缺点:

  • 连接无法复用-每次请求都需要建立一个TCP连接,费时费力
  • 队头阻塞,下一个请求必须在前一个请求响应到达后发送。如果某请求一直不到达,那么下一个请求就一直不发送。(高延迟--带来页面加载速度的降低)

每下载文件时都需要建立TCP连接、传输数据和断开连接这样的步骤,无疑会增加大量无谓的开销,因此HTTP1.1增加了持久连接的方法。

三、HTTP1.1

在HTTP1.1中,默认支持长连接,即在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟

特点:

  • 支持长连接,通过Keep-Alive保持HTTP连接不断开,避免重复建立TCP连接
  • 管道化,通过长连接实现在一个连接中传输多个文件
  • 加入缓存处理(新字段cache-control)
  • 支持断点续传
  • 增加了Host字段,实现了在一台WEB服务器上可以同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点
  • 并且添加了其他请求方法:put、delete、options...

改进和优化: 

  • 不成熟的HTTP管线化: HTTP1.1试图用管线化技术来解决队头阻塞问题。HTTP1.1中的管线化是指将多个HTTP请求整批提交给服务器的技术,虽然可以整批发送请求,但是服务器依然需要根据请求顺序来回复浏览器的请求。
  • 对动态生成的内容提高了好的支持:HTTP1.0中,需在响应头中设置完整的数据大小,这样浏览器就可以根据设置的数据大小来接收数据。现在很多页面数据都是动态生成的,HTTP1.1通过引入Chunk transfer机制来解决此问题,服务器将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后一个0长度的块作为发送数据完成的标志
  • 浏览器为每个域名同时维护6个TCP持久连接,使用CDN实现域名分片机制,为网络做了很大优化,大大提高了页面的下载速度

缺点:

  • 高延迟--队头阻塞
  • 无状态特性--阻碍交互
  • 明文传输--不安全
  • 不支持服务端推送 

无状态特性:(带来巨大头部)协议对于连接状态没有记忆能力。纯净的HTTP是没有cookie等机制的,每一个连接都是一个新的连接。上一次请求验证了用户名密码,而下一次请求服务器并不知道它与上一条请求有何关联。

不安全性:传输内容没有加密,中途可能被篡改和劫持

HTTP1.1对带宽的利用率并不理想(带宽是指每秒最大能发送或接收的字节数),HTTP1.1很难将带宽装满:

  • 一是因为TCP的慢启动(为了减少网络拥塞的策略),一个TCP连接建立后,就进入发送数据状态,刚开始TCP协议会采用一个非常慢的速度去发送数据,而页面中常用的一些关键资源文件本来就不大,如HTML文件、CSS文件和JavaScript文件,通常这些文件在建立好连接之后就要发起请求,但这个过程慢启动,耗费时间就要更多。
  • 二是因为同时开启了多条TCP连接,那么这些连接会竞争固定的带宽
  • 三是队头阻塞问题

HTTP2则在此基础上做出了改进

四、SPYD协议

在HTTP2之前Google对HTTP1.1进行了改良:SPDY协议(二进制分帧层)

特性:

  • 多路复用--解决队头阻塞
  • 头部压缩--解决巨大的HTTP头部
  • 请求优先级--先获取重要数据
  • 服务器推送--填补空缺
  • 提高安全性

多路复用:SPDY允许一个连接上无限制并发流。因为请求在一个通道上,TCP效率更高 (慢启动),更少的网络连接,发出更密集的包。

头部压缩: 使用专门的HPACK算法,每次请求和响应只发送 差异头部,一般可以达到50%~90%的高压缩率。

请求优先级:虽然无线的并发流解决了队头阻塞的问题,但是如果带宽受限,客户端可能会因防止堵塞通道二阻止请求。在网络通道被非关键资源堵塞时,高优先级的请求会被优先处理。

服务端推送:可以让服务端主动把资源文件推送给客户端。当然客户端也有权力选择是否接收。

提高安全性:支持使用HTTPS进行加密传输。

五、HTTP2

HTTP2是基于SPDY,专注于性能,最大的一个目标是在用户和网站键只用一个连接 。

特性:

  • 二进制传输:将请求和响应数据分为更小的帧,并且采用二进制编码
  • Header压缩:采用HPACK算法压缩头部,同时同一个域名下的两个请求,只会发送差异数据,减少冗余的数据传输,降低开销
  • 多路复用:同一个域名下所有通信都是单个连接上完成,单个连接可以承载任意数量的双向数据流,数据流以消息形式发送,而消息由一个或多个帧组成,可以乱序发送
  • 服务端推送:服务端可以新建“流”主动向客户端发送消息,提前推送客户端需要的静态资源,减少等待延迟
  • 提高安全性:HTTP2也是明文的,只不过格式是二进制的,但HTTP2都是https协议的,跑在TSL上面。

虽然TCP有问题(慢启动),但暂时未有能力换掉,所以想办法规避TCP慢启动和TCP连接之间的竞争问题。HTTP2采用一个域名只使用一个TCP长连接来传输数据,这样整个页面资源的下载过程只需一次慢启动,也避免了多个TCP连接竞争带宽。同时实现资源的并行请求,解决队头阻塞问题。

 HTTP2添加了一个二进制分帧层:

HTTP2的请求和连接过程:

  • 首先,浏览器准备好请求数据,包括了请求行、请求头等信息,如果是POST方法还有请求体。
  • 这些数据经过二进制分帧层处理之后,会被转换为一个个带有请求ID编号的帧,通过协议栈将这些帧发送给服务器。
  • 服务器收到所有帧后,会将所有相同ID的帧合并为一条完整的请求信息
  • 服务器处理该条请求,并将处理的请求行、响应头和分别送至二进制分帧层
  • 同样,二进制分帧层会将这些响应数据转换为一个个带有请求ID编号的帧,经协议栈发送到浏览器
  • 浏览器接受响应帧后,会根据ID编号将帧的数据提交给对应的请求 

HTTP2仍存在问题:TCP+TLS建立连接的时间是主要瓶颈:没有从根本上解决队头阻塞问题,一旦遇到丢包,TCP协议还是会重新发送数据。我们知道在HTTP/2中,多个请求是跑在一个TCP管道中的,如果其中任意一路数据流中出现了丢包的情况,那么就会阻塞该TCP连接中的所有请求。这不同于HTTP/1.1,使用HTTP/1.1时,浏览器为每个域名开启了6个TCP连接,如果其中的1个TCP连接发生了队头阻塞,那么其他的5个连接依然可以继续传输数据。

 六、HTTP3

HTTP3甩掉TCP、TSL的包袱,构建高效网络QUIC协议。

HTTP3选择了UDP协议,基于UDP实现了类似TCP的多路数据流、传输可靠性等功能,将这套功能称为QUIC协议。

 特性:

  • 基于UDP协议改造,实现了快速握手
  • 集成了TLS的加密功能
  • 多路复用,彻底解决了头阻塞问题(一个物理连接上可以有多个独立的逻辑数据流,实现了数据流的单独传输)
  • 实现了类似TCP的流量控制、传输可靠性的功能

 七、总结

HTTP1.0:

  • 浏览器与服务器只保持短暂的连接,浏览器每次请求都需要与服务器建立一个TCP连接

HTTP1.1:

  • 引入了持久连接(TCP默认不关闭,可以被多个请求复用)
  • 在同一个TCP连接里,客户端可以发送多个请求
  •  多个请求按次序在服务端被处理
  • 新增了一些请求方法、请求头和响应头

HTTP2.0

  • 采用二进制格式而非文本格式
  • 完全多路复用,而非有序并阻塞的、只需要建立一个连接即可实现并行
  • 使用报头压缩,降低开销
  • 服务器推送 

HTTP3.0

  • QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/178450?site
推荐阅读
相关标签
  

闽ICP备14008679号