Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BBR over UDP的可能性 #23

Open
ccaapton opened this issue Sep 6, 2017 · 3 comments
Open

BBR over UDP的可能性 #23

ccaapton opened this issue Sep 6, 2017 · 3 comments

Comments

@ccaapton
Copy link

ccaapton commented Sep 6, 2017

貌似大佬你对lkl很了解,想邀你讨论下udp上面bbr:) 这个想法动机有这么几个:

  1. 个人比较抵制kcp这种重复发包,觉得BBR更符合公平与整体效率之上原则。
  2. BBR over UDP可以去掉root权限,不用kvm,不用openvz,甚至不需要root权限,甚至是windows/OSX都能跑lkl。只要允许udp流量的平台就能跑,适应性更强。
  3. 目前社区很多精力都放在tcp流量伪装上面,其实就是为了绕过ISP针对udp的限速。而部分运营商(比如我这里的联通)并没有这样的qos。BBR over UDP在这种环境非常合适。

目前我能想到的BBR over UDP途径有俩, 一个是quic, 但是go-quic项目没有支持bbr的迹象。第二个就是lkl, 但我看到的libhijack需要绑定整个物理网卡或者一个tap设备,这样必须要有root权限。有没有可能让lkl只需要绑定一个udp socket或者af_unix socket或者pipe,然后把这个当成一个虚拟的L2网卡呢?

@linhua55
Copy link
Owner

linhua55 commented Sep 6, 2017

这个lkl_raw 是 基于 raw socket的, 不是基于tap的,不需要绑定tap设备
raw socket 和 udp socket都是无连接的,你改下这个:
https://github.com/linhua55/linux/blob/rinetd_bpf/tools/lkl/lib/virtio_net_raw.c#L39
还有 这个 绑定到 socket 的地址:
https://github.com/linhua55/linux/blob/rinetd_bpf/tools/lkl/lib/virtio_net_raw.c#L47
就差不多了
不过这样包结构是: |total “udp header“(包括前面的ip header和mac header)| ip header(lkl包的)|ip packet(lkl包的)|

最后去掉 自动设置 iptables规则的代码

@ccaapton
Copy link
Author

ccaapton commented Sep 6, 2017

lkl除了通过这个虚拟网卡与host通讯,能不能用host上面的unix socket或者pipe呢? 如果不行的话,好像很难把隧道里面的东西发给外面的程序,比如shadowsocks

@linhua55
Copy link
Owner

linhua55 commented Sep 9, 2017

lkl和host通信 ,在进程内是通过 syscall的,host里的程序开启lkl,并调用lkl的syscalls来实现lkl和host的通信
现在还不能使用unix socket或pipe,因为 lkl和host内的socket是 隔离的,host不能访问lkl内的socket(但因为lkl的数据都在host内存上,host可以直接访问,只要定位到那段内存,就可以存取数据,但还没实现 [1])。所以可以通过 端口转发程序(host内) 在进程内调用lkl syscalls的方式,然后通过普通socket 和 host程序(shadowsocks)进行通信 或者 hijack shadowsocks的本地syscall 到 lkl syscall 以实现 shadowsocks 在进程内 调用 lkl syscall 从而实现lkl 和 host的通信

[1] lkl/linux#223

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants