Closed tiger-yu99 closed 6 years ago
而对于udp流量, UDPspeeder应该是单connection的加速,multi-wan因为使用了iptables,所以对单条flow只能fail over,不能load balance。 所以,我考虑了两种udp load balance方案, 1,修改kcptun的code
没怎么看明白,你要加速udp,而kcptun是加速tcp的,为什么改kcptun也是方案之一?
2,用以上相似的思路,修改udp speeder支持多个connection over multi-wan。
用过几个版本的multi-wan/mwan,这个是基于iptables用脚本实现的,代码也就几百行。以为了配合multi-wan,要改几千行代码的UDPspeeder,不靠谱。 不如对每个连接启动一个UDPspeeder,然后自己在上层用iptables实现负载均衡。
相关ISSUE: https://github.com/wangyu-/udp2raw-tunnel/issues/59
Thanks 1, kcptun确实是用来加速TCP的,所以第一个修改kcptun的设想是: try to 修改他监听tcp socket的接口 变成监听udp socket,默认情况下kcptun client是监听local的TCP IP:port,比如TCP 127.0.0.1:12345,然后kcptun client再使用udp tunnel 转发给kcptun server, 然后kcptun server再转发给另一个TCP的IP:port。修改的想法是先用ss-redir把udp汇聚到UDP 127.0.0.1:port,kcptun client监听UDP 127.0.0.1:port 而不是TCP的,同样,在server上kcptun server转发的时候write to一个UDP IP:port而不是TCP的。虽然UDP over UDP有带宽损耗,但是我的这个项目里面可以忍受20%的overhead. 2, openwrt上的mwan确实是iptables实现的。我的这个项目需求是在router上做透明的udp加速,所以对于整个LAN和WAN之间的UDP traffic,需要先汇聚,然后使用tunnel,我也考虑过基于每个wan建立一个udp speeder tunnel, 但是这样的话,我在multi-wan之上 还需要做一层load balance,探测每个wan的最大带宽,检测每个wan的status是否down, 同时分配不同的udp traffic走不同的udp speeder over不同的wan
"用以上相似的思路,修改udp speeder支持多个connection over multi-wan" 这句话 我可能表达地有歧义,我的意思是:我即使修改了kcptun来转发udp traffic,但是一个kcptun tunnel的多conn在我的router上绕过了multi-wan,只在其中一个wan上建立多个udp socket, 从code上看kcptun应该是直接bind了wan ip 而不需要nat了。因为我是要做个router,要先汇聚所有lan--wan之间的UDP traffic,我想用 "一个tunnel创建多个socket connection over mwan的类似想法" try to 修改udp speeder的底层connection over multi-wan。也就是tunnel的多个socket connection不能直接使用wan ip作为source IP,然后才能经过multi wan做balance,然后做NAT。而使用多个udp speeder的方案,虽然可以控制从router wan到internet的balance,但是对于lan到wan的traffic我没有想到很好的策略去分配udp traffic到不同的udp speeder tunnel
1, kcptun确实是用来加速TCP的,所以第一个修改kcptun的设想是: try to 修改他监听tcp socket的接口 变成监听udp socket,默认情况下kcptun client是监听local的TCP IP:port,比如TCP 127.0.0.1:12345,然后kcptun client再使用udp tunnel 转发给kcptun server, 然后kcptun server再转发给另一个TCP的IP:port。修改的想法是先用ss-redir把udp汇聚到UDP 127.0.0.1:port,kcptun client监听UDP 127.0.0.1:port 而不是TCP的,同样,在server上kcptun server转发的时候write to一个UDP IP:port而不是TCP的。虽然UDP over UDP有带宽损耗,但是我的这个项目里面可以忍受20%的overhead.
你是想udp over kcp ? 基本不可行,不是20% overhead的问题,是丢一个包阻塞掉后续所有包的问题,了解下Head-of-line_blocking:
https://en.wikipedia.org/wiki/Head-of-line_blocking
即使是你想去掉kcptun的kcp协议,只用kcptun的fec,也不行。 kcptun里的fec是专门配合kcp协议的,直接拿来加速udp有很多问题。比如那个fec只有在攒够了足够的包才会做,攒不够包就会一直等着。 还有比如对长度超过MTU的包会在链路层分片,丢包率被放大。
2, openwrt上的mwan确实是iptables实现的。我的这个项目需求是在router上做透明的udp加速,所以对于整个LAN和WAN之间的UDP traffic,需要先汇聚,然后使用tunnel,我也考虑过基于每个wan建立一个udp speeder tunnel, 但是这样的话,我在multi-wan之上 还需要做一层load balance,探测每个wan的最大带宽,检测每个wan的status是否down, 同时分配不同的udp traffic走不同的udp speeder over不同的wan
对于udp,弃用multi-wan。 直接每个物理连接启动一个UDPspeeder,然后在上层用iptables负载均衡。这样是个两层结构(udpspeeder+iptables),而不是三层(multi-wan+udpspeeder+iptables),不存在"multi-wan之上 还需要做一层load balance"的问题。
提醒你一下,不要觉得有Multi-wan帮你做负载均衡就高枕无忧了,这个东西实现得简单暴力,很多情况下都不能很好得工作。比如说吧,你有2个连接一个丢包很高带宽大,另一个丢包很低带宽小,Mutli-wan直接就傻眼了。 这种情况只能开2个UDPspeeder,对丢包大的链接用高冗余,丢包小的用低冗余,在上层负载均衡。
“提醒你一下,不要觉得有Multi-wan帮你做负载均衡就高枕无忧了” 确实如此,所以,我想try一下用udp speeder做一些纠错。否则 我就直接去修改ss-redir底层tunnel做成多个udp socket over mwan了。如果这几个方案在弱网情况下,效果太差,只能尝试特定App单独做udp重发。 thanks
"对于udp,弃用multi-wan。 直接每个物理连接启动一个UDPspeeder,然后在上层用iptables负载均衡。这样是个两层结构(udpspeeder+iptables),而不是三层(multi-wan+udpspeeder+iptables),不存在"multi-wan之上 还需要做一层load balance"的问题。" 是的,我说的multi-wan之上,意思是浪费了multi-wan的balance功能,然后重新使用iptables做了类似multi-wan的部分功能。不过这都没有问题。使用多路upd speeder对我的困扰是: 我没有好的policy去balance从lan到wan的udp traffic分配到不同的udp speeder tunnel,我希望lan到wan的某个udp socket可以使用多个wan口的bandwidth。
我没有好的policy去balance从lan到wan的udp traffic分配到不同的udp speeder tunnel
multi-wan也一样没有好的policy,只是有个能用的policy,不要对几百行脚本期望太高。
我希望lan到wan的某个udp socket可以使用多个wan口的bandwidth。
据我所知multi-wan mwan所能做的也是连接级的负载均衡(udp无连接,但是对conntrack来说有连接), 不能做到packet级的负载均衡。同一个udp socket发出的多个连接,可以负载均衡,multi-wan或是我说的开2个UDPspeeder+iptables自己负载均衡都可以。
是的,mwan不能均衡一个socket连接的packets,所以想先汇聚,然后拆成几个socket连接,可以接受一定程度的多倍发包,虽然 预测不同path的带宽和延时 很多情况下也不准确,但还是希望可以有类似mptcp的多sub flow的方式尽量保证数据传输(接受一定程度的彻底丢包,具体看实测情况),且高于mptcp的带宽利用率。 我考虑的理想模型是: udp speeder's fec + multi sub flows/connections + packet-scheduler over multiple sub flows based on bandwidth-prediction and latency-test of multi sub flows. 多sub flows很可能要依赖sequence,所以你highlight的blocking issue确实在某些情况下会有很大的latency。这个可能尝试再tune一下timeout允许快速彻底丢包看看效果,毕竟在所有运营商的4G信号都极其差的情况下,软件上也没有太好的办法。 可能考虑用packet scheduler on sub flows的方式来弱化mwan粗暴的balance,也就是你说的自己做balance。 多谢
所以想先汇聚,然后拆成几个socket连接,可以接受一定程度的多倍发包
你想走这个思路也可以,UDPspeeder本身就有汇聚作用,你可以自己实现个UDP小程序,把一个连接的packet分散到多个连接上。
UDPspeeder client---->multipath-udp-tunnel client---(多径)--->multipath-udp-tunnel server---> UDPspeeder server
这样就是在UDPspeeder的下层做负载均衡。跟在UDPspeeder上层做负载均衡比起来,各有优缺点,自己权衡吧。
虽然 预测不同path的带宽和延时 很多情况下也不准确
我以前考虑过实现multipath-udp-tunnel。就像你说的,不同path带宽延迟不同,预测/测量起来比较麻烦。最大的问题是延迟不同,可能会造成剧烈的延迟抖动,上层应用不一定受得了,要抹平延迟抖动只能让快的等慢的。我觉得这个东西即使做出来也难以完美,所以就没做。 如果你要求不高的话,简单做个能用的,应该可以做出来。
但还是希望可以有类似mptcp的多sub flow的方式尽量保证数据传输
不了解mptcp的多sub flow,不清楚你具体想达到什么样的效果。但是可靠传输(tcp)/不可靠传输(udp)的多径做起来应该区别很大,未必可以把TCP的思路套用在UDP上。
所以你highlight的blocking issue确实在某些情况下会有很大的latency。这个可能尝试再tune一下timeout允许快速彻底丢包看看效果.
你的意思是仍然用UDP over KCP,只是加个timeout减弱head-of-line-blocking?感觉你还是在用可靠传输的思路解决不可靠传输的问题。
另外MLVPN了解下,也许它能解决你的一部分问题。
Thanks 我了解一下mlvpn。另外,找到一个 https://github.com/SPYFF/mpt 用GRE in UDP多层封装,准备部署到我的router上,测一下overhead以及弱网环境下的latency和throughput。但是感觉上 还是udp speeder + packet scheduler on多路 = 效率更高。后续我看看能不能把mlvpn, mpt, mptcp这些项目里面实现的多径传输和调度算法 用在前面提到的组合上。
你好, 我用了ss + mptcp + bbr 在OpenWrt multi-wan上做TCP的load balance。 而对于udp流量, UDPspeeder应该是单connection的加速,multi-wan因为使用了iptables,所以对单条flow只能fail over,不能load balance。 所以,我考虑了两种udp load balance方案, 1,修改kcptun的code, 让client和server在本地都listen to UDP socket。 同时修改kcptun的conn创建方式,例如通过ip -4 route list default 获取所有wan gateway的ip。然后在多个ip上创建connection。因为我测试了一下,即使conn参数是2,且有两个wan的情况下,kcptun也只选择了某一个wan建立与server的2个connection 2,用以上相似的思路,修改udp speeder支持多个connection over multi-wan。 因为我这个产品的wan是4G,在移动环境下使用。 请给一些comments,十分感谢