這是Google在C中的SPDY協議的實驗實現。
該庫提供SPDY版本2、3和3.1框架層實現。它不執行任何I/O操作。當庫需要它們時,它將調用應用程序提供的回調函數。它還不包含任何事件輪詢機制,因此應用程序可以自由選擇處理事件的方式。此庫代碼不取決於任何特定的SSL庫(除了依賴OpenSSL 1.0.1或更高版本的程序外)。
該項目還在Spdylay庫的頂部開發了SPDY客戶端,服務器和代理。請參閱SPDY客戶端和服務器程序部分。
SPDY/2,SPDY/3和SPDY/3.1功能的大多數已經實現。在這兩個版本中,尚不可用的Server-Push的直接支持。該應用程序可以使用原始API來實現服務器簡介。
如下所述,我們可以使用當前的Spdylay API創建SPDY客戶端和服務器。
構建庫需要以下包裝:
要構建和運行單元測試程序,需要以下包:
要構建和運行示例程序,需要以下包:
要在spdycat (示例程序之一)中啟用-a選項(從下載資源中獲取鏈接資產),需要以下軟件包:
要將SPDY/HTTP構建為HTTP反向代理shrpx (示例程序之一),需要以下軟件包:
如果您使用的是Ubuntu 12.04,則需要安裝以下軟件包:
$ apt-get安裝autoconf autoconf autotools-dev libtool pkg-config zlib1g-dev libcunit1-dev libssl libssl dev libxml2 libxml2-dev libevent libevent-devent libevent-dev
從git構建很容易,但是請確保使用至少使用AutoConf 2.68:
$ autoreconf -i $汽車 $ AUTOCONF $ ./configure $製作
要構建文檔,請運行:
$製作html
這些文檔將根據doc/manual/html/生成。
生成的文檔將不會安裝make install 。
在本節中,我們簡要介紹瞭如何使用Android NDK跨編譯器在Debian Linux上構建Android二進制。
我們提供android-config和android-make腳本,以使構建更加容易。為了使這些腳本起作用,必須以以下方式安裝NDK工具鏈。首先,讓介紹ANDROID_HOME環境變量。我們需要在$ANDROID_HOME/toolchain下安裝工具鏈。用戶可以自由選擇ANDROID_HOME的路徑。例如,要在$ANDROID_HOME/toolchain下安裝工具鏈,請在打開NDK的目錄中執行此操作:
$ build/tools/make-standalone-toolchain.sh -platform = android-9-安裝dir = $ android_home/tool鏈
平台級別在這裡並不重要,因為我們不使用特定於Android的C/C ++ API。
依賴的庫,例如OpenSL和Libevent,應使用工具鏈構建,並在$ANDROID_HOME/usr/local下安裝。我們建議將這些庫構建為靜態庫,以使部署更加容易。 LIBXML2支持當前被禁用。
我們使用Android NDK隨附的Zlib,因此我們不必自己構建它。
在運行android-config和android-make之前,必須將ANDOIRD_HOME環境變量設置為指向正確的路徑。
在android-config之後,運行android-make以編譯來源。 android-make只是包括PATH中交叉編譯器的路徑。因此,如果您獨自包含CORSS編譯器的路徑,則只需運行以照常構建Spdylay和工具即可。
公共API參考可以在線獲得。訪問http://tatsuhiro-t.github.io/spdylay/。所有公共API都在Spdylay/spdylay.h中。記錄了所有公共API函數以及回調功能Typedefs。
SRC目錄包含使用Spdylay庫的SPDY客戶端和服務器實現。這些程序旨在確保Spdylay API在實際實施和調試目的上可靠地使用。請注意,為了構建和運行這些程序,需要使用NPN支持的OPENSL。在撰寫本文時,OpenSSL 1.0.1支持NPN。
SPDY客戶端稱為spdycat 。這是一個簡單的下載器,例如WGET/Curl。它連接到SPDY服務器,並在命令行中獲得資源:
$ src/spdycat -h
用法:spdycat [-oansv23] [-t <seconds>] [-w <window_bits>] [-cert = <cert>]
[-Key = <key>] [-no-tls] [-d <file>] [-m <n>] [-p <proxy_host>]
[-p <proxy_port>] <uri> ...
選項:
-v, - verbose打印調試信息,例如接收/
框架和名稱/值對的傳輸。
-n, - 刪除下載的數據。
-o, - remote-name將下載數據保存在當前目錄中。
該文件名是從URI取下的。如果Uri
以'/','index.html'的結尾用作
文件名。尚未實施。
-2,-spdy2僅使用SPDY/2。
-3,-spdy3僅使用SPDY/3。
-SPDY3-1僅使用SPDY/3.1。
-t,-pimeout = <n> <n>秒後每個請求的超時。
-w, - 窗口= <n>
將初始窗口大小設置為2 ** <n>。
-a, - get-Assets下載資產,例如樣式表,圖像
和從下載中鏈接的腳本文件
資源。只有其起源的鏈接
與鏈接資源相同
下載。
-s, - 施加打印統計。
-h, - 標先在請求中添加標頭。
-cert = <cert>使用指定的客戶端證書文件。
該文件必須採用PEM格式。
-Key = <key>使用客戶端私鑰文件。文件
必須採用PEM格式。
-NO-TLS禁用SSL/TLS。使用-2,-3或-spdy3-1 to
指定要使用的SPDY協議版本。
-d,-data = <file>將文件發佈到服務器。如果給出,數據
將從stdin閱讀。
-m,-multiply = <n>請求每個URI <n>。默認情況下,相同
不要求URI兩次。此選項
也禁用它。
-p,-proxy = <主機>使用此主機作為SPDY代理
-p,-proxy-port = <port>
如果
一個設置
- 色彩色對數輸出。
$ src/spdycat -nv https://www.google.com/
[0.021] NPN選擇下一個協議:遠程服務器提供:
* SPDY/4A4
* SPDY/3.1
* SPDY/3
* http/1.1
NPN選擇了協議:SPDY/3.1
[0.029]握手完成
[0.029] RECV設置幀<版本= 3,flags = 0,長度= 20>
(NIV = 2)
[4(1):100]
[7(0):1048576]
[0.029] recv window_update frame <版本= 3,flags = 0,長度= 8>
(stream_id = 0,delta_window_size = 983040)
[0.029]發送Syn_Stream Frame <版本= 3,flags = 1,長度= 221>
(stream_id = 1,Assoc_Stream_id = 0,pri = 3)
:主持人:www.google.com
:方法:獲取
:小路: /
:方案:https
:版本:http/1.1
接受: */*
接受編碼:GZIP,放氣
用戶代理:spdylay/1.2.0-dev
[0.080] recv syn_reply幀<版本= 3,flags = 0,長度= 619>
(stream_id = 1)
:狀態:302找到
:版本:http/1.1
備用協議:443:quic
緩存控制:私人
內容長度:262
內容類型:text/html; charset = UTF-8
日期:2013年11月19日星期二13:47:18格林尼治標準時間
位置:https://www.google.co.jp/
服務器:GWS
X框架選項:Sameorigin
X-XSS保護:1;模式=塊
[0.080] RECV數據框架(stream_id = 1,flags = 1,長度= 262)
[0.080]發送GOAWE框架<版本= 3,flags = 0,長度= 8>
(last_good_stream_id = 0)
SPDY服務器稱為spdyd ,並提供靜態文件。它是單線螺紋,使用非阻止套接字進行了多路復用連接。使用阻止I/O系統調用讀取靜態文件, read(2) 。它說SPDY/2和SPDY/3:
$ src/spdyd -htdocs =/your/htdocs/-v 3000 server.key server.crt
IPv4:在端口3000上聽
IPv6:在端口3000上聽
協商下一個協議:SPDY/3.1
[id = 1] [1.296]發送設置幀<版本= 3,flags = 0,長度= 12>
(NIV = 1)
[4(0):100]
[id = 1] [1.297] recv syn_stream frame <版本= 3,flags = 1,長度= 228>
(stream_id = 1,Assoc_Stream_id = 0,pri = 3)
:主機:Local主機:3000
:方法:獲取
:路徑: /readme
:方案:https
:版本:http/1.1
接受: */*
接受編碼:GZIP,放氣
用戶代理:spdylay/1.2.0-dev
[id = 1] [1.297]發送Syn_reply Frame <版本= 3,flags = 0,長度= 116>
(stream_id = 1)
:狀態:200可以
:版本:http/1.1
緩存控制:max-age = 3600
內容長度:66
日期:星期二,2013年11月19日14:35:24格林尼治標準時間
最後修飾:2012年1月17日星期二15:39:01格林尼治標準時間
服務器:SPDYD SPDYLAY/1.2.0-DEV
[id = 1] [1.297]發送數據框架(stream_id = 1,flags = 0,長度= 66)
[id = 1] [1.297]發送數據框架(stream_id = 1,flags = 1,長度= 0)
[id = 1] [1.297] stream_id = 1關閉
[id = 1] [1.297] recv goaway frame <版本= 3,flags = 0,長度= 8>
(last_good_stream_id = 0)
[id = 1] [1.297]關閉
目前, spdyd需要epoll或kqueue 。
對於使用SHRPX作為SPDY代理的SHRPX用戶:請考慮在NGHTTP2 Project開發的NGHTTPX遷移到NGHTTPX。 NGHTTPX也支持SPDY代理。
shrpx是SPDY/HTTPS的多線程反向代理。它將SPDY/HTTPS流量轉換為普通HTTP。它最初是作為反向代理而開發的,但現在它具有其他操作模式,例如前端向前代理。例如,使用--spdy-proxy ( -s in shorthand)選項,它可以用作後端中帶有代理(例如,squid)的安全SPDY代理。使用--cliet-proxy ( -p )選項,它的作用像是一個典型的前鋒代理,但期望後端安全的SPDY代理。因此,它成為確保不支持安全SPDY代理的客戶的SPDY代理的適配器。另一個值得注意的操作模式是--spdy-relay ,它僅將SPDY/HTTPS流量轉移到SPDY中的後端。下表總結了操作模式。
| 模式選項 | 前端 | 後端 | 筆記 |
|---|---|---|---|
| 預設 | SPDY/HTTPS | http | 反向代理 |
--spdy | SPDY/HTTPS | http | SPDY代理 |
--spdy-relay | SPDY/HTTPS | SPDY | |
--client | http | SPDY | |
--client-proxy | http | SPDY | 前鋒代理 |
shrpx支持配置文件。請參閱--conf選項和示例配置文件shrpx.conf.sample 。
我們在此處簡要描述shrpx的架構。它具有在服務器插座上傾聽的專用線程。當它接受傳入連接時,它將傳入連接的文件描述符傳遞給工人線程之一。每個工作線程都有自己的事件循環,可以使用非阻止I/O處理許多連接。可以使用命令行選項指定工作線程的數量。 Libevent用於處理低級網絡I/O。
這是命令行選項:
$ SRC/SHRPX -H
用法:shrpx [-dh] [-s | - client | -p] [-b <host,port>]
[-f <host,port>] [-n <cores>] [-c <num>] [-l <Level>]
[選項...] [<Private_Key> <cert>]
SPDY/HTTPS的反向代理。
位置論點:
<private_key>將路徑設置為服務器的私鑰。必需的
除非指定-p或 - client。
<cert>將路徑設置為服務器證書。必需的
除非指定-p或 - client。
選項:
連接:
-b,-backend = <host,port>
設置後端主機和端口。
默認值:'127.0.0.1,80'
-f,-frontend = <host,port>
設置前端主機和端口。
默認值:'0.0.0.0,3000'
-backlog = <Num>設置收聽積壓大小。
默認值:256
-backend-ipv4解決後端主機名到IPv4地址
僅有的。
-backend-ipv6解決後端主機名到IPv6地址
僅有的。
表現:
-n,-workers = <cores>
設置工作線的數量。
默認值:1
- Read-Rate = <PARE>設置前端的最大平均讀取率
聯繫。將0設置為此選項意味著
閱讀率是無限的。
默認值:1048576
- Read-Burst = <size>
將最大讀取突發大小設置在前端
聯繫。將0設置為此選項意味著
讀取突發大小是無限的。
默認值:4194304
- 沃特率= <rate>
在前端設置最大平均寫入率
聯繫。將0設置為此選項意味著
寫入率是無限的。
默認值:0
- - - burst = <size>
在前端設置最大寫突發大小
聯繫。將0設置為此選項意味著
寫突發大小是無限的。
默認值:0
暫停:
-Frontend-spdy-Read-read-limeout = <sec>
為SPDY Frontend指定讀取超時
聯繫。默認值:180
-frontend-read-readimout = <sec>
為非企業前端指定讀取超時
聯繫。默認值:180
-frontend-write timeout = <sec>
指定SPDY和
非穩定前端。
聯繫。默認值:60
- backend-read termout = <sec>
為後端連接指定讀取超時。
默認值:900
- backend-write timeout = <sec>
為後端指定寫入超時
聯繫。默認值:60
- backend-keep-alive timeout = <sec>
為後端指定靜止超時
聯繫。默認值:60
-backend-http-proxy-uri = <uri>
以形式指定代理URI
http:// [<user>:<pass>@] <proxy>:<port>。如果
代理需要身份驗證,指定
<user>和<pass>。請注意他們一定是
正確編碼的百分比。使用此代理
當後端連接為SPDY時。第一的,
向代理提出連接請求,
它代表後端連接
shrpx。這形成隧道。之後,shrpx
與
通過隧道下游。超時
連接和進行連接請求時
可以通過 - backend-read-timeout指定
和 - backend-write timeout選項。
SSL/TLS:
-ciphers = <Suite>設置允許的密碼列表。格式
字符串在OpenSSL密碼(1)中描述。
如果使用此選項,-Honor-Cipher-order
被隱式啟用。
- honor-cipher-rorder
榮譽服務器密碼訂單,給出
減輕野獸攻擊的能力。
-k, - 企圖與-p或 - 委託人一起使用時,請勿驗證
後端服務器的證書。
-CACERT = <PATH>與-p或-lient一起使用時,將路徑設置為
受信任的CA證書文件。
該文件必須採用PEM格式。它可以
包含多個證書。如果是
鏈接的OpenSSL配置為加載系統
廣泛的證書,已加載
在啟動時,無論此選項如何。
- private-key-passwd-file = <filepath>
文件的途徑,其中包含密碼的密碼
服務器的私鑰。如果沒有給出,並且
私鑰是密碼保護的
交互要求。
-subcert = <keypath>:<certPath>
指定其他證書和私人證書
密鑰文件。 SHRPX會選擇證書
基於客戶端指示的主機名
使用TLS SNI擴展。這個選項可以是
多次使用。
-backend-tls-sni-field = <主機>
明確設置TLS SNI的內容
擴大。這將默認為後端
主機名。
-DH-PARAM-FILE = <PATH>
在包含DH參數的文件的途徑
PEM格式。沒有此選項,DHE密碼
套房不可用。
- 授予客戶要求並驗證客戶端證書。
- verify-client-cacert = <路徑>
包含CA證書的文件途徑
驗證客戶端證書。
該文件必須採用PEM格式。它可以
包含多個證書。
--lient-Provate-key-file = <Path>
包含客戶端的文件的途徑
鍵用於後端客戶端身份驗證。
- client-cert-file = <路徑>
包含客戶端的文件的途徑
後端客戶端使用的證書
驗證。
-tls-proto-list = <list>
逗號界定的SSL/TLS協議列表
啟用。
以下協議可用:
TLSV1.2,TLSV1.1,TLSV1.0,SSLV3
名稱匹配是在案例不敏感的
方式。
該參數必須由單個界定
僅逗號,任何白色空間都得到處理
作為協議字符串的一部分。
默認值:TLSV1.2,TLSV1.1,TLSV1.0
SPDY:
-c,-spdy-max-concurrent-streams = <Num>
設置並發的最大數量
在一個SPDY會話中流式傳輸。
默認值:100
-frontend-spdy-window-bits = <n>
設置每次流的初始窗口大小
SPDY前端連接到2 ** <n>。
默認值:16
-Frontend-spdy-connection-window-bits = <n>
設置SPDY的每連接窗口大小
前端連接到2 ** <n>。
默認值:16
-Frontend-spdy-no-tls
在前端禁用SSL/TLS SPDY
連接。必須指定SPDY協議
使用 - -Frontend-spdy-proto。此選項
也禁用前端http/1.1。
-Frontend-spdy-proto
指定前端使用的SPDY協議
連接如果-Frontend-spdy-no-tls是
用過的。默認值:SPDY/3.1
-backend-spdy-window-bits = <n>
設置每次流的初始窗口大小
SPDY後端連接到2 ** <n>。
默認值:16
-backend-spdy-connection-window-bits = <n>
設置SPDY的每連接窗口大小
後端連接到2 ** <n>。
默認值:16
- backend-spdy-no-tls
在後端SPDY連接上禁用SSL/TLS。
SPDY協議必須使用
- backend-spdy-proto
- backend-spdy-proto
指定後端使用的SPDY協議
連接如果 - 使用-backend-spdy-no-tls。
默認值:SPDY/3.1
模式:
-s,-spdy-Proxy啟用安全的SPDY代理模式。
- Spdy-Bridge與SPDY中的後端通信。因此
傳入的SPDY/HTTPS連接是
轉換為SPDY連接並繼電器
後端。參見 - backend-http-proxy-uri
選項如果您在代理後面並想要
連接到外部SPDY代理。
- 客戶而不是接受SPDY/HTTPS連接,而是
接受HTTP連接並與
SPDY中的後端服務器。將SHRPX用作
向前代理,使用-P選項。
-p, - client-proxy like - - client選項,但也需要
前端的請求路徑必須是
絕對URI,適合用作
前鋒代理。
記錄:
-l, - log-level = <級別>
設置日誌輸出的嚴重程度。
信息,警告,錯誤和致命。
默認值:警告
- AccessLog打印簡單訪問件對stderr。
-Systlog將日誌消息發送到Syslog。
- 系統 - 詞素= <facity>
設置Syslog設施。
默認值:守護程序
雜項:
- add-x-forward-for
將X向後標頭字段附加到
下游請求。
- 不via不要通過標頭字段附加。如果通過
收到標頭字段,留給
不變。
-d,-daemon在背景中運行。如果使用-d,
當前的工作目錄已更改為'/'。
-pid-file = <路徑>設置了保存此程序的PID的路徑。
-user = <user>作為用戶運行此程序。此選項是
打算用於降低根特權。
-conf = <路徑>從路徑加載配置。
默認值:/etc/shrpx/shrpx.conf
-v, - Version打印版本和退出。
-h, - 螺旋打印此幫助並退出。
對於那些好奇的人來說, shrpx是“ SPDY/HTTP到HTTP反向代理”的縮寫。
shrpx沒有任何-s -s --spdy-bridge , -p和--client選項,可作為後端服務器的反向代理:
客戶端< - (spdy,https) - > shrpx < - (http) - > Web服務器
[反向代理]
使用-s選項,它可以用作安全的SPDY代理:
客戶端< - (spdy,https) - > shrpx < - (http) - >代理
[SPDY代理](例如,魷魚)
需要將上述Client端配置為使用SHRPX作為安全SPDY代理。
在撰寫本文時,Chrome是唯一支持安全SPDY代理的瀏覽器。配置Chrome以使用安全SPDY代理的一種方法是Create proxy.pac腳本:
功能FindProxyForurl(url,host){
返回“ HTTPS ServerAddr:port”;
}
SERVERADDR和PORT是機器SHRPX的主機名/地址。請注意,Chrome需要有效的安全SPDY代理證書。
然後以以下參數運行Chrome:
$ Google-chrome -proxy-pac-url = file:///path/to/proxy.pac-use-npn
筆記
在撰寫本文時,Chrome 24將最大並發連接限制為代理到32。由於Chrome中插座池處理的限制,如果使用SPDY代理並且建立了許多SPDY會話,則很快就會填充。如果達到極限,則簡單地阻止了新連接,直到定時出現現有連接為止。 (請參閱Chrome第92244頁)。解決方法是使最大連接的最大連接數量為99,這是最高的。為此,您需要更改所謂的策略設置。有關如何更改您使用的平台上的策略設置的詳細信息,請參見策略模板。我們正在尋找的策略名稱是maxConnectionsperproxy,例如,如果您使用的是Linux,請按照Linux快速啟動中所述的指令進行操作,並創建/etc/opt/chrome/policies/managed/test_policy.json File帶有以下內容和Restart Chrome:Restart Chrome:
{
“ maxConnectionsperproxy”:99
}
使用--spdy-bridge ,它接受SPDY/HTTPS連接並與SPDY中的後端通信:
客戶端< - (spdy,https) - > shrpx < - (spdy) - > web或spdy代理等
[SPDY橋](例如,SHRPX -S)
使用-p選項,它可以作為前向代理工作,並期望後端是安全的SPDY代理:
客戶端< - (http) - > shrpx < - (spdy) - >安全spdy代理
[正向代理](例如,shrpx -s或node -spdyproxy)
需要將Client配置為使用SHRPX作為前向代理。
在這種配置中,不支持安全SPDY代理的客戶端可以通過shrpx使用安全的SPDY代理。將shrpx與客戶端放置在同一框或同一網絡中,這種配置可以為這些客戶帶來安全SPDY代理的好處。由於每個服務器的最大連接數仍然適用於代理連接,因此性能增益並不明顯。例如,如果每個服務器的最大連接數為6,則在向代理髮送6個請求後,客戶端將封鎖進一步的請求,這會殺死可能在SPDY連接中獲得的性能。對於可以調整這些值的客戶(例如,firefox中的network.http.max-connections-per-server ),增加它們可能會提高性能。
借助--client選項,它可以作為反向代理,並期望後端是支持SPDY的Web服務器:
客戶端< - (http) - > shrpx < - (spdy) - > Web服務器
[反向代理]
對於與SPDY中後端交談的操作模式,可以通過HTTP代理來隧道隧道。使用--backend-http-proxy-uri選項指定代理。下圖說明了--spdy-bridge和--backend-http-proxy-uri選項的示例,可以通過HTTP代理與外部SPDY代理進行交談:
客戶端< - (spdy,https) - > shrpx < - (spdy) -
[SPDY橋]
- =================== ---> SPDY代理
(HTTP代理隧道)(例如,SHRPX -S)
示例目錄在C中包含一個簡單的SPDY客戶端實現。
圖書館配備了Python包裝紙python-spdylay 。請參閱python目錄。