n(str(x) for x in range(1, count + 1))))
print(' --: '.join('|' * (count + 3)))
for name, port in testcases.items():
speed_list = test_multi_times(port, count)
speed_list.append(sum(speed_list) / len(speed_list))
print('|{}|{}|'.format(name, '|'.join('{:.0f}'.format(x + 0.5)
for x in speed_list)))
if __name__ == '__main__':
main()
运行后得到结果如下(速度单位是Requests/s):
switcher |
14367 |
14886 |
15144 |
14289 |
15456 |
14834 |
14871 |
14951 |
14610 |
14865 |
14827 |
sslh |
13892 |
14281 |
14469 |
14352 |
14468 |
14132 |
14510 |
14565 |
14633 |
14555 |
14386 |
Direct |
20494 |
20110 |
20558 |
19519 |
19467 |
19891 |
19777 |
19682 |
20737 |
20396 |
20063 |
类似前面的测试,RPS在经过代理后也存在较明显下降。sslh比switcher略低,差异不大。
更多应用场景 ??
本文描述的网络端口复用,其实现方式本质上还是一个TCP应用代理。基于这一点,我们还可以扩展出很多其他的应用场景。
我想到的一种场景是动态IP认证。我们对HTTP和SSH进行复用,默认情况下HTTP可以被所有人访问,但SSH却需要通过IP地址认证后才会进行包转发。跟iptables等防火墙实现的IP地址访问规则不同,它是在应用层面来进行限制的,具有很强的灵活性,可以通过程序动态增加和删除。比如说,我通过手机浏览器访问特定的鉴权页面,通过验证后,系统自动将我当前在用的公网IP地址加入到访问列表,然后就能够顺利地通过SSH访问服务器了。连接建立后,可以将临时IP地址从访问列表中剔除,从一定程度上加强了服务器安全。