從搶購廉航機票探討如何改善網絡效能

前言

近日有位很喜歡去旅行的同事向我抱怨自己搶廉航機票成功率極低,他訴說自己已經是 1G 寬頻的用家,不明白為什麼購票時網速總是很慢。普羅大眾認為用 1G 寬頻搶機票比 100M 的有優勢是一個謬誤。本人好歹也是個網絡專才,覺得應該對這些都市傳聞解釋一下,順道從專業角度教教大家怎樣才是提高搶機票成功率的正確方法。

Bandwidth 與 Round Trip Time

各大網絡供應商 (ISP) 所宣傳的頻寬 (Bandwidth) 只是構成網絡連線效率的其中一部份。Bandwidth 的意思是客戶每秒鐘可傳送或接收資料的上限。重點是上限!極多因素可以影響 Bandwidth 能否被用到上限,包括傳送和接收雙方電腦的效能、網絡器材設定和網絡擠塞狀況等等。當廉航公司推出廉價機票時,成千上萬的用戶同時載入網頁,網頁伺服器和網絡根本應接不下大量的需求,導致網頁下載速度極慢,這時候,任憑你有多少 Bandwidth上限,根本用不著。因而高 Bandwidth 對成功搶機票沒有太大幫助。

那麽,勝利的關鍵在那裡呢?答案是來回時間 (Round Trip Time,RTT)。RTT 是本機所發出的網絡數據到達目的地然後再回到本機的時間。試想想,現在有兩條能到達相同目的地的公路,公路 A 可以 8 線行車,但是彎彎曲曲,而公路 B 只能 2 線行車,卻是一條直路。要用其中一條公路來回走一次,那條較快呢?當然是公路 B。公路 A 好比一條 Bandwidth 高而 RTT 長的路徑,而公路 B 正好相反,雖然 Bandwidth 小但 RTT 短。

航空公司的伺服器處理量有限,可以幻想成公路末端的收費站,正常情況下是足以應付從公路上抵達的車輛。但開售廉價機票時,大家就一起衝去這些收費站,能夠衝進去的是因為他比較快到達收費站。由此可見,減少 RTT 才是成功購票的要訣。

目的地在那裡

在學習如何減少 RTT 之前,先要了解目的地在那裡,與及如何量度 RTT。以香港的快運航空為例,網址是 www.hkexpress.com,只要 ping 一下便知道 IP 是 192.229.189.234。根據 iplocation.net 的記錄,這是位於美國維珍尼亞州的 IP。可是當點進預訂機票時,網頁就連到 booking.hkexpress.com,IP 是 47.89.6.143,位於香港。很明顯,我們的目標應該是 47.89.6.143 這組 IP。

optimizing-network-performance

optimizing-network-performance

從 ping 可以看到我家電腦與目的地的來回時間大約是 6 至 21 ms (毫秒)。

PING 47.89.6.143 (47.89.6.143): 56 data bytes
64 bytes from 47.89.6.143: icmp_seq=0 ttl=45 time=21.479 ms
64 bytes from 47.89.6.143: icmp_seq=1 ttl=45 time=9.735 ms
64 bytes from 47.89.6.143: icmp_seq=2 ttl=45 time=6.005 ms
64 bytes from 47.89.6.143: icmp_seq=3 ttl=45 time=14.056 ms
64 bytes from 47.89.6.143: icmp_seq=4 ttl=45 time=10.339 ms
64 bytes from 47.89.6.143: icmp_seq=5 ttl=45 time=8.062 ms
^C
--- 47.89.6.143 ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 6.005/11.613/21.479/5.042 ms

即是說,從我的電腦出發,經過 Wifi 到達家用無線 Router,再去到 ISP 的 modem,然後經光纖或網絡線到達樓層的機房,再經過光纖連到 ISP 地區機樓,又經過大大小小不同的網絡公司的網絡儀器,到達數據中心,找到 47.89.6.143 這台伺服器,再由伺服器經過剛才的路徑回到我的電腦 (來回所經過的網絡儀器可能未必相同,但路徑大致一樣),只不過用了 6 至 21 ms。好像已經很快了,可是,要在瘋搶廉價機票的戰爭中突圍而出,決勝於千份一秒,必需縮短這 RTT 才能增加勝算。

optimizing-network-performance

參考文章:End to end delay 端到端延時

WiFi 無線上網 / 網絡線上網

