今天要來講個超冷門的東西,甚至有沒有用我也不是很確定,不過研究了很久才找到可動的方法,就記下來了。
SCPS 是 Space Communications Protocol Specifications 的縮寫,聽起來就很威不是嗎?簡單的說就是太空用的通訊協定。當然也是基於 IP 網路上的 TCP 延伸。
WANEM 則是 WAN 的 emulator,可以用來模擬 WAN 的一些行為,例如衛星的低速與高延遲。
由於沒有衛星可以拿來給我測試,所以透過 WANEM 來做驗証是理所當然的組合了。
系統安裝
為了模擬實際的環境,我們要有5台的虛擬機,其中一台用做於 WANem,兩台用做於SCSP TCP加速,兩台用做於一般的 Client。除了 WANem 自附vmware虛擬機外,其它機器皆自行安裝 Ubuntu 14.04。會安裝這麼舊的版本,主要是 scsp reference design 已經是 25 年前的軟體 (1997),若用現今的 64 bit 程式,不確定可否運行
由於需要複雜的網路配置,這邊需要以 VMWare 做為虛擬機的環境,其網路 Topology 如下。
- WANem: 利用 WANEM 架設的網路模擬器,可以限制頻寬、增加延遲
- GW1, GW2: 運行 SCPS 的機器,基本上可以看成是一個橋接器
- PC1, PC2: 要對通的2台電腦, gateway 分別設定成 WANem 的 eth0 / eth1 IP,這樣才能通訊。
WANEM 下載
WANEM 由於太大,請上其官網下載,本文用的是 2.3 的版本,下載後解壓縮,就可直接用 vmware 執行了。
若有需要,也可將 .iso 檔燒到光碟或隨身碟,在實體機器上執行。
PC 與 GW 的 Ubuntu 14.04 套件需求
本文所有的操作,皆以 root 身份執行,除 WANem 外的虛擬機,其它系統皆安裝 Ubuntu 14.04 的VM,並安裝下列套件。建議使用 Server 的版本會比較省空間和記憶體,Ubuntu 的安裝與設定就不贅述。在安裝好一台虛擬機後,再用複制的方式來產生其它台會比較方便,不用一台台重灌。
1 2 |
apt-get update apt-get install build-essential iptraf vim ctags iperf sysstat p7zip-full iotop unzip git bridge-utils dropbear |
編譯 SCPS
本文所使用的 SCPS 軟體,是由 github 下載,而該來源也不是原作,是由 Wiki 裡所提到的網站下載。由於 scps 太冷門,這是我唯找到可下載源始碼的地方。
Github 內下載的程式碼,在運行時會發生 stack overflow 的錯誤,需套用下列修改。附件的 scps.tar.gz 已是修改過的。
1 2 3 4 5 6 7 8 9 10 11 |
int ll_tap_send (struct _interface *interface, uint32_t remote_internet_addr, int protocol, int data_len, struct msghdr *my_msg, route *a_route, scps_np_rqts *rqts) { int sock = 0; struct sockaddr_in remote_addr; unsigned char linear_buffer[MAX_MTU+512]; /* 此處 +512 */ int length; <... 略 ...> } |
將附件的 scps.tar.gz 放進系統Ubuntu內解壓縮後,用以下命令進行編譯。
1 2 3 4 5 6 7 |
cd scps/apps ./configure cd ../source ./configure --gateway=yes --tap=yes --low_idle=yes --low_cpu=yes --debug=yes cd .. make clean make |
第一次的編譯會失敗,是一個字串定義的問題,也許是之前的 compiler 允許這種寫法吧。所以我們把該字串覆寫再進行一次編譯就好了。
1 2 |
echo "char scps_version[] = \"scps\";" > source/version.c make |
最後編譯完成的執行檔,就在 scps/bin 的目錄下了。
此外依 README.GATEWAY.LINUX.TAP 的文件說明,還要修改一下 scps 的設定。可將下面兩行貼入
1 2 |
echo "AIF_TAP_NAME tap0" >> bin/rfile echo "BIF_TAP_NAME tap1" >> bin/rfile |
並手動將 AIF_NAME 改為 eth0,BIF_NAME 改為 eth1。
scps 的 gateway 檔案運行時,會創建 tap0, tap1 裝置,並分別與 eth0, eth1 橋接成 aif, bif。gateway 程式會去載取 aif / bif 的封包,再決定是否要進行動作,這是我基本的理解。
建立執行腳本
為了方便測試,我們可以在/root建立2個腳本。
1 2 3 4 5 6 7 |
#!/bin/bash ifconfig br0 down brctl delbr br0 ifconfig eth0 up ifconfig eth1 up cd scps/bin ./gateway |
上面的run_scps.sh腳本會運行 scps ,來測試加速的效果
1 2 3 4 5 6 7 8 |
#!/bin/bash killall gateway brctl addbr br0 brctl addif br0 eth0 brctl addif br0 eth1 ifconfig br0 up ifconfig eth0 up ifconfig eth1 up |
上面的run_bridge.sh腳本則套用橋接,用來測試無加速的狀況。
虛擬機配置
在虛擬機的配置,最主要的部份就是要新增網路卡來符合前面提到的 Topology。會選擇 Ubuntu 14.04 來測試,一方面 SCPS 已經是25年前程式了,有可能會不相容64bit 的OS,所以選 14.04。另一方面,在 14.04 上的網卡命名比較傳統,VM 設定的第一張網卡就會是 eth0,第二張就是 eth1,這樣比較好設定。
以下就列出各虛擬的設定,供大家參照。其中 WANem 會多出一個 Host-Only 的介面,是因為要由 PC 來連線其網頁的。
WANem
PC1
PC2
GW1
GW2
開機後設定
此時,將所有的虛擬機開機,逐一設定。
WANEM
WANEM 在開機過程中,會詢問是否用 DHCP,直接選 y 以加速流程。
進入系統後,會有 WANEM 自己的操作 CLI。這邊打入 exit2shell 來進入 Linux 的 shell 系統
接著將 eth0, eth1 如之前 Topology 所示設定 IP,並觀察 eth2 的 IP,用來打開瀏覽進行設定。由於這是手動設定,可能會與內建的 DHCP 有所衝突,若後來又看到 eth0 / eth1 沒有 up , 再手動下一次即可。
然後就可以打開瀏覽器 http://192.168.195.128/WANem 來進行設定
這裡我們設定 eth0 和 eth1 的頻寬都是 20Mbps, 延遲也都是 250ms. 所以從 PC1 ping PC2 ,的時間約為 500ms,這個時間相當於利用地球同步衛星做 ping 所需的時間。
PC1
僅需設定 eth0 IP 與 gateway
1 2 |
ifconfig eth0 192.168.1.1 route add default gw 192.168.1.254 |
PC2
僅需設定 eth0 IP 與 gateway
1 2 |
ifconfig eth0 192.168.2.1 route add default gw 192.168.2.254 |
GW1、GW2 設定
GW1, GW2 與測試有關,我們稍後再設定。
開始測試
我們首先會測試沒加速前的數值,再看一下加速後的狀況。
沒加速前
在 gw1, gw2 下達命令 ./run_bridge.sh 命令,來測試未加速的狀況。
接著在 PC2 執行
1 |
iperf -s -i 1 -w 32k |
在 PC1 執行
1 |
iperf -c 192.168.2.1 -i 1 -t 30 -w 32k |
跑出來的數值大約只有 500k
啟用加速
在 gw1, gw2 下達命令 ./run_scps.sh 命令,來測試scps加速的狀況。
接著在 PC2 執行
1 |
iperf -s -i 1 -w 32k |
在 PC1 執行
1 |
iperf -c 192.168.2.1 -i 1 -t 30 -w 32k |
跑出來的數值有 1.9 Mb 結果,大概有 4 倍的改進。
看了一下scps設定檔 “bin/rfile”,原來是 output 介面被限制在了 2Mbps (BIF_RATE)。修改成20Mbps後,再測試一次可以達到將近 8Mb 的速度,又提升了 4 倍!
從原本的改500Kbps, 到 8Mbps,這改善是很明顯的, 也達到了預期的 TCP 加速效果。
更多參數
其它更多的參數可以參考 scps/doc/GW_config.pdf 的配置,這邊僅就效果做展示。
結語
這種 Long Delay 的網路,可以說是極少數的應用,所在一開始研究 TCP 加速時,資料並不好找,同事還自己刻出了自己的版本。但隨著馬斯克的 StarLink 網路部署,想必也是採用著類似的技術,讓這個學問不再冷門了。
參考
- 【CCSDS】SCPS简介及安装(Linux下TAP方式) –> 網路上的資料真的很少,唯一一篇我看了很久也終於參透
- SCPS Github –> 善心人事9年前撈出的 reference design
- XipLink
- WAN emulator