目录

前言
Bandwidth 与 Round Trip Time
目的地在那里
WiFi 无线上网 / 网络线上网
光纤入屋 / 网线入屋
Google DNS / ISP DNS
修改 MTU 值
  Step 1: 找出 MTU 值
  Step 2: 调整 MTU 值
总结

前言

近日有位很喜欢去旅行的同事向我抱怨自己抢廉航机票成功率极低,他诉说自己已经是 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,不用重启电脑直接生效。

总结

本篇文章带出调整网络设定以提高成功抢购廉航机票的机会率,其实就是一套优化网络连线的教学。笔者希望籍此加深大家对网络的基本认识及提高对学习网络知识的兴趣,却不保证完成以上设定便能成功购机票 ⛑️。无论如何,希望大看完本篇文章後可以纠正一些谬误。如读者有其他抢购廉航机票的绝技,欢迎分享。下次廉航减价活动再一决高下吧!