当前位置:   article > 正文

http 一定是基于TCP连接的吗?

http 一定是基于TCP连接的吗?

写在前面

在这里插入图片描述
最近收到一个同学的留言,问题就是 HTTP是不是基于TCP的?

先说结论:
HTTP 1.0、1.1、2.0 版本是基于TCP的。 HTTP 3.0 是基于UDP的。

很多人这么一看,呦?这不是常见的八股文吗?
HTTP 1.0、1.1、2.0 的区别可太熟了!但是这个3.0是啥??
在这里插入图片描述

解释

HTTP(HyperText Transfer Protocol)超文本传输协议是万维网(World Wide Web)的基础协议,我们来了解一下HTTP发展。

HTTP/0.9

最初的 HTTP 协议并没有版本号,为了区分后来的版本,第一个版本号被定位在 0.9 ,而 HTTP 在应用的早期阶段也非常简单。
请求由单行指令构成,以唯一可用方法 GET 开头,其后为目标资源的路径 (一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。

  • 请求

    GET /page.html
    
    • 1

响应内容并不包含 HTTP 头。这意味着只有 HTML 文件可以传送,无法传输其他类型的文件。也没有状态码或错误代码。

  • 响应
    <html>
     HTTP 0.9 响应
    </html>
    
    • 1
    • 2
    • 3

HTTP/1.0

由于 HTTP/0.9 协议的应用十分有限,所以出现HTTP/1.0版本,主要改变点如下:

  • 协议版本信息现在会随着每个请求发送。
GET /page.html HTTP/1.0
  • 1
  • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为。
200 OK
  • 1
  • 引入了 HTTP 标头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
  • 在新 HTTP 标头的帮助下,具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借 Content-Type 标头)。
Content-Type: text/html
<HTML>
一个包含图片的页面
  <IMG SRC="/myimage.gif">
</HTML>
  • 1
  • 2
  • 3
  • 4
  • 5

完整请求如下:

GET /page.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
  HTTP/1.0 图片页面
  <IMG SRC="/image.png">
</HTML>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

但是这些新扩展并没有被引入到标准中以促进协助工作,仅仅是作为一种尝试,多种不同的实现方式在实际运用中显得有些混乱

在 HTTP/1.0 发布的几个月后,HTTP1.1 标准发布。

HTTP/1.1

HTTP/1.1 消除了大量歧义内容并引入了多项改进:

  • 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。
  • 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
  • 支持响应分块
  • 引入额外的缓存控制机制
  • 引入内容协商机制,包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。

完整的请求流程如下

GET /zh-CN/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header

200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

HTTP/2.0

这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多,更多的数据通过 HTTP 请求传输。

HTTP/1.1 链接需要请求以正确的顺序发送,理论上可以用一些并行的链接,但是带来的成本和复杂性堪忧。比如,HTTP 管线化(pipelining)就成为了 Web 开发的负担

为此,在 2010 年早期,谷歌通过实践了一个实验性的 SPDY 协议。这种在客户端和服务器端交换数据的替代方案引起了在浏览器和服务器上工作的开发人员的兴趣。明确了响应数量的增加和解决复杂的数据传输,SPDY 成为了 HTTP/2 协议的基础。

HTTP/2.0 主要有以下几点改变:

  • HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
  • 这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束
  • 压缩标头。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
  • 允许服务器在客户端缓存中填充数据,通过服务器推送机制来提前请求。

HTTP/3.0

HTTP 的下一个主要版本,HTTP/3 有着与 HTTP 早期版本的相同语义,但在传输层部分使用 QUIC 而不是 TCP。

QUIC 旨在为 HTTP 连接设计更低的延迟。类似于 HTTP/2,它是一个多路复用协议,但是 HTTP/2 通过单个 TCP 连接运行,所以在 TCP 层处理的数据包丢失检测和重传可以阻止所有流。QUIC 通过 UDP 运行多个流,并为每个流独立实现数据包丢失检测和重传,因此如果发生错误,只有该数据包中包含数据的流才会被阻止。

参考连接:
[1] https://en.wikipedia.org/wiki/HTTP/3
[2] https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP

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

闽ICP备14008679号