Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP协议栈 #168

Open
coconilu opened this issue Jun 23, 2020 · 0 comments
Open

HTTP协议栈 #168

coconilu opened this issue Jun 23, 2020 · 0 comments

Comments

@coconilu
Copy link
Owner

coconilu commented Jun 23, 2020

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主要特性有:

  1. 二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame)
  2. 多路复用,避免HTTP队头阻塞,传输是双向的、实时的
  3. 头信息压缩,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了
  4. 支持服务器推送,允许服务器未经请求,主动向客户端发送资源

服务器推送是把双刃剑,要小心避开坑。由于缓存的存在,如果每次访问都会主动推送,那么就会造成带宽浪费,解决方案:根据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 协议》

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant