Playing with QUIC 頂 原

選擇一個QUIC代碼源

下面的說明是用來基於chromium代碼庫編譯QUIC代碼。在Chrome支持的任何平臺上,這裏的說明都能保證是有效的,遇到問題時可以查看一些擴展的故障排查的文檔。如果你不想checking out整個chrome,你可以嘗試github上快速而乾淨的proto-quic庫。這是chrome代碼的一份克隆,但剔除了大多數不必要的依賴,因而它可以快得多的check out並編譯,但不一定擴展了完整的chrome平臺集,因而你選擇的平臺有可能無法編譯。

編譯QUIC 客戶端和服務器

Chromium中提供了一個示例客戶端和服務器實現。要使用這些東西,你首先應該已經checked out Chromium的源代碼,然後構建二進制文件:

ninja -C out/Debug quic_server quic_client

從www.example.org準備測試數據

下載一份www.example.org的拷貝,它主要是使用quic_server來提供本地服務的:

mkdir /tmp/quic-data
cd /tmp/quic-data
wget -p --save-headers https://www.example.org

這裏主要是要下載一個html文件,且保存文件的所有的HTTP header,當然也可以從其它的站點下載這個文件。

手動地編輯index.html,並調整如下的headers:

  • 移除(如果存在的話):"Transfer-Encoding: chunked"
  • 移除(如果存在的話):"Alternate-Protocol: ..."
  • 添加:X-Original-Url: https://www.example.org/

生成證書

爲了運行服務器,你需要一個有效的證書,及一個pkcs8格式的私有key。如果你沒有,則你可以使用一些腳本來產生它們:

cd net/tools/quic/certs
./generate-certs.sh
cd -

除了服務器的證書及public key,這個腳本也會產生一個CA證書 (net/tools/quic/certs/out/2048-sha256-root.pem),你需要把它添加到你的操作系統的根證書商店以便於在證書驗證期間它被信任。要在linux上完成這一點,請參考這些說明

如果遺漏了這裏的添加CA證書的步驟的話,後面在執行quic_client的時候會報出如下的證書驗證錯誤:

$ ./out/Default/quic_client --host=127.0.0.1 --port=80 https://www.example.org/
[1008/164047:ERROR:cert_verify_proc_nss.cc(942)] CERT_PKIXVerifyCert for www.example.org failed err=-8179
[1008/164047:WARNING:proof_verifier_chromium.cc(466)] Failed to verify certificate chain: net::ERR_CERT_AUTHORITY_INVALID
Failed to connect to 127.0.0.1:80. Error: QUIC_PROOF_INVALID

運行QUIC服務器和客戶端

運行quic_server:

./out/Default/quic_server \
  --quic_in_memory_cache_dir=/tmp/quic-data/www.example.org \
  --certificate_file=net/tools/quic/certs/out/leaf_cert.pem \
  --key_file=net/tools/quic/certs/out/leaf_cert.pkcs8

運行quic_server還可以通過--port參數指定監聽的端口,及--v參數指定輸出更多信息,如:

./out/Default/quic_server --certificate_file=/media/data/osprojects/proto-quic/src/net/tools/quic/certs/out/leaf_cert.pem --key_file=/media/data/osprojects/proto-quic/src/net/tools/quic/certs/out/leaf_cert.pkcs8 --quic_in_memory_cache_dir=/home/hanpfei0306/quic-data/www.example.com --port=32457 --v=1

然後你就可以成功地使用quic_client以QUIC協議請求文件了:

./out/Default/quic_client --host=127.0.0.1 --port=32457 https://www.example.org/

注意,如果你讓服務器的端口默認爲32457,則你必須指定客戶端的端口,因爲它默認是80。 此外,如果你的本地機器有多個loopback地址 (由於它同時使用IPv4 和 IPv6),你不得不選定一個地址。 目前還不確定後面的缺點是不是一個bug。

注意:client和server都主要是爲了做集成測試的:它們都不能大規模使用。

要使用chrome來測試相同的下載過程,

chromium-browser \
  --user-data-dir=/tmp/chrome-profile \
  --no-proxy-server \
  --enable-quic \
  --origin-to-force-quic-on=www.example.org:443 \
  --host-resolver-rules='MAP www.example.org:443 127.0.0.1:32457' \
  https://www.example.org

故障排查

如果你在運行時遇到了問題,則可以以--v=1參數運行服務器或客戶端。它將提升日誌的verbosity,更多的日誌常常可以幫助暴露底層的問題。

原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章