15 Commits

Author SHA1 Message Date
wangyu-
3b5279235a fix var name 2017-09-27 12:13:09 -05:00
wangyu-
cccff0a8a5 Merge branch 'master' of https://github.com/wangyu-/UDPspeeder 2017-09-27 11:51:47 -05:00
wangyu-
66da392357 fixed a log info 2017-09-27 11:23:17 -05:00
wangyu-
a5bad45780 allow dup_delay=0 2017-09-27 11:21:03 -05:00
wangyu-
b1a47bb8ea performance optimization for dup_max=0 2017-09-27 11:11:06 -05:00
wangyu-
00cffe1072 Update README.md 2017-09-20 03:20:03 -07:00
wangyu-
b5a873d073 Update README.md 2017-09-20 03:15:48 -07:00
wangyu-
8a2e2b8ce4 Update README.md 2017-09-20 03:14:17 -07:00
wangyu-
a13358cdb3 Merge branch 'master' of https://github.com/wangyu-/UDPspeeder 2017-09-12 23:35:01 -05:00
wangyu-
a4b8c5f5b9 added debug info 2017-09-12 23:34:55 -05:00
wangyu-
916b5e94d8 Update README.md 2017-09-11 08:55:36 -07:00
wangyu-
19553d1bb8 Update README.md 2017-09-11 08:51:02 -07:00
wangyu-
b4bd385e88 trival 2017-09-11 10:29:24 -05:00
wangyu-
d985eb6634 trival 2017-09-11 10:28:32 -05:00
wangyu-
aa42887a67 fixed help page 2017-09-11 10:26:56 -05:00
2 changed files with 56 additions and 19 deletions

View File

@@ -62,12 +62,16 @@ https://github.com/wangyu-/UDPspeeder/releases
-k 指定一个字符串server/client间所有收发的包都会被异或改变协议特征防止UDPspeeder的协议被运营商针对。 -k 指定一个字符串server/client间所有收发的包都会被异或改变协议特征防止UDPspeeder的协议被运营商针对。
### MTU设置(重要)
不论你用udpspeeder来加速kcptun还是vpn,为了稳定使用,都需要设置合理的MTU在kcptun/vpn里设置而不是在udpspeeder里建议把MTU设置成1200。client和server端都要设置。
# 进阶操作说明 # 进阶操作说明
### 命令选项 ### 命令选项
``` ```
UDPspeeder UDPspeeder
version: Aug 9 2017 18:13:09 git version:b4bd385e88 build date:Sep 11 2017 10:29:25
repository: https://github.com/wangyu-/UDPspeeder repository: https://github.com/wangyu-/UDPspeeder
usage: usage:
@@ -86,14 +90,16 @@ main options:
advanced options: advanced options:
-t tmin:tmax simliar to -t above,but delay randomly between tmin and tmax -t tmin:tmax simliar to -t above,but delay randomly between tmin and tmax
-j jmin:jmax simliar to -j above,but create jitter randomly between jmin and jmax -j jmin:jmax simliar to -j above,but create jitter randomly between jmin and jmax
--random-drop <number> simulate packet loss ,unit 0.01% --random-drop <number> simulate packet loss ,unit:0.01%
-m <number> max pending packets,to prevent the program from eating up all your memory. --disable-filter disable duplicate packet filter.
-m <number> max pending packets,to prevent the program from eating up all your memory,
default value:0(disabled).
other options: other options:
--log-level <number> 0:never 1:fatal 2:error 3:warn --log-level <number> 0:never 1:fatal 2:error 3:warn
4:info (default) 5:debug 6:trace 4:info (default) 5:debug 6:trace
--log-position enable file name,function name,line number in log --log-position enable file name,function name,line number in log
--disable-color disable log color --disable-color disable log color
--sock-buf <number> buf size for socket,>=10 and <=10240,unit:kbyte,default:512 --sock-buf <number> buf size for socket,>=10 and <=10240,unit:kbyte,default:1024
-h,--help print this help message -h,--help print this help message
``` ```
@@ -101,7 +107,7 @@ other options:
##### -d 选项 ##### -d 选项
设置冗余包数量。 设置冗余包数量。
##### -t 选项 ##### -t 选项
为冗余包的发送,增加一个延迟.对中间路由buffer做优化应对瞬时Buffer过长导致的连续丢包 为冗余包的发送,增加一个延迟.对中间路由buffer做优化应对瞬时Buffer过长导致的连续丢包.对于多个冗余包,依次在前一个包的基础上增加这个延迟。
##### -j 选项 ##### -j 选项
为原始数据的发送增加一个延迟抖动值。这样上层应用计算出来的RTT方差会更大以等待后续冗余包的到达不至于发生在冗余包到达之前就触发重传的尴尬。配合-t选项使用。正常情况下跨国网络本身的延迟抖动就很大。可以不用设-j 为原始数据的发送增加一个延迟抖动值。这样上层应用计算出来的RTT方差会更大以等待后续冗余包的到达不至于发生在冗余包到达之前就触发重传的尴尬。配合-t选项使用。正常情况下跨国网络本身的延迟抖动就很大。可以不用设-j

