你有没有遇到过这种情况:在家连Wi-Fi,网页半天打不开,视频一直转圈,游戏卡得没法玩。一测网速,下载速度看着还行,但延迟动不动就上千毫秒。这时候别急着重启路由器,问题可能出在‘内网穿透’这个环节上。
延迟高不等于带宽小
很多人以为上网卡就是宽带不够,其实不一定。比如你在家里搭了个NAS,想在外面用手机访问,结果连上去慢得像蜗牛爬。明明运营商给的带宽不小,为什么还是这样?因为你的请求数据绕了太多弯。
典型的场景是:你在外连家里的设备,数据先发到公网服务器,再被转发回你家路由器,路由器还得把请求转给目标设备。这一来一回,每一跳都可能增加延迟。尤其是没有做好内网穿透时,系统只能靠NAT转发硬扛,效率低,延迟自然飙升。
传统端口映射的局限
以前解决这个问题常用路由器做端口映射,也就是手动在路由器里设置哪个外网端口对应哪个内网IP和端口。比如把外网8080端口映射到内网192.168.1.100的80端口。
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
这方法看似简单,但实际用起来问题不少。一是公网IP难获取,很多家庭宽带分配的是内网IP,根本没法直接映射;二是每次换网络环境就得重新配,手机一连公司Wi-Fi就失联;三是开放端口多了容易被扫到,安全隐患大。
反向代理式内网穿透更靠谱
现在更流行的做法是用反向代理型内网穿透工具,比如frp、ngrok这类。它们的工作原理是让家里的设备主动连接一台有公网IP的中转服务器,建立一条长连接隧道。外部访问时,请求先到中转服务器,再通过已建立的隧道转发回来。
这种方式的好处是不用暴露路由器的管理界面,也不依赖固定的公网IP。更重要的是,连接一旦建立,后续通信路径稳定,延迟明显降低。哪怕你用的是动态IP或者被ISP套了多层NAT,照样能通。
优化延迟的小技巧
用frp这类工具时,可以调整心跳间隔和压缩选项来减少传输开销。例如在客户端配置里开启加密压缩:
[common]
server_addr = x.x.x.x
server_port = 7000
pool_count = 5
tcp_mux = true
use_encryption = true
use_compression = true
同时尽量选择离你物理位置近的中转服务器。比如你在北京,服务器却架在新加坡,那来回光速延迟就得上百毫秒,再怎么优化也白搭。有条件的话,用国内云厂商的轻量服务器做节点,延迟能压到50ms以内。
另外记得限制并发连接数,避免某个设备疯狂刷请求拖累整体响应。有些智能摄像头默认一直上传预览流,很容易占满通道。可以在穿透服务端加连接数限制:
max_pool_count = 10
max_ports_per_client = 5
这样一来,即使某台设备出问题,也不会让全家都上不了网。
别忘了本地网络本身的问题
有时候延迟高不是穿透的问题,而是自家网络太乱。比如多个设备同时下载、智能家居设备频繁上线掉线、Wi-Fi信号干扰严重。建议把跑穿透服务的设备接到有线网络,避开Wi-Fi波动。同时关闭不必要的后台同步任务,给关键服务留出资源。
实在不行,换个支持QoS功能的路由器,把穿透流量标记为高优先级,也能有效改善体验。