curl項(xiàng)目從2013年9月就開始對(duì)http2提供實(shí)驗(yàn)性的支持。
為了遵從curl的要旨,我們盡可能全方位地支持http2。curl通常被用作一個(gè)網(wǎng)站連接測(cè)試工具,希望這項(xiàng)使命也能在http2上被得以延續(xù)。
curl使用一個(gè)叫做nghttp2的庫(kù)來提供http2幀層的支持。curl依賴于nghttp2 1.0以上版本。
請(qǐng)注意當(dāng)前l(fā)inux curl和libcurl并沒有默認(rèn)啟用對(duì)HTTP/2協(xié)議的支持。
curl會(huì)在內(nèi)部把收到的http2頭部轉(zhuǎn)換為HTTP1.x風(fēng)格的頭部再呈現(xiàn)給用戶,這樣一來,它們就和目前的HTTP非常類似。這也使得無論是用curl還是HTTP,轉(zhuǎn)換都非常容易。類似地,curl會(huì)用相同的方式對(duì)發(fā)出的HTTP頭部做轉(zhuǎn)換,即發(fā)給curl的HTTP 1.x風(fēng)格頭部會(huì)在被發(fā)送到http2服務(wù)器之前完成轉(zhuǎn)換。這使得戶無需關(guān)心底層到底使用的是哪個(gè)版本的HTTP協(xié)議。
curl通過升級(jí)頭部支持基于標(biāo)準(zhǔn)TCP的http2. 當(dāng)發(fā)起一個(gè)使用http2的HTTP請(qǐng)求,如果可能,curl會(huì)請(qǐng)求服務(wù)器把連接升級(jí)到http2.
curl可以使用許多不同TLS的底層庫(kù)來提供TLS支持,http2也得這樣。TLS兼容http2的挑戰(zhàn)來自于對(duì)APLN以及一些NPN擴(kuò)展的支持。
基于最新版本的OpenSSL或NSS編譯curl可以同時(shí)獲得ALPN和NPN支持。而使用GnuTLS或PolarSSL只能得到ALPN。
無論是用純文本還是通過TLS,必須使用--http2
參數(shù)來讓curl使用http2。在未使用該參數(shù)的默認(rèn)情況下,curl會(huì)使用HTTP/1.1。
應(yīng)用程序和從前一樣使用https://
或者http://
風(fēng)格的URL,但你可以通過將curl_easy_setopt
的SURLOPT_HTTP_VERSION
參數(shù)設(shè)置為CURL_HTTP_VERSION_2
來使libcurl嘗試使用http2。它將優(yōu)先盡可能地使用http2,如果不行的話,會(huì)繼續(xù)使用HTTP 1.1。
正如libcurl想盡可能量維持以前的用法,你需要通過CURLMOPT_PIPELINING參數(shù)為你的程序啟用HTTP/2多路復(fù)用功能。不然的話,它會(huì)保持一個(gè)連接只發(fā)送一個(gè)請(qǐng)求。
另一個(gè)需要注意的小細(xì)節(jié)是,當(dāng)你通過libcurl同時(shí)請(qǐng)求多個(gè)傳輸?shù)臅r(shí)候,請(qǐng)使用多接口模式。這樣能使應(yīng)用程序能同時(shí)啟用任意數(shù)量的傳輸。如果你寧愿讓libcurl等待也要把它們放到同一個(gè)連接來傳輸?shù)脑?,?qǐng)使用CURLOPT_PIPEWAIT參數(shù)。
libcurl 7.44.0及其后續(xù)版本開始支持HTTP/2服務(wù)器推送功能。你可以通過在CURLMOPT_PUSHFUNCTION參數(shù)中設(shè)定一個(gè)推送回調(diào)來激活該功能。如果應(yīng)用程序接受了該推送,它將為CURL建立一個(gè)新的傳輸,以便接受內(nèi)容。
更多建議: