网络协议系列--应用层HTTP发展史【掘金日新计划】

1,005 阅读7分钟

da025f33d7584f3ebc59624e72e0c9db_tplv-k3u1fbpfcp-zoom-crop-mark_1304_1304_1304_734.webp

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

网络协议系列 第1篇--网络分层,TCP/IP五层模型【掘金日新计划】
网络协议系列 第2篇--传输层工作原理【掘金日新计划】
网络协议系列 第3篇--TCP有哪些机制【掘金日新计划】
网络协议系列 第4篇--应用层HTTP发展史【掘金日新计划】
网络协议系列 第5篇--HTTPS原理【掘金日新计划】
网络协议系列 第6篇--网络协议串讲【掘金日新计划】
网络协议系列 第7篇--补充一些底层网络知识【掘金日新计划】


 ~  ~前言:每日革新自我、追求进步。积土而为山,积水而为海。
在讲了网络分层、传输层工作原理后,我们就要开始对应用层的探索了。应用层的篇幅为2篇,第一篇介绍HTTP的发展史,第二篇介绍从HTTP的角度看浏览器缓存机制,以及补充一些小的容易忽略的知识点。

周尛先森




网络协议虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我当年学习它的时候也废了挺大功夫。

网络分层、TCP协议、HTTPS中对称与非对称加密,除了了解“它是什么”,你是否有想过“为什么是它”?我认为理解了后者才真正理解了网络协议


HTTP协议

HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵循这个标准,用于服务器传输文本到本地浏览器的传输协议,客户端发起一个请求,默认端口为80端口,建立一个到服务器制定端口的TCP连接。

HTTP连接使用的是请求—响应的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。HTTP/1.0是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。HTTP/1.1,持久连接被默认采用,并能很好地配合代理服务器工作,还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。HTTP/2.0在HTTP 1.x的基础上,大幅度的提高了web性能,减少了网络延迟。HTTP/1.0和1.1在之后很长的一段时间内会一直并存,这是由于网络基础设施更新缓慢所决定的。


HTTP 0.9

远古时代的网页主要的功能只是展示一些文字信息,所以一开始HTTP只支持GET请求,没有请求头、协议头,当时只能传输纯文本和HTML文件。这就是最开始的HTTP协议。


HTTP 1.0

后来随着网络带宽的升级,以及家用电脑的普及,HTTP/0.9已经不满足当下的需求。所以HTTP1.0出现了,新增了一些feature:

  1. 请求方式多样化
    • 增加 POST、HEAD
  2. 增加HTTP头的概念
    • 无论对请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。在HTTP头的帮助下,具备除传输文本HTML以外其他类型文档的能力,这得益于Content-Type
  3. 增加状态码
    • 使客户端了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)
  4. 增加缓存机制
    • 依赖于 Expires 字段作为强缓存判断的标准
  5. 增加身份认证
    • 增加 POST、HEAD
  6. 存在缺陷
    • TCP连接无法复用
      • TCP连接无法复用,即每次请求都需要与服务器建立TCP连接,完成请求处理后立刻断开连接
    • 队头阻塞
      • 即当页面需请求多资源时,队头阻塞会导致请求达到阈值时,剩余资源需等待先前资源完成后才可发起请求,带宽无法被充分利用
    • 带宽浪费
      • 客户端无法请求某个对象的一部分

HTTP 1.1

在1.0出现的几个月后,马上发布了HTTP/1.1,对比HTTP/1.0,HTTP/1.1进一步完善,直到现在还是占有很大一部分份额。

  1. 增加缓存处理机制
    • Cache-Control字段,优先级高于 Expires。若未命中强缓存,则判断是否命中协商缓存
  2. 长连接
    • 默认开启长连接,可在一个TCP连接上传送多个 HTTP 请求和响应,减少建立、关闭连接的消耗和延迟
    • 但是还是没解决队头阻塞问题,固进一步优化,增加管道化技术
  3. 带宽优化
    • 请求头增加 range 字段,允许请求资源的某一个部分(返回状态码:206),断点续传的基础
  4. 增加HOST头
    • 请求信息和响应信息都支持HOST头域
  5. 增加错误状态码
    • 新增24个状态码
  6. 增加管道化技术
    • 允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟
  7. 存在缺陷
    • 长连接使TCP连接可复用,但域名分片的情况下仍然需要建立多个 TCP 连接,给服务端造成压力
    • 管道化技术(pipelining)只解决了部分队头阻塞问题。虽客户端一次性可发出多个请求,但管道要求返回是按序的,那么前一个请求耗时过长,同样阻塞了后续请求内容的返回
    • HTTP/1.1 头部携带信息过头,在一定程度上增加了传输的成本
      • 头部元数据都是以纯文本的形式发送,会给请求增加500~8000字节的传输成本
    • 基于文本分割协议,所有的数据都是按顺序传输,不能并行传输

HTTP 2.0

在HTTP1.1发布后的十多年,HTTP/2.0发布了,相较于HTTP/1.1,新增了以下特性:

  1. 多路复用
    • 基于二进制帧的协议,其中的帧标识数据,达到并行传输后,不会出现合并数据错乱的情况
  2. 头部压缩
    • 过静态字典表预定义61个header中的字段,如常规的:method GET、:method POST等。通过动态字典表(队列)存储预定义之外的字段,添加位置从62开始,之后的传输时使用对应的索引即可。同时支持对String类型的Key-Value进行静态霍夫曼编码,减少传输体积的同时增加了安全性
  3. 服务器推送
    • 除最初请求的响应外,服务器还可以额外向浏览器端推送资源,无需浏览器端再次请求
  4. 存在缺陷,由于其基于TCP协议,所以TCP的局限性是无法避免的
    • 队头阻塞
      • HTTP/2.0多个请求在一个TCP连接中的,当TCP丢包,整个TCP都得等待重传,从而阻塞该TCP连接中的所有请求。
      • TCP是字节流协议,TCP层必须保证收到字节数据是完整有序地,若序列号低的字段丢失,即使高的TCP字段被接收,应用层也无法从内核中读取这部分数据
    • TCP与TLS握手延迟
      • 发起HTTP请求,需经过TCP三次握手和TLS四次握手,共需3个往返时延(Round-Trip Time)延迟
      • TCP 还具有拥塞控制的特性,所以建立连接 TCP 会有个慢启动的过程,会对 TCP 连接产生减速效果
    • 网络迁移需重新连接
      • TCP 连接由四元组(源IP、源端口、目标IP、目标端口)确定,若IP地址或端口变动,就会导致TCP与TLS重新握手,不利于移动设备切换网络

小结

我们从HTTP/0.9开始,到HTTP/2.0,分别将HTTP每个版本新增的feature列出来,以便横向对比各个版本之间的区别,以及他们各自有什么优缺点。

最后,让我们一起加油吧!

gg.jpg

都看到这了,不如顺手点个赞再走 ( *ˇωˇ* )