HTTP/2.0本身并不強(qiáng)制使用SSL/TLS,和HTTP/1.1一樣,兼容“http”、“https”的兩種URL模式,支持以下兩種標(biāo)識(shí):
h2(over TLS),建立在TLS之上的HTTP/2.0,HTTPS模式。
h2c(over TCP),建立在明文TCP之上的HTTP/2.0,HTTP模式。
Protocol Negotiation
如果Client只支持HTTP/1.1,或者Server只支持HTTP/1.1,或者Server只支持h2c。
那么Client和Server如何選擇合適的協(xié)議呢?
h2c
針對(duì)h2c的協(xié)商機(jī)制,Client使用了HTTP/1.1的Upgrade機(jī)制,發(fā)起了HTTP/1.1的協(xié)議升級(jí),Upgrade字段指定了希望升級(jí)到的協(xié)議和版本號(hào),比如下面這段:
GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
如果Server不支持Upgrade列出的協(xié)議,可以直接以HTTP/1.1方式直接響應(yīng),比如下面這段:
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
如果Server支持該協(xié)議,必須響應(yīng)101的狀態(tài)碼,并且在Upgrade空行響應(yīng)結(jié)束之后,可以以新的格式響應(yīng)請(qǐng)求,比如說(shuō)HTTP/2.0二進(jìn)制幀的格式。
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c
h2協(xié)商
由于h2是依賴SSL/TLS的,基于h2的協(xié)議協(xié)商則依賴于ALPN(Application Layer Protocol Negotiation,應(yīng)用層協(xié)議協(xié)商)。也就是在TLS握手階段,通信雙方原本就要進(jìn)行加密套件等的協(xié)商,ALPN作為起拓展字段加入握手協(xié)商過(guò)程中,對(duì)通信不會(huì)增添性能影響。具體協(xié)商過(guò)程如下:
- 在TLS握手過(guò)程中,Client在Client Hello中指定拓展參數(shù)ALPN Protocol,即希望升級(jí)到的協(xié)議列表。
- Server收到Client Hello,從展參數(shù)ALPN Protocol列表里選擇支持的協(xié)議。在Server Hello中,回復(fù)拓展參數(shù)ALPN Protocol,值為選擇的協(xié)議。
至此就完成了協(xié)議協(xié)商,雙方按照協(xié)商的協(xié)議進(jìn)行通信。
盡管HTTP/2.0支持h2c模式,但是可能是考慮到安全問(wèn)題,基本上主流的瀏覽器都要求HTTP/2.0部署在SSL/TLS上,所以現(xiàn)在HTTP2.0基本都是基于h2標(biāo)識(shí),基于HTTPS模式部署。