特價機票一出,各家庭必把所有能上網的東西都拿出來,除了電腦之外,電話、iPad、手提電腦通通連接無線 Router 來試搶機票。但這是很傻的,由於在使用同一無線頻譜時,同一區域只能容許一組訊號傳送,如兩個上網裝置同一時間發訊號則會造成碰撞,其中一方需要等待其他訊號完成才可傳送。裝置越多則發生碰撞越多,雖然這等待只是一瞬間,平時很難察覺得到。但搶機票是一項爭分奪秒的競技!等待就增加了 RTT,為了減少碰撞機會,能插網絡線的裝置就應該用網絡線,讓整個無線網絡環境減少碰撞,有效減低 RTT。

另外,如果打算只用一台電腦集中攻擊的話,就乾脆拿掉無線 Router 直接把電腦插進供應商提供的 Router/Modem,因為每件網絡裝置都會產生 Processing Delay,電腦直接插供應商設備可減少 RTT。

光纖入屋 / 網線入屋

有些 ISP 會標榜光纖入屋,即由樓層機房至屋內的一段為光纖線材,因此速度提升。但科學告訴我們,網絡線的訊號速度約為光速的 3 份之 2,光纖線則與光速相若,因此以一百米線段來計算,光纖傳輸時間比網線快 0.000001 秒,一來一回則對 RTT 貢獻 0.000002 秒的改善。的確有快了,但效果並不明顯。除非你的住所樓層有 100 公里闊,而你剛巧住在距離機房最遠的單位。

參考文章:Copper Twisted Network Cable 銅製雙絞線Optical Fiber Cable 光學纖維網絡線

Google DNS / ISP DNS

剛才說過,網址 booking.hkexpress.com 的 IP 是 47.89.6.143。網絡世界的機器只認 IP,但人腦記住數字就很困難,所以我們只會記網址。當我們輸入網址後,電腦會去找網絡上的 DNS Server,把網址轉成 IP,稱為解析 (Resolve)。一般具備網絡知識的用家,會認為 Google DNS (8.8.8.8 / 8.8.4.4) 比較快,我認為不一定,大家可以用 dig 這個指令去比較一下 Google 與自己 ISP DNS Resolve 速度。(dig 是 Mac OS 內建指令,如 Windows 則可參考這裡另行安裝。)

執行 dig a @<DNS IP> booking.hkexpress.com,並記錄 Query Time,Google DNS IP 是 8.8.8.8 或 8.8.4.4,至於要測試 ISP DNS 回應時間則需上網查找一下你所使用的 ISP 的 DNS IP。

MacBook:~ Jan$ dig a @8.8.8.8 booking.hkexpress.com

; <<>> DiG 9.8.3-P1 <<>> a @8.8.8.8 booking.hkexpress.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<;; Query time: 158 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Oct 21 11:56:45 2017
;; MSG SIZE  rcvd: 112

每個 DNS 各測試 5 次並把 Query Time 記錄下來。

第 1 次 第 2 次 第 3 次 第 4 次 第 5 次 平均
Google 158 31 32 77 31 65.8
筆者使用的 ISP 4 5 4 4 3 4

由此可見,使用 Google DNS 並非一定較快,建議大家也測試一下再決定選用那組 DNS IP。雖然瀏覽器會把最近一次 Resolve 結果記錄下來,但始終會因為過期而刪掉。為了減少因為 Resolve 時間而輸掉廉價機票的風險,還是建議設定一組較快的 DNS。如果想使用 ISP 的 DNS Server,在電腦的區域連線 TCP/IP 設定選用自動取得 DNS 伺服器位址便可以,如要轉用 Google DNS,則需自行輸入,如下圖。

optimizing-network-performance

不過筆者還有一個絕技,就是把 DNS Resolve 結果直接加在電腦內,以後便不用透過 DNS 查詢,贏在起跑線!

Windows 用戶可找出記事本 Right Click 選以系統管理員身份執行,然後打開以下檔案:C:\Windows\System32\drivers\etc\hosts,把 Resolve 結果直接加進檔案中,建議加入 booking.hkexpress.com 和 www.hkexpress.com 兩項紀錄。

optimizing-network-performance

Mac OS 用戶則可到 Terminal 輸入 sudo nano /etc/hosts,輸入管理員密碼後就可進行修改。

optimizing-network-performance

修改 MTU 值

