一起养成写作习惯!这是我参与「掘金日新计划 · 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:
- 请求方式多样化
- 增加 POST、HEAD
- 增加 POST、HEAD
- 增加HTTP头的概念
- 无论对请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。在HTTP头的帮助下,具备除传输文本HTML以外其他类型文档的能力,这得益于Content-Type
- 无论对请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。在HTTP头的帮助下,具备除传输文本HTML以外其他类型文档的能力,这得益于Content-Type
- 增加状态码
- 使客户端了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)
- 使客户端了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)
- 增加缓存机制
- 依赖于 Expires 字段作为强缓存判断的标准
- 依赖于 Expires 字段作为强缓存判断的标准
- 增加身份认证
- 增加 POST、HEAD
- 增加 POST、HEAD
- 存在缺陷
- TCP连接无法复用
- TCP连接无法复用,即每次请求都需要与服务器建立TCP连接,完成请求处理后立刻断开连接
- 队头阻塞
- 即当页面需请求多资源时,队头阻塞会导致请求达到阈值时,剩余资源需等待先前资源完成后才可发起请求,带宽无法被充分利用
- 带宽浪费
- 客户端无法请求某个对象的一部分
- TCP连接无法复用
HTTP 1.1
在1.0出现的几个月后,马上发布了HTTP/1.1,对比HTTP/1.0,HTTP/1.1进一步完善,直到现在还是占有很大一部分份额。
- 增加缓存处理机制
- Cache-Control字段,优先级高于 Expires。若未命中强缓存,则判断是否命中协商缓存
- Cache-Control字段,优先级高于 Expires。若未命中强缓存,则判断是否命中协商缓存
- 长连接
- 默认开启长连接,可在一个TCP连接上传送多个 HTTP 请求和响应,减少建立、关闭连接的消耗和延迟
- 但是还是没解决队头阻塞问题,固进一步优化,增加管道化技术
- 带宽优化
- 请求头增加 range 字段,允许请求资源的某一个部分(返回状态码:206),断点续传的基础
- 请求头增加 range 字段,允许请求资源的某一个部分(返回状态码:206),断点续传的基础
- 增加HOST头
- 请求信息和响应信息都支持HOST头域
- 请求信息和响应信息都支持HOST头域
- 增加错误状态码
- 新增24个状态码
- 新增24个状态码
- 增加管道化技术
- 允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟
- 存在缺陷
- 长连接使TCP连接可复用,但域名分片的情况下仍然需要建立多个 TCP 连接,给服务端造成压力
- 管道化技术(pipelining)只解决了部分队头阻塞问题。虽客户端一次性可发出多个请求,但管道要求返回是按序的,那么前一个请求耗时过长,同样阻塞了后续请求内容的返回
- HTTP/1.1 头部携带信息过头,在一定程度上增加了传输的成本
- 头部元数据都是以纯文本的形式发送,会给请求增加500~8000字节的传输成本
- 基于文本分割协议,所有的数据都是按顺序传输,不能并行传输
HTTP 2.0
在HTTP1.1发布后的十多年,HTTP/2.0发布了,相较于HTTP/1.1,新增了以下特性:
- 多路复用
- 基于二进制帧的协议,其中的帧标识数据,达到并行传输后,不会出现合并数据错乱的情况
- 基于二进制帧的协议,其中的帧标识数据,达到并行传输后,不会出现合并数据错乱的情况
- 头部压缩
- 过静态字典表预定义61个header中的字段,如常规的:method GET、:method POST等。通过动态字典表(队列)存储预定义之外的字段,添加位置从62开始,之后的传输时使用对应的索引即可。同时支持对String类型的Key-Value进行静态霍夫曼编码,减少传输体积的同时增加了安全性
- 过静态字典表预定义61个header中的字段,如常规的:method GET、:method POST等。通过动态字典表(队列)存储预定义之外的字段,添加位置从62开始,之后的传输时使用对应的索引即可。同时支持对String类型的Key-Value进行静态霍夫曼编码,减少传输体积的同时增加了安全性
- 服务器推送
- 除最初请求的响应外,服务器还可以额外向浏览器端推送资源,无需浏览器端再次请求
- 除最初请求的响应外,服务器还可以额外向浏览器端推送资源,无需浏览器端再次请求
- 存在缺陷,由于其基于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重新握手,不利于移动设备切换网络
- TCP 连接由四元组(源IP、源端口、目标IP、目标端口)确定,若IP地址或端口变动,就会导致TCP与TLS重新握手,不利于移动设备切换网络
- 队头阻塞
小结
我们从HTTP/0.9开始,到HTTP/2.0,分别将HTTP每个版本新增的feature列出来,以便横向对比各个版本之间的区别,以及他们各自有什么优缺点。
最后,让我们一起加油吧!
都看到这了,不如顺手点个赞再走 ( *ˇωˇ* )