Frp: Frpc的Windows客户端穿透的转发速率只有路由器或者Linux的Frpc客户端的1/3

Created on 13 Mar 2018  ·  14Comments  ·  Source: fatedier/frp

Issue is only used for submiting bug report and documents typo. If there are same issues or answers can be found in documents, we will close it directly.
(为了节约时间,提高处理问题的效率,不按照格式填写的 issue 将会直接关闭。)

Use the commands below to provide key information from your environment:
You do NOT have to include this information if this is a FEATURE REQUEST

What version of frp are you using (./frpc -v or ./frps -v)?
1.6.0

What operating system and processor architecture are you using (go env)?
Windows 7 / intel G3250

Configures you used:

frps.ini
[common]
bind_port = *
bind_udp_port = *

kcp_bind_port = **

privilege_token = ***

frpc.ini
[common]
server_addr = ...*
server_port = *
protocol = tcp
tcp_mux = false
protocol = kcp
privilege_token = ****

[grdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389

Steps to reproduce the issue:
1.经过frpc的Windows版本客户端穿透访问远程桌面
2.经过frpc的路由器或者局域网linux客户端穿透访问远程桌面
3.同样的Frps服务器
4.同一台电脑,并且访问的是同一台Windows的远程桌面
5.在远程桌面观看视频或则图片等消耗大量带宽的动作
6.监测网卡的上传速率

Describe the results you received:
Describe the results you expected:

Frpc的Windows客户端穿透的转发速率只有路由器或者Linux的Frpc客户端的1/3
Frpc的Windows客户端,网卡上传速率只有5-6mbps
而经过路由器或则局域网的frpc访问远程桌面,网卡的上传速率有20-30mbps

Additional information you deem important (e.g. issue happens only occasionally):

Can you point out what caused this issue (optional)

help wanted

Most helpful comment

确实如此,这不是frp独有的问题。
一端是Windows,一端是Linux,广域网大流量的情况下,用网络检测程序iperf就很容易测出来速度并不高,远远跑不到标称的带宽(高速局域网除外),要在Windows侧把socket的TCP window size设大,比如256K,速度就上去了。
如果两端都是Linux系统,就不需要改这个参数,改了反而速度降了,用系统默认的刚好。
示例C代码:

const int nNrKb = 256;
int nBuffSize = 1024 * nNrKb;
int nRet = setsockopt(nSocket, SOL_SOCKET, SO_SNDBUF, (char *)&nBuffSize, sizeof(int));
nRet = setsockopt(nSocket, SOL_SOCKET, SO_RCVBUF, (char *)&nBuffSize, sizeof(int));

All 14 comments

感觉和windows的tcp拥塞控制有关,这个问题在我这里也很明显

确实如此,这不是frp独有的问题。
一端是Windows,一端是Linux,广域网大流量的情况下,用网络检测程序iperf就很容易测出来速度并不高,远远跑不到标称的带宽(高速局域网除外),要在Windows侧把socket的TCP window size设大,比如256K,速度就上去了。
如果两端都是Linux系统,就不需要改这个参数,改了反而速度降了,用系统默认的刚好。
示例C代码:

const int nNrKb = 256;
int nBuffSize = 1024 * nNrKb;
int nRet = setsockopt(nSocket, SOL_SOCKET, SO_SNDBUF, (char *)&nBuffSize, sizeof(int));
nRet = setsockopt(nSocket, SOL_SOCKET, SO_RCVBUF, (char *)&nBuffSize, sizeof(int));

期望有人能在 windows 环境下按照 @missdeer 的示例修改一下 frp 的相关代码做一下验证。

我的带宽是40m,frps 服务器,frpc带宽是50m,客户端。

kcp和没用kcp我都测试过,开启kcp确实跑不满了,就像作者说的,占了一部分带宽。不过延迟确实小了。
后来我关闭了kcp功能,就能全部跑满带宽了,没有出现这个情况。

服务器是centos,客户端是windows 20008r2
不过我测试的是http的,3389 我也用过就是卡而已。当时也没在意。

@missdeer
请问你用iperf测试的方向是windows发送至linux吗?
听描述感觉像是TCP congestion control算法导致的,如果真是的话也没有好的解决办法
linux默认是cubic算法可能比windows好一些(某些情况下)

@yydcool
是的。以前做一个大流量relay程序,aws美东到美西,或者美国到中国,带宽怎么都跑不上去,后来发现是这个原因,在Windows侧把TCP window size改大就好了,或者全部换成Linux系统也行。

@missdeer 如果有条件能否帮忙在win下测试下你的过程, #851 测试都是在linux下进行的,只是有一端是虚拟机,也进行过双向测试(内网linux服务器端口通过frp转发到服务器上通过服务器建立本地iperf服务直接对本地frp转发端口进行双向测试)。依然是打不到满速。两边linux服务器都是bbr拥塞。

我的情况同@shminer(宿主机时windowsserver2016,虚拟机跑了linux),0.16.1版本没有问题,可以满速,以后的版本就不行了,frpc的设置协议是TCP,曾在虚拟的linux上跑https,速度有提升。

请不要做重复以及不能提供帮助的 comment。

我是C端是win10 上传速度大概是20Mb S端CentOS 2Mb下载 10Mb上载
本来 200 k的东西需要 20s 加载修改大了 只需要1.53秒左右,
修改注册表的就行了
注册表地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
在Parameters子键下创建或修改名为TCPWindowSize的REG_DWORD值,
该值的范围是从0到65535,默认好像是25000
修改成60000以上,重启frp C端

我是C端是win10 上传速度大概是20Mb S端CentOS 2Mb下载 10Mb上载
本来 200 k的东西需要 20s 加载修改大了 只需要1.53秒左右,
修改注册表的就行了
注册表地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
在Parameters子键下创建或修改名为TCPWindowSize的REG_DWORD值,
该值的范围是从0到65535,默认好像是25000
修改成60000以上,重启frp C端

我客户端win2016,虚拟linux,服务端centos,改tcp,win2016没有问题,但是虚拟的linux就不行了(原来是30Mbps上传,现在只有10Mbps左右)。

我是C端是win10 上传速度大概是20Mb S端CentOS 2Mb下载 10Mb上载
本来 200 k的东西需要 20s 加载修改大了 只需要1.53秒左右,
修改注册表的就行了
注册表地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
在Parameters子键下创建或修改名为TCPWindowSize的REG_DWORD值,
该值的范围是从0到65535,默认好像是25000
修改成60000以上,重启frp C端

我客户端win2016,虚拟linux,服务端centos,改tcp,win2016没有问题,但是虚拟的linux就不行了(原来是30Mbps上传,现在只有10Mbps左右)。
我在想,怎样把虚拟的linux修改一下以适应win2016的tcp改变,但是能力有限,找不到修改方法。有谁能帮忙?谢谢!

这个问题不知道管理员大大有没有放到下次更新的日程里啊?跪求解决。

出个教程,怎么改,才能让windows的效率能够达到最高。。。我的那个方法只有小部分的提升。

Was this page helpful?
0 / 5 - 0 ratings

Related issues

SandyLu picture SandyLu  ·  4Comments

zhangyongcun picture zhangyongcun  ·  3Comments

235832289 picture 235832289  ·  4Comments

jwangkun picture jwangkun  ·  3Comments

wztx picture wztx  ·  3Comments