一文读懂 HTTP 协议的昨天,今天与明天

社区
1、写在开头

HTTP,Hypertext Transfer Protocol,超文本协议,是在万维网上传输文件(如文本、图形图像、声音、视频和其他多媒体文件)的规则集。如果 web 用户打开他们的 web 浏览器了,其实该用户就间接地利用到了 HTTP。

HTTP (Hypertext Transfer Protocol) is the set of rules for transferring files, such as text, graphic images, sound, video, and other multimedia files, on the World Wide Web. As soon as a web user opens their web browser, the user is indirectly making use of HTTP.

https://whatis.techtarget.com/definition/HTTP-Hypertext-Transfer-Protocol

HTTP 是在 TCP/IP 协议套件(因特网基础协议)之上运行的应用协议。HTTP 的最新版本是 HTTP/2,它是在 2015 年 5 月发布的。它是它的前身 http1.1 的一个替代品,但是它不会过时。

HTTP is an application protocol that runs on top of the TCP/IP suite of protocols (the foundation protocols for the Internet). The latest version of HTTP is HTTP/2, which was published in May 2015. It is an alternative to its predecessor, HTTP 1.1, but does not it make obsolete.

https://whatis.techtarget.com/definition/HTTP-Hypertext-Transfer-Protocol

HTTP 的发展是由蒂姆·伯纳斯-李于 1989 年在欧洲核子研究组织(CERN)所发起。由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)制定标准,最终发布了一系列的 RFC。

在 2019 年,委员会发布最新的 HTTP3。

picture.image

2、HTTP 的基础

HTTP 是一种无状态协议,即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。

HTTP 是一种面向对象的协议:它允许传送任意类型的数据对象,通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。

HTTP 规范定义了 9 种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是 GET 和 POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。

截止 2020 年 11 月,HTTP 共研究发布了五大版本,即:0.9 协议、1.0 协议、1.1 协议、2.0 协议 和 3.0 协议。 [2020 年 6 月 10 日 IETF 发布了 QUIC 最后一个草案]

3、HTTP 0.9

picture.image

1991 年,Tim Berners-Lee 概述了使用新协议的动机,并列出了几个高级设计目标:文件传输功能,请求对超文本档案进行索引搜索的能力,格式协商以及将客户端引用到另一台服务器的能力 。

为了证明该理论的有效性,构建了一个简单的原型,该原型实现了所建议功能的一小部分:

  1. 客户端请求是单个 ASCII 字符串。

  2. 客户请求由回车(CRLF)结尾。

  3. 服务器响应是 ASCII 字符流。

  4. 服务器响应是超文本标记语言(HTML)。

  5. 文档传送完成后,连接终止。

HTTP 0.9 的基本格式:

$ telnet www.baidu.com 80GET /case.html(响应内容)(connection closed)

复制代码

使用 telnet 客户端进行一次 HTTP/0.9 的 GET 请求(以请求百度服务器为例):

picture.image

4、HTTP 1.0

随着互联网应用需求的活跃,更加完善全面的 HTTP1.0 出现了,在 1999 年之后,它开始广泛应用于现在的各大浏览器网络请求中。

  • 1991 年至 1995 年是 HTML 规范的快速演变,一种称为“ Web 浏览器”的新型软件以及面向消费者的公共 Internet 基础结构的出现和快速发展起来。

  • 1994 年 Netscape Navigator 浏览器正式发布 1.0 版本。(2007 年彻底停止开发)。

  • 新的 Web 功能的不断增长及其在公共网络上的用例迅速暴露了 HTTP/0.9 的许多不足之处。1996 年 5 月,HTTP 工作组(HTTP-WG)发布了 RFC 1945,里面包含了很多“通用法则” 。

HTTP/1.0 通用法则:

请求可以由多个首部字段构成。

响应对象前面添加了一个响应状态行。

响应对象具有自己的一组由换行符分隔的首部字段。

媒体类型协商,响应对象不限于超文本。

每次请求后,服务器和客户端之间的连接都会关闭。

使用 telnet 客户端进行一次 HTTP/1.0 的 GET 请求(以请求百度服务器为例):

picture.image

5、HTTP 1.1

HTTP/1.0 和 HTTP/1.1 的标准制定工作其实是同时进行的,实际上,在 HTTP/1.0 发布大约六个后,也就是 1997 年 1 月,第一个正式的 HTTP/1.1 标准 RFC 2068 也正式发布了。

