This topic created in 3490 days ago, the information mentioned may be changed or developed.
标题的 pluggable 借自 tor 的 obfsproxy ,设想的用法相同。
设想 site a 到 site b 有带宽、延迟相近的多条链路,之间用 ovpn 连接。
例如 site a 有 3 条 20Mbps/4Mbps 的 pppoe ,
site b 有 1 条 100M 对等的固定 ip 线路。
为何没有一种超级简单的办法,从 site a 到 site b 的一个 tcp 连接(比如说 ovpn )可以负载均衡到不同线路上呢?可以获得接近 60Mbps/12Mbps 的带宽呢?
或者 udp ?
其中的主要技术障碍在哪,造个轮子出来有多难?
Supplement 1 Oct 25, 2016 为了简化问题,先不讨论具有拥塞控制的 tcp , 假设搞一个 udp over udp/kcp/tcp 的 tunnel ,
也避免讨论使用 ipset 策略路由等手段在 1 台机器上连接同一个目标 ip 走不同公网出口。
举例描述:
b 侧一台机器,监听一个端口,映射到公网, 收到数据进行 缓存&排序&地址转换 发给 b 侧的 vpn server ;
其缓存的时间是 3 条线路最慢的那条的延迟稍增加一点;
a 侧,起 4 台 vm ,
其中 3 台 vm 使用不同的网关,内网 ip 192.168.1.11/12/13, 分别监听一个端口,收到数据转发给 b 侧的机器;
1 台 vm 运行 1 个程序监听 localhost:xxxx ,
将收到的数据负载均衡到 11 12 13 3 台机器上出去, 并运行 vpn client 连接到 localhost:xxxx
如果 udp over udp ,丢包率=3 条线路叠加,延迟约等于其中最慢的线路的延迟。
这个过程应该甚至不需要 root 权限(除了 vpn server 和 client 未必),不是很容易 kernel panic 吧。
然而并无现成的轮子可用? 是我在哪里把问题想地简单了, 或者需求较少的原因?
6 replies 2024-10-30 01:09:02 +08:00  | | 2 raysonx Oct 25, 2016 如果 site A 到 B 有多条 TCP 连接,是可以把不同的连接均衡到不同链路上的。 但是,如果是同一条 TCP 连接的话, TCP 在设计上一条连接只有一个 source IP 和一个 destination IP ,如果你的 site A 不同链路 IP 是不同的,就无法单纯通过 TCP 解决了。当然,套层隧道还是可以的。 UDP 本身无连接,只要你设计好上层协议毫无压力。 |
| | 3 est Oct 25, 2016 tcp 是内核实现的。。。内核做 module 也是可行的。。只不过需要 root 。很多 openvz 的可能各种兼容性问题。。。
还有就是代码写的不好就 kernel panic 了。。
要多链路多 demultiplexing 的方案还是有的,基于 UDP 和 IP 的应该都有。免费开源的就不知道咯。 |
 | | 4 jedihy Oct 25, 2016 多路 TCP 没你想的那么简单,目前在学术界是一个热门的研究领域,在数据中心网络中有部分已经在使用了。 举一个简单的例子,多路 TCP 那么多乱序的怎么去拼接?广域网内各链路拥塞程度不一样,整个传输性能瓶颈会卡在最慢的那条流上,如何避免,重发?拥塞窗口怎么控制?丢一个包降多少窗口?是不是会增加丢包率?每条流权重是不是一样,不一样的话怎么控制? |
 | | 5 flyfishcn Oct 25, 2016 带宽叠加都是基于多连接的。基于链路聚合这种的只能完成 OSI 二层下的内容。一旦涉及协议了,单连接是无法聚合的。 |
 | | 6 bybyte Oct 30, 2024 有的,我试过,一个 tcp 链接通过多个链路发出,实现思路就是在本地把 tcp 打散为基于 udp 的可靠协议,例如 kcp ,然后 udp 想怎么发就怎么发了,通过 N 个链路转发都行,只要发到目的地,然后把 udp 再转回去就行了,即使其中任意一条链路断开或者延迟都不影响这一整条 tcp 链接都断开,但是这样做就会浪费很大的带宽,但是提高了可用性 |