为什么科学上网是科学的
因为最近对网络传输层协议进行了一番调研,对当代互联网的基础设施有了全方位的立体认识,当然也包括科学上网的传输原理。这里就具体讲一讲我对科学上网之科学性有何新认识。其实很多内容都是老生常谈,但是我希望补充一点视角。
首先谈论一下一些定义,诸如“机场”,“起飞”,“落地”,“中转”,“入口”,“出口”等概念。(补充)
已经被广泛讨论的好处
提升至传输层的好处
- 常常提及的一点是DNS从本地移到了落地侧进行。
- 更好的路由,直连避免绕路。
- 更好的链路(CN2,CMI,IPLC等),避免丢包。
TCP层面的优化
实际上机场还做了一件事情,就是把单个TCP连接分成多个串联的TCP连接。这种方式改变了原来连接的端到端特性,带来了以下潜在好处:
- 如果假设每一跳丢包概率独立,那么原来的单个TCP的连接的丢包率是现在每个参与串联的TCP连接丢包概率的乘积。也就是说,每个单一的TCP连接的丢包概率更小了。
- 每个TCP连接有更小的RTT,这使得反馈控制更加高效,重传、速率恢复都更加及时。
- 由于两头设备的TCP协议栈通常无法修改,这种方式减小了两头TCP流控对整个传输的影响,机场方可以着重优化中间这段的TCP。
下面的这个实验可以验证TCP分段的机制。 首先,以下拓扑是通常上网的流程:
本地设备 ------TCP------ 远端服务
使用机场后TCP至少会分成两段进行,这是因为机场通常提供的是加密TCP代理服务,本地连接机场的实际上是一个代理协议的TCP连接,而机场到远端是被代理的实际TCP链接,这两个TCP连接自然不是同一个。常见的中转型机场更是把传输层分成了三段,即下图的情况:
本地通常用诸如SS协议
本地设备 --TCP-- 机场入口 ---- 机场出口 --TCP-- 远端服务
我们可以通过测量RTT的方式来进行验证。第一段RTT可以通过tcping来进行测量,计为RTT1。最后一段RTT可以通过在远端运行iperf3程序,然后查看测算出的TCP RTT数值,计为RTT2。如果RTT1+RTT2与本地到远端的距离相符,那么我们可以视为两段TCP;如果RTT1+RTT2显著小于上述距离,则中间还有一段TCP是隐藏的。隐藏的TCP通常是机场入口到机场出口的专线连接。
我们在深圳向华南的机场入口进行tcping测试,得到RTT1大约是10ms左右:
➜ ~ tcping hidden.domain.here yyyyy
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 26.977ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 13.107ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 11.418ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 16.292ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 10.029ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 11.629ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 31.357ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 11.012ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 35.704ms
hidden.domain.here:yyyyy has address: xxx.xxx.xxx.xxx:yyyyy - Connected - 69.483ms
Ping statistics hidden.domain.here:yyyyy
10 probes sent.
10 successful, 0 failed.
Approximate trip times:
Minimum = 10.029ms, Maximum = 69.483ms, Average = 23.701ms
我们在本地通过iperf3使用代理连接位于日本大阪的iperf3服务器,命令如下:
iperf3 -c XXX.XXX.XXX.XXX -p 12345 -R
当使用机场东京的节点时,远端iperf3显示结果如下,可以看到此时RTT2也为10ms左右:
root@unknown:~/iperf-3.11# iperf3 -s --json -p 12345 | grep rtt
"rtt": 8014,
"rttvar": 237,
"rtt": 21207,
"rttvar": 20504,
"rtt": 16051,
"rttvar": 14332,
"rtt": 20545,
"rttvar": 19737,
"rtt": 21202,
"rttvar": 20611,
"rtt": 21202,
"rttvar": 20611,
"rtt": 20911,
"rttvar": 19984,
"rtt": 20911,
"rttvar": 19984,
"rtt": 20645,
"rttvar": 19614,
"rtt": 7945,
"rttvar": 95,
"rtt": 7990,
"rttvar": 144,
"max_rtt": 21207,
"min_rtt": 7945,
"mean_rtt": 16965,
显然这说明到远端服务器的TCP是从机场出口开始的而非机场入口。作为验证我们又使用机场香港节点进行相同测试,远端iperf3结果如下:
root@unknown:~/iperf-3.11# iperf3 -s --json -p 12345 | grep rtt
"rtt": 57932,
"rttvar": 36,
"rtt": 73185,
"rttvar": 24815,
"rtt": 75732,
"rttvar": 24646,
"rtt": 71160,
"rttvar": 17239,
"rtt": 80564,
"rttvar": 26611,
"rtt": 86339,
"rttvar": 31206,
"rtt": 78852,
"rttvar": 26721,
"rtt": 83994,
"rttvar": 30324,
"rtt": 80714,
"rttvar": 28751,
"rtt": 61555,
"rttvar": 7384,
"rtt": 71581,
"rttvar": 21469,
"max_rtt": 86339,
"min_rtt": 57932,
"mean_rtt": 74691,
即此时的RTT2是65ms左右,与香港到大阪的延迟相符。