MTU 是 Maximum Transmission Unit 的縮寫,MTU 就像一個訊息的框框,如果我們要傳送的訊息容量大過這個框框,訊息就需要被切割成多於一個訊息框送出。以寄送郵包作例子,MTU 就是每個郵包的重量上限,如果超重,必需把郵包分成兩個或更多的小郵包寄出,避免過重。舉例,我們填好了購機票的資料包括姓名、Passport 號碼和付款資料等,按下確定傳送給航空公司伺服器,假設要傳送的資料有 2,500 Bytes,可是通往伺服器的網絡 MTU 只是 1,000 Bytes, Router 便會把資料分割成 3 個訊息,分別是 1,000 Bytes + 1,000 Bytes + 500 Bytes。這只是一個簡化了的例子,為了讓讀者易於明白,忽略了計算每個訊息的 Header。 (Header 就像是為每一個訊息框寫上目的地資料等訊息。) 由此可見,如果送出訊息過大,需要 Router 做分割,問題是什麽?是速度啊!為了省掉 Router 做分割的時間,我們可以在發出訊息前,預先找出 MTU 值,並把產生的訊息大小限制在 MTU 值以下,以確保訊息送出後不用進行分割,步驟如下。

Step 1: 找出 MTU 值

MTU 值會因應網絡環境而有所不同,包括網絡儀器設定、上網制式或加密設定都會有影響。我們可以用以下方法找出 MTU 值。

使用指令 ping -f -l 1500 google.com,-f 是禁止 Router 做分割,1500 是訊息容量。

C:\Users\jan>ping -f -l 1500 google.com

Ping google.com [172.217.25.14] (使用 1500 位元組的資料):
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。

172.217.25.14 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 0, 已遺失 = 4 (100% 遺失),

不斷把訊息容量減少直至成功收到回應

C:\Users\jan>ping -f -l 1473 google.com

Ping google.com [172.217.25.14] (使用 1473 位元組的資料):
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。
需要切割封包,但已設定 DF 旗標。

172.217.25.14 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 0, 已遺失 = 4 (100% 遺失),

C:\Users\jan>ping -f -l 1472 google.com

Ping google.com [172.217.25.14] (使用 1472 位元組的資料):
回覆自 172.217.25.14: 位元組=64 (已傳送 1472) 時間=5ms TTL=53
回覆自 172.217.25.14: 位元組=64 (已傳送 1472) 時間=5ms TTL=53
回覆自 172.217.25.14: 位元組=64 (已傳送 1472) 時間=4ms TTL=53
回覆自 172.217.25.14: 位元組=64 (已傳送 1472) 時間=4ms TTL=53

172.217.25.14 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 4ms,最大值 = 5ms,平均 = 4ms

以上例子顯示訊息容量 1,472 Bytes 成功傳送,由於 Ping 的 header 是 28 Bytes (IPv4 header 20 Bytes + ICMP header 8 Bytes),因此只要把結果加上 28 Bytes 就是 MTU 值了,即 1,500 Bytes。現今大部份家用寬頻的 MTU 值都是 1,500 Bytes,如使用 ADSL (即 PPPoE) 則會是 1,492 Bytes。如果是商用網絡可能會由於加密或 VLAN 而令 MTU 變得更少,需要在公司裡進行購票活動的同事要注意了。

Step 2: 調整 MTU 值

如果你計算出 MTU 值的結果是 1,500 Bytes,恭喜你,Windows 與 Mac OS 預設的 MTU 值剛好是 1,500 Bytes,不用更改。否則,你可以用 netsh 指令修改。

以系統管理員身份執行命令提示字元,然後執行 netsh interface ipv4 set subinterface “<Interface 名>” mtu=<新 MTU 值> store=persistent

 C:\Users\jan>netsh interface ipv4 set subinterface "區域連線" mtu=1400 store=persistent

重新啟動電腦就發現 MTU 已經更改了。

 C:\Users\jan>netsh interface ipv4 show interfaces

Idx     Met         MTU          狀態                 名稱
---  ----------  ----------  ------------  ---------------------------
 17          25        1500  connected     VirtualBox Host-Only Network
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
  6          35        1500  connected     VMware Network Adapter VMnet1
  8          35        1500  connected     VMware Network Adapter VMnet8
  9          25        1400  connected     區域連線

而 Mac OS 則使用 networksetup -setMTU en0 1400,不用重啟電腦直接生效。

總結

本篇文章帶出調整網絡設定以提高成功搶購廉航機票的機會率,其實就是一套優化網絡連線的教學。筆者希望籍此加深大家對網絡的基本認識及提高對學習網絡知識的興趣,卻不保證完成以上設定便能成功購機票 ⛑️。無論如何,希望大看完本篇文章後可以糾正一些謬誤。如讀者有其他搶購廉航機票的絕技,歡迎分享。下次廉航減價活動再一決高下吧!

相關主題

發佈留言

2017-10-22

Posted In: 其他技術 Others

Leave a Comment