View File

@@ -29,7 +29,7 @@ int local_fd=-1;
int is_client = 0, is_server = 0; int is_client = 0, is_server = 0;
int local_listen_fd=-1; int local_listen_fd=-1;
int disable_conv_clear=0; int disable_conn_clear=0;
int mtu_warn=1350; int mtu_warn=1350;
u32_t remote_address_uint32=0; u32_t remote_address_uint32=0;
@@ -49,6 +49,7 @@ u64_t packet_send_count=0;
u64_t dup_packet_send_count=0; u64_t dup_packet_send_count=0;
u64_t packet_recv_count=0; u64_t packet_recv_count=0;
u64_t dup_packet_recv_count=0; u64_t dup_packet_recv_count=0;
int max_pending_packet=0;
int random_between(u32_t a,u32_t b) int random_between(u32_t a,u32_t b)
{ {
@@ -61,7 +62,7 @@ int random_between(u32_t a,u32_t b)
else return a+get_true_random_number()%(b+1-a); else return a+get_true_random_number()%(b+1-a);
} }
int max_pending_packet=0;
int VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV; int VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV;
struct anti_replay_t struct anti_replay_t
@@ -161,7 +162,7 @@ struct conn_manager_t //TODO change map to unordered map
} }
void clear() void clear()
{ {
if(disable_conv_clear) return ; if(disable_conn_clear) return ;
for(it=fd_to_u64.begin();it!=fd_to_u64.end();it++) for(it=fd_to_u64.begin();it!=fd_to_u64.end();it++)
{ {
@@ -197,14 +198,20 @@ struct conn_manager_t //TODO change map to unordered map
} }
int insert_fd(u32_t fd,u64_t u64) int insert_fd(u32_t fd,u64_t u64)
{ {
int before=fd_last_active_time.bucket_count();
u64_to_fd[u64]=fd; u64_to_fd[u64]=fd;
fd_to_u64[fd]=u64; fd_to_u64[fd]=u64;
fd_last_active_time[fd]=get_current_time(); fd_last_active_time[fd]=get_current_time();
int after=fd_last_active_time.bucket_count();
if(after!=before)//rehash happens!
{
clear_it=fd_last_active_time.begin();
}
return 0; return 0;
} }
int erase_fd(u32_t fd) int erase_fd(u32_t fd)
{ {
if(disable_conv_clear) return 0; if(disable_conn_clear) return 0;
u64_t u64=fd_to_u64[fd]; u64_t u64=fd_to_u64[fd];
u32_t ip= (u64 >> 32u); u32_t ip= (u64 >> 32u);
@@ -240,7 +247,7 @@ struct conn_manager_t //TODO change map to unordered map
} }
int clear_inactive0() int clear_inactive0()
{ {
if(disable_conv_clear) return 0; if(disable_conn_clear) return 0;
//map<uint32_t,uint64_t>::iterator it; //map<uint32_t,uint64_t>::iterator it;
@@ -421,7 +428,7 @@ int remove_seq(char * data,int &data_len)
seq=ntoh64(seq); seq=ntoh64(seq);
if(anti_replay.is_vaild(seq)==0) if(anti_replay.is_vaild(seq)==0)
{ {
if(disable_replay_filter==1) if(disable_replay_filter==1) // inefficient, to make packet_recv_count++ work for only non-dup packet
return 0; return 0;
mylog(log_trace,"seq %llx dropped bc of replay-filter\n ",seq); mylog(log_trace,"seq %llx dropped bc of replay-filter\n ",seq);
return -1; return -1;
@@ -592,7 +599,7 @@ int create_new_udp(int &new_udp_fd)
mylog(log_debug, "created new udp_fd %d\n", new_udp_fd); mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
int ret = connect(new_udp_fd, (struct sockaddr *) &remote_addr_in, slen); int ret = connect(new_udp_fd, (struct sockaddr *) &remote_addr_in, slen);
if (ret != 0) { if (ret != 0) {
mylog(log_warn, "udp fd connect fail\n"); mylog(log_warn, "udp fd connect fail %d %s\n",ret,strerror(errno));
close(new_udp_fd); close(new_udp_fd);
return -1; return -1;
} }
@@ -772,7 +779,18 @@ int event_loop()
if (ret < 0) { if (ret < 0) {
mylog(log_warn, "send returned %d ,errno:%s\n", ret,strerror(errno)); mylog(log_warn, "send returned %d ,errno:%s\n", ret,strerror(errno));
} }
add_and_new(new_udp_fd, dup_num - 1,random_between(dup_delay_min,dup_delay_max), data, data_len,u64); if(dup_delay_max!=0)
{
add_and_new(new_udp_fd, dup_num - 1,random_between(dup_delay_min,dup_delay_max), data, data_len,u64);
}
else
{
for(int i=0;i<dup_num - 1;i++)
{
do_obscure(data, data_len, new_data, new_len);
ret = send_fd(new_udp_fd, new_data,new_len, 0);
}
}
} }
else else
{ {
@@ -888,7 +906,18 @@ int event_loop()
do_obscure(data, data_len, new_data, new_len); do_obscure(data, data_len, new_data, new_len);
ret = sendto_u64(local_listen_fd, new_data, ret = sendto_u64(local_listen_fd, new_data,
new_len , 0,u64); new_len , 0,u64);
if(dup_delay_max!=0)
{
add_and_new(udp_fd, dup_num - 1,random_between(dup_delay_min,dup_delay_max), data, data_len,u64); add_and_new(udp_fd, dup_num - 1,random_between(dup_delay_min,dup_delay_max), data, data_len,u64);
}
else
{
for(int i=0;i<dup_num-1;i++)
{
do_obscure(data, data_len, new_data, new_len);
ret = sendto_u64(local_listen_fd, new_data,new_len , 0,u64);
}
}
if (ret < 0) { if (ret < 0) {
mylog(log_warn, "sento returned %d,%s\n", ret,strerror(errno)); mylog(log_warn, "sento returned %d,%s\n", ret,strerror(errno));
//perror("ret<0"); //perror("ret<0");
@@ -949,8 +978,10 @@ void print_help()
printf("advanced options:\n"); printf("advanced options:\n");
printf(" -t tmin:tmax simliar to -t above,but delay randomly between tmin and tmax\n"); printf(" -t tmin:tmax simliar to -t above,but delay randomly between tmin and tmax\n");
printf(" -j jmin:jmax simliar to -j above,but create jitter randomly between jmin and jmax\n"); printf(" -j jmin:jmax simliar to -j above,but create jitter randomly between jmin and jmax\n");
printf(" --random-drop <number> simulate packet loss ,unit 0.01%%\n"); printf(" --random-drop <number> simulate packet loss ,unit:0.01%%\n");
printf(" -m <number> max pending packets,to prevent the program from eating up all your memory.\n"); printf(" --disable-filter disable duplicate packet filter.\n");
printf(" -m <number> max pending packets,to prevent the program from eating up all your memory,\n");
printf(" default value:0(disabled).\n");
printf("other options:\n"); printf("other options:\n");
printf(" --log-level <number> 0:never 1:fatal 2:error 3:warn \n"); printf(" --log-level <number> 0:never 1:fatal 2:error 3:warn \n");
printf(" 4:info (default) 5:debug 6:trace\n"); printf(" 4:info (default) 5:debug 6:trace\n");
@@ -1084,9 +1115,9 @@ void process_arg(int argc, char *argv[])
{ {
int dup_delay=-1; int dup_delay=-1;
sscanf(optarg,"%d\n",&dup_delay); sscanf(optarg,"%d\n",&dup_delay);
if(dup_delay<1||dup_delay>1000*100) if(dup_delay<0||dup_delay>1000*100)
{ {
mylog(log_fatal,"dup_delay must be between 1 and 100,000(10 second)\n"); mylog(log_fatal,"dup_delay must be between 0 and 100,000(10 second)\n");
myexit(-1); myexit(-1);
} }
dup_delay_min=dup_delay_max=dup_delay; dup_delay_min=dup_delay_max=dup_delay;
@@ -1094,9 +1125,9 @@ void process_arg(int argc, char *argv[])
else else
{ {
sscanf(optarg,"%d:%d\n",&dup_delay_min,&dup_delay_max); sscanf(optarg,"%d:%d\n",&dup_delay_min,&dup_delay_max);
if(dup_delay_min<1 ||dup_delay_max<1||dup_delay_min>dup_delay_max) if(dup_delay_min<0 ||dup_delay_max<0||dup_delay_min>dup_delay_max)
{ {
mylog(log_fatal," must satisfy 1<=dmin<=dmax\n"); mylog(log_fatal," must satisfy 0<=tmin<=tmax\n");
myexit(-1); myexit(-1);
} }
} }