# 11. curl中的http2
curl項目從2013年9月就開始對http2提供實驗性的支持。
為了遵從curl的要旨,我們盡可能地支持http2的每個方面。curl通常被當作一個網站連接測試工具,希望這也能在http2上得以延續。
curl使用一個叫做[nghttp2](https://nghttp2.org/)的庫來支持http2幀層的功能。
## 11.1 跟HTTP 1.x非常相似
curl會在內部把收到的http2頭部轉換為HTTP1.x風格的頭部再呈現給用戶,這樣一來,它們就和目前的HTTP非常類似。這也使得無論是用curl還是HTTP,轉換都非常容易。類似地,curl會用相同的方式對發出的HTTP頭部做轉換,即發給curl的HTTP 1.x風格頭部會在被發送到http2服務器之前完成轉換。這使得戶無需關心底層到底使用的是哪個版本的HTTP協議。
## 11.2 不安全的純文本
curl通過升級頭部支持基于標準TCP的http2. 當發起一個使用http2的HTTP請求,如果可能,curl會請求服務器把連接升級到http2.
## 11.3 TLS和相關庫
curl可以使用許多不同TLS的底層庫來提供TLS支持,http2也得這樣。TLS兼容http2的挑戰來自于對APLN以及一些NPN擴展的支持。
基于最新版本的OpenSSL或NSS編譯curl可以同時獲得ALPN和NPN支持。而使用GnuTLS或PolarSSL只能得到ALPN。
## 11.4 命令行中使用
無論是用純文本還是通過TLS,必須使用`--http2`參數來讓curl使用http2。默認未使用該參數的情況下,curl會使用HTTP/1.1。
## 11.5 libcurl參數
應用程序和從前一樣使用`https://`或者`http://`風格的URL,但你可以通過將`curl_easy_setopt`的`SURLOPT_HTTP_VERSION`參數設置為`CURL_HTTP_VERSION_2`來使libcurl嘗試使用http2。它將優先盡可能地使用http2,如果不行的話,會繼續使用HTTP 1.1。