likes
comments
collection
share

从HTTP/0.9到HTTP/3.0,从单一请求到多路复用。从单一请求方式到多路复用的交错传输二进制帧数据,从基于TCP

作者站长头像
站长
· 阅读数 36

写在前面

上篇写了URL -> 渲染页面的上半部分内容——网络资源的获取。实际上这个过程中涉及到很多细节,但是在上一篇并没有展开来说。这次我们从HTTP协议的发展聊起,谈谈HTTP发展中的挑战以及对应的解决方案。

前言:HTTP是什么?

HTTP全称为超文本传输协议,是为了获取像HTML这类资源而制定的协议。

一个网页通常包含文字、图片、视频和代码脚本等资源,这些资源传输的基础就是HTTP协议。通常,客户端会向服务端发起HTTP请求(request),而服务端会向客户端返回响应(response),本质上请求和响应都是一种消息

从HTTP/0.9到HTTP/3.0,从单一请求到多路复用。从单一请求方式到多路复用的交错传输二进制帧数据,从基于TCP

这幅图片对TCP/IP协议栈做了一个简化,精炼地描述了数据在网络中传输的过程。

在这个过程中发生了几个重要的事,我们以用户访问一个网站为例:

  • 客户端层面:用户在浏览器地址栏输入URL
  • Application/Transport层面
    • 通过DNS查询将URL中的域名转为IP地址。
    • 通过TCP协议与服务端建立连接,并通过TLS加密连接;或者不建立连接,直接通过UDP传输数据。
  • IP层面:浏览器发生HTTP请求到IP地址对应的服务器。
  • 服务端返回响应数据。
  • 浏览器解析数据渲染页面。

为了明确梳理HTTP的发展过程,我们先分清TCP、UDP、HTTP、TLS这几个术语之间的区别和联系。

TCP和UDP

一、TCP

TCP是传输控制协议,HTTP协议(3.0之前) 就是基于TCP协议去建立连接。

TCP是一种面向连接的,可靠的传输层通信协议,主要特点有:

  • 面向连接:

    每次TCP建立连接要经过三次握手,断开连接要经过四次挥手。

  • 可靠性:

    • 序列号:每个TCP报文段都有对应的序列号,确保了接收方能够按顺序重组接收到的报文段。
    • 确认应答:接收方在收到报文段后都会返回一个ACK报文段,用于确认收到前一个报文段,如果发送方没有收到ACK报文段,则会重新发送未被确认的报文段。
    • 超时重传:当发送方发送的报文段超过一定时间(重传超时时间RTO,是动态的),并且没有收到确认的ACK报文段,则会重新发送一遍报文段。

确认应答是确保 接收方 成功收到数据。

超时重传是确保 发送方 成功发送数据。

  • 流量控制:

    • 滑动窗口:TCP使用滑动窗口机制来限制每一次发送方的数据传输速率,确保接收方稳定地接收滑动窗口内的数据。
  • 拥塞控制:

    • 慢启动:当连接建立完成后,开始数据传输时,TCP会以指数增长的方式增大拥塞窗口,避免在连接建立的初期造成网络拥塞。到达慢启动阈值后,慢启动阶段结束。

    这其实是在互联网发展初期,用来探测网络连接数据量承受能力的一种机制。

    • 拥塞避免:达到慢启动阈值后,TCP将线性增加拥塞窗口的大小,避免网络拥塞。

二、UDP

UDP(用户数据报协议)是一种无连接的传输层协议,主打一个简单快速。特点如下:

  • 无连接

    传输数据之前不需要建立连接,可以直接传递数据给对方。

  • 数据传输实时性好

    由于UDP没有TCP建立连接的那一套规则,所以其数据传输速率非常高。适合一些游戏直播、视频会议等场景的数据传输。

  • 不可靠

    没有基于连接的重传机制和拥塞控制等,变得不可靠,丢失的数据就直接消失了。

三、TLS

TLS(传输层安全协议),介于传输层和应用层之间的一个协议,用于加密更上层的协议,例如HTTP。HTTPS就是基于HTTP,再经过TLS协议加密的一个安全传输协议。

目前,TLS协议采用混合加密模式来保护数据在传输过程中的安全。

混合加密模式 = 对称加密 + 非对称加密

简单理解:

  • 对称加密: 只创建单一密钥对数据进行加密,解密的一种算法。
  • 非对称加密: 创建公钥、私钥两种密钥,其中公钥用于加密数据,且易获得;私钥用于解密数据,只有创建者掌握。

TLS采用混合加密的逻辑就是:

当发送方需要传输数据给接收方时,由接收方采用非对称加密创建公钥以及私钥,公钥直接传递给发送方。发送方通过对称加密创建一个密钥,并使用接收方的公钥加密密钥传输给接收方,这样一来,由于接收方可以使用私钥解密公钥,那么意味着双方都可以基于同一个密钥进行安全的数据传输。

小结

  • TCP协议传输数据的过程中,传输逻辑是可靠稳定的,传输前为每个报文段添加序列号,传输时有超时重传,慢启动机制。

  • UDP协议是无连接的传输协议,实时性和传输效率比TCP好,但是没有TCP可靠。

  • TLS是一种传输层安全协议,采用了混合加密方式。

内容一:HTTP/0.9

当时的HTTP还是一个单行协议,只能通过GET方法获取最简单的HTML。

例如:

GET /xxx.html

对的,一切看起来那么简洁,当连接到服务器后,就不需要IP地址,也不需要端口号。发出的请求只有一行命令,响应的数据也只有html文档。

HTTP/0.9存在的问题:

  • 传输数据类型单一。
  • 发送请求形式单一且不规范。

内容二:HTTP/1.0

HTTP/1.0就基本实现了客户端和服务端的交流。

HTTP/1.0增加的主要特性:

  • 多种请求方式
    GET
    POST
    PUT
    DELETE
    HEAD
    CONNECT
    OPTIONS
  • 请求头:标记请求的资源类型和支持的压缩类型
   accept-encoding : gzip,deflate,br,zstd
   accept-language : zh-CN,zh;q=0.9
   accept-charset : GBK,utf-8
   content-type : text/html
  • 响应头:标记响应资源的信息
   centent-encoding : gzip
   content-length : 1024   
  • HTTP状态码:描述请求结果

HTTP/1.0存在的问题:

  • HTTP的短连接问题:每次HTTP请求都是独立的,也就是说每次HTTP请求都需要重新创建TCP连接,效率低下。

内容三:HTTP/1.1

HTTP/1.1的改进更符合现代网络要求,一直被广泛应用,目前的网站很多都有HTTP1.1的身影,例如百度。

从HTTP/0.9到HTTP/3.0,从单一请求到多路复用。从单一请求方式到多路复用的交错传输二进制帧数据,从基于TCP

HTTP/1.1新增加的主要特性

  • 长连接(Persistent Connections):

    HTTP/1.1中默认设置Connection : keep-alive,保持HTTP的长连接。在建立TCP连接后,可以连续传输多个HTTP请求和响应,直到客户端、服务端关闭连接。

  • 缓存处理(Cache Handling)

    HTTP/1.1 提供了更强大的缓存控制机制。它引入了 Cache-Control 标头字段,使得服务器能够更精细地控制缓存行为,例如指定缓存的有效期、是否允许缓存存储部分响应等。

HTTP/1.1协议中默认浏览器最多为每个域名并发建立6个TCP连接。

HTTP/1.1存在的问题

  • HTTP的队头阻塞

    在一个TCP连接请求的执行是有顺序的,不能够并发执行,如果前一个HTTP请求的响应没有返回,下一个请求就不能发送,这就造成了一种阻塞现象。

  • 带宽利用率低

    当浏览器和服务器同时开启多个TCP连接,多个连接之间相互竞争有限的带宽资源,导致TCP的发包速度动态减慢,页面加载速度变慢。

内容四:HTTP/2.0

为了解决HTTP的队头阻塞以及带宽利用率低的问题,HTTP/2.0引入了多路复用的技术。

多路复用可以做到并发HTTP请求无阻塞式传输,也就是多个HTTP请求和多个HTTP响应交错传输。

多路复用中还有一个(Stream)的概念,流就是数据双向传输的通道。用于处理请求和响应,每段流都有唯一的标识符,用于表明每一段流的优先级并方便后续操作,比如:取消、重置一段流。

具体的技术实现:

二进制分帧

HTTP/2.0将每一个请求或者响应都分成很小的数据片,每一片数据叫做帧。通过在TCP连接通道中交错传输许多帧,就实现了多路复用的效果。

帧也有唯一标识符,方便接收方将大量帧组装为完整的数据包。

流的控制

由于HTTP/2.0实现了多路复用,也就是多个流通道能够同时存在,那么对于流通道的控制十分重要。

正式传输前,先通过接收方发送的WINDOW_UPDATE帧来限制发送方的速率,这样就能控制整个流的数据传输量。

除了这些,HTTP/2.0改进的头部压缩也十分重要。

在 HTTP/2.0 之前,每次请求和响应的头部信息都需要完整地传输,这不仅消耗带宽,还会增加延迟。HTTP/2 通过引入 HPACK 算法,压缩请求头和响应头信息,提高了传输效率。

HTTP/2.0的局限

HTTP协议发展到2.0,做了二进制分帧处理数据包,实现多路复用,优化了许多请求、响应配置信息。就这还有缺陷?

没错,这个局限性是TCP协议带来的,HTTP/2.0以及前面的版本,都是基于稳定可靠的TCP传输控制协议。虽然TCP的慢启动,超时重传,流量控制,拥塞控制是一种优点,但是在网络技术发展过程中,这无疑是一种局限性

内容五:HTTP/3.0

打造HTTP/3.0,主要改进了以下几方面:

  • 降低延迟

    • QUIC 的设计:QUIC 在 UDP 上运行,并且在 UDP 的基础上实现了类似TCP的可靠性机制。在数据丢失时,QUIC允许在一段流通道中独立地重传数据,而不是所有流共享一个重传机制。这种局部重传机制减少了等待重传确认的时间,从而降低了延迟。
    • TLS 握手优化:QUIC 通过将 TLS 握手集成到连接建立过程中,减少了握手所需的往返次数,进一步降低了延迟。
  • 多路复用

    QUIC基于 UDP实现了多路复用,引入了独立的流作为每一次请求和响应传输的通道,具体数据传输形式也是二进制帧。

  • 改进的连接恢复

    QUIC 支持在 IP 地址改变时无缝恢复连接,这对于移动设备尤为重要,因为它们可能会在不同网络之间切换。这提高了连接的稳定性和用户体验。

  • 增强的安全性

    HTTP/3 默认使用 TLS 1.3,这是一种最新的加密协议,提供了更好的安全性和隐私保护。此外,QUIC 的加密握手过程比传统的 TLS 更加高效,减少了握手延迟。

总结

以上大概就是HTTP协议发展的过程。事实上,如果要细细考究每一点,细节都非常多。大家可以看这一节。HTTP | MDN (mozilla.org)

转载自:https://juejin.cn/post/7407789342579392563
评论
请登录