HTTP协议栈
Opened this issue · 0 comments
HTTP历史
HTTP协议应该是目前世界上使用最广泛的网络协议了。蒂姆·伯纳斯·李(Tim Berners Lee)1989年提交一个提案,里面描述了了对万维网(World Wide Web)最初的设想,用以满足信息交换的需求。到了1990年10月,Tim完成了万维网三大基础技术的设计:命名方案(URI),通信协议(HTTP)和用来表示信息的标记语言(HTML)。
互联网、因特网、万维网的区别:
互联网是线路、协议以及通过TCP/IP协议实现数据电子传输的硬件和软件的集合体。
Internet(因特网) 是一个专有名词,指当前全球最大的、开放的、由众多网络互连而成的特定计算机网络(采用tcp/ip)协议族。 因特网是最大的互联网。Internet提供的主要服务有万维网(WWW)、文件传输(FTP)、电子邮件E-mail、远程登录(Telnet)等。
万维网则存在于互联网之上。它是无数个网络站点和网页的集合,构成了因特网主要的部分。它实际上是多媒体的集合,是由超级连接连接而成的。
HTTP协议的版本大致经历了0.9、1.0、1.1、2.0,还有未来的3.0。
1. HTTP 0.9
请求只有一行;没有请求头,没有响应头;
仅能返回超文本(HTML);
每次请求之后都会关闭。
2. HTTP 1.0
有请求头和响应头;
不局限与超文本,content-type[MIME](请求和响应首部都是ASCII编码,但是响应体可以是任何类型);
支持内容编码(accept-encoding、content-encoding)等等。
3. HTTP 1.1
支持持久连接(keep-alive);
支持分块编码传输(transfer-encoding);
支持字节范围请求(响应码206);
支持增强的缓存机制(cache-control);
支持cookie;
支持HTTP请求管道,允许客户端可以同时发送多个请求到服务器,但是会有队头阻塞,响应是按顺序返回的。
4. HTTP 2.0
由谷歌自研协议SPDY演化而来。主要目的是改进传输性能(低延迟、高吞吐量)。
HTTP2.0主要特性有:
- 二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame)
- 多路复用,避免HTTP队头阻塞,传输是双向的、实时的
- 头信息压缩,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了
- 支持服务器推送,允许服务器未经请求,主动向客户端发送资源
服务器推送是把双刃剑,要小心避开坑。由于缓存的存在,如果每次访问都会主动推送,那么就会造成带宽浪费,解决方案:根据cookie判断是否需要推送,类似etag。
HTTP2.0的多路复用是基于TCP的,在网络不稳定的情况下,效果可能还不如HTTP1.x。
5. HTTP 3.0
HTTP2.0虽然优化了很多,但也还是逃脱不了TCP的束缚。TCP协议有滑动窗口机制,也就是说,如果某个TCP包丢失了,那么就会影响滑动窗口的前进,导致TCP队头阻塞。
要想彻底摆脱这个TCP队头阻塞,只能切换到UDP。
QUIC是Google开发的快速UDP网络连接,它提供HTTP/2等效的多路复用与流控、TLS等效的安全机制,以及TCP等效的连接语义、可靠性、拥塞控制。
未来HTTP3.0会不会采用QUIC的实现,拭目以待。
HTTP语义
篇幅较大,详情可以看我的另一篇文章《HTTP 协议》。
HTTPS原理
请参考我的另一篇文章《HTTPS 协议》
HTTP 2.0
请参考我的另一篇文章《HTTP2 协议》