pupuk / blog

My New Blog. Record & Share. Focus on PHP, MySQL, Javascript and Golang.
MIT License
9 stars 2 forks source link

初探HTTP2 #15

Open pupuk opened 5 years ago

pupuk commented 5 years ago

写在最前

最近完成了几个项目的HTTPS升级,其中包括部署使用HTTP2,以前一直关注Google的SPDY技术,自从HTTP2协议出来以后,积极关注试用,看代码,到现在大规模成熟使用,还是很有感慨。写此文章,简单记录下核心要点,也是亲眼见证一项技术的发证和成熟。

历史

1、HTTP1.0 2、HTTP1.1 3、HTTP/2

  1. HTTP1.1主要增加 持久连接(PersistentConnection,包含Pipelining),,可以在一个TCP连接中,响应若干个HTTP连接,这主要是为了解决(HTTP1.0中,每一个HTTP请求都会产生一个TCP请求,这其中的创建连接的3次握手,关闭连接的4次挥手的情况,减少建立和关闭连接的消耗和延迟)。然而实际情况中的浏览器会限制一个TCP数量上的HTTP请求数目,以防止阻塞。这也导致很多的静态资源域名,通过分散域名,如img01.xxx.com,img02.xxx.com,img03.xxx.com等方式,来突破浏览器的限制策略。当然HTTP1.1中,是用Keep-Alive这个header name,来告诉后端服务器是否保持和关闭当前的TCP连接。

  2. HTTP1.1协议,增加了一些请求头和响应头。如:Request header里面的:Host,用来让服务端区分同一个IP上的虚拟主机。还有一个cache和过期时间这些等等,如Chunked transfer-coding,分块传输,可以实现断点续传。

HTTP2

目前项目中已经完成很多接口和网站的HTTPS和HTTP2升级,对HTTP2的认识更多的是在感性上的认知。留下深刻印象的可能就是: 头部压缩 二进制帧 多路复用

目前互联网上主要用的是HTTP1.1,但是HTTP2的发展应用很快,目前很多主流的站点都部署应用了HTTP2。 image

调试工具

目前主流的Chrome和Firefox版本均,已经支持HTTP2。不过主流浏览器的实现是在HTTPS上实现的HTTP2,即只有先用HTTPS,才能使用HTTP2。不带HTTPS的HTTP2称之为H2C。

curl

Centos默认装的curl一般不支持HTTP2.
~ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
~ curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.36 zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets 

要想curl支持HTTP可以参考: vim /etc/yum.repos.d/cityfan.repo

[cityfan]
name=cityfan
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/
enabled=1
gpgcheck=0

yum upgrade libcurl 或者 yum update curl

curl是新版本以后,可以不用参数--http2

curl -v https://www.tmall.com/ curl -I https://www.tmall.com/ image

一般HTTP2的协议头,是小写的。这点跟HTTP1.1的大写协议头有所区别。 image