HTTP/1.1 标准解决了早期版本中的许多协议歧义,并引入了许多关键的性能优化:持久连接、分块编码传输、字节范围请求、增强的缓存机制、传输编码和请求流水线。

HTTP/1.1 的“特异功能之一”:支持启用多个子域名(让 DNS 解析请求资源更加快)

picture.image

HTTP/1.1 的“特异功能之二”:持久连接(一个 HTTP 连接传输多个图片)

弊端:在 HTTP/1.1 协议中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制,

如果超过限制数目的请求会被阻塞;

如果一旦有某请求超时等,后续请求只能被阻塞,毫无办法。

举个例子(百度搜图):

picture.image

使用 telnet 客户端进行一次 HTTP/1.1 的 GET 请求(以请求百度服务器为例):

picture.image

6、HTTP 2.0

HTTP/2 标准 RFC 7540 在 2015 年正式发布。 

HTTP/2 对 HTTP/1.1 的主要改进集中在提高性能上:引入了诸如多路复用、首部压缩、优先级划分、二进制编码等。

HTTP2.0 中的一些关键功能是从早期的非标准协议 SPDY 中衍生的。SPDY 是一项实验性协议,由 Google 开发,并于 2009 年宣布,其主要目的是通过解决 HTTP/1.1 的一些众所周知的性能限制来尝试加快网页加载。

HTTP2.0 的主版本号的增加听起来像是要做大的改进,从性能的角度说确实如此。但是从另一方面看,HTTP 的高层协议语义并不会因为这次版本升级而受影响。所有的 HTTP 首部、值、以及他们的使用场景都不会变。

HTTP/2.0 的“特异功能之一”:多路复用(多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行)

picture.image

7、HTTP 3.0

HTTP/3 抛弃使用 TCP,转而使用 QUIC,所以被命名为“基于 QUIC 的超文本传输协议”。

QUIC(Quick UDP Internet Connections)是Google设计的一套可靠UDP传输协议, 旨在为HTTP提供一个安全、可靠、高效和低延时的通信基础。

QUIC 相比现在广泛应用的 HTTP/2+TCP+TLS 协议有如下优势:

  1. 减少了 TCP 三次握手及 TLS 握手时间。

  2. 改进的拥塞控制。

  3. 避免队头阻塞的多路复用。

  4. 连接迁移。

  5. 前向冗余纠错。

HTTP/2+QUIC 在浏览器中:

picture.image

QUIC: 连接建立延时低:

在 HTTPS 协议中,由于 TCP 和 TLS 都各需要自 3 次握手,

导致连接建立过程较为复杂和耗时,降低了 HTTPS 的效率。

QUIC 选择 UDP 来作为其底层协议,就可以将连接建立和密钥协商的过程合二为一,

简化操作流程,提高连接效率。

picture.image

QUIC: 没有队头阻塞的多路复用

picture.image

  • HTTP/1.1:虽然支持了 Pipelining,但多个请求的回应依然需要顺序返回,如果其中一个请求的处理出现延误,后面所有的请求都会受影响。
  • HTTP/2.0:利用多路复用则解决了这个问题,不同请求的回应可以乱序返回,避免单路的问题影响其他支路的传输。
  • QUIC 协议:更进一步,在 UDP 的基础上实现了对多个独立可靠传输通道的支持,这些独立的传输通道有各自的 ACK 和流控,一个通道的问题不会影响其他通道的传输,使得网络通信的可靠性和传输能力得以提升。
8、总结

HTTP 协议在我们日常开发和生活中扮演着举足轻重的角色。HTTP 新版本着重性能方面的优化,语义上的改动很少。

随着 WEB 显示的特效,交互增多的发展,人们对交互,显示,用户体验的要求越来越高,这也促使 HTTP 协议的迅速发展。

在为了追求更好地交互与客户体验上,安全,逐渐趋于高速,高用户体验,减少传输延时,故 HTTP 协议的发展逐渐在强化各个方面逐渐进步,逐渐发展。

9、延伸阅读

《源码系列》

JDK之Object 类

JDK之BigDecimal 类

JDK之String 类

JDK之Lambda表达式

《经典书籍》

Java并发编程实战:第1章 多线程安全性与风险

Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制

Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭

《服务端技术栈》

《Docker 核心设计理念

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

读懂排序算法(一):冒泡&直接插入&选择比较

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

《读懂排序算法(六):二分查找算法》

《设计模式》

设计模式之六大设计原则

设计模式之创建型(1):单例模式

设计模式之创建型(2):工厂方法模式

设计模式之创建型(3):原型模式

设计模式之创建型(4):建造者模式

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论