赞
踩
最近收到一个同学的留言,问题就是 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 在应用的早期阶段也非常简单。
请求由单行指令构成,以唯一可用方法 GET 开头,其后为目标资源的路径 (一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
请求
GET /page.html
响应内容并不包含 HTTP 头。这意味着只有 HTML 文件可以传送,无法传输其他类型的文件。也没有状态码或错误代码。
<html>
HTTP 0.9 响应
</html>
由于 HTTP/0.9 协议的应用十分有限,所以出现HTTP/1.0版本,主要改变点如下:
GET /page.html HTTP/1.0
200 OK
Content-Type: text/html
<HTML>
一个包含图片的页面
<IMG SRC="/myimage.gif">
</HTML>
完整请求如下:
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>
但是这些新扩展并没有被引入到标准中以促进协助工作,仅仅是作为一种尝试,多种不同的实现方式在实际运用中显得有些混乱。
在 HTTP/1.0 发布的几个月后,HTTP1.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
这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多,更多的数据通过 HTTP 请求传输。
HTTP/1.1 链接需要请求以正确的顺序发送,理论上可以用一些并行的链接,但是带来的成本和复杂性堪忧。比如,HTTP 管线化(pipelining)就成为了 Web 开发的负担。
为此,在 2010 年早期,谷歌通过实践了一个实验性的 SPDY 协议。这种在客户端和服务器端交换数据的替代方案引起了在浏览器和服务器上工作的开发人员的兴趣。明确了响应数量的增加和解决复杂的数据传输,SPDY 成为了 HTTP/2 协议的基础。
HTTP/2.0 主要有以下几点改变:
二进制协议
而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。多路复用协议
。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束
。压缩标头
。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。服务器推送机制
来提前请求。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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。