session-replay-tools / tcpcopy

An online request replication and TCP stream replay tool, ideal for real testing, performance testing, stability testing, stress testing, load testing, smoke testing, and more.
http://session-replay-tools.github.io/tcpcopy/
Other
4.52k stars 1.03k forks source link

测试服务器收不到请求,虚拟的客户端ip与测试服务器tcp三次握手总不成功 #332

Closed shenhuayingshy closed 3 months ago

shenhuayingshy commented 6 years ago

我的环境: online server:10.112.5.239 test server:10.112.5.240 intercept server:10.112.5.243

我的步骤: 1、./intercept -i eth0 -F tcp and src port 80 -d 2、 ./tcpcopy -x 80-10.112.5.240:80 -s 10.112.5.243 -c 99.99.99.99 -n 1 -d 3、 route add -net 99.99.99.0 netmask 255.255.255.0 gw 10.112.5.243 然后分别在online和testserver上开启python -m SimpleHTTPServer 80

4、用tcpdump分别在online和testserver上抓包 5、在网页上请求上10.112.5.239,请求成功,但测试服务器上没任何请求 在测试 服务器上抓的包发现99.99.99.99与10.112.5.240tcp握手总不成功如下:

5 1.036531 99.99.99.99 10.112.5.240 TCP 74 39266 → 80 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=8957591 TSecr=0 WS=128

6 1.036562 10.112.5.240 99.99.99.99 TCP 74 80 → 39266 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=78218058 TSecr=8957591 WS=128

37 2.238410 10.112.5.240 99.99.99.99 TCP 74 [TCP Retransmission] 80 → 39266 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=78219260 TSecr=8957591 WS=128

54 4.037230 99.99.99.99 10.112.5.240 TCP 54 39266 → 80 [RST, ACK] Seq=1 Ack=2303388546 Win=8388480 Len=0

66 4.238409 10.112.5.240 99.99.99.99 TCP 74 [TCP Retransmission] 80 → 39266 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=78221260 TSecr=8957591 WS=128

请问这种情况是哪儿出问题了,应该怎么办,万分感谢

shenhuayingshy commented 6 years ago

我的tcpcopy log如下: 2018/07/30 14:28:43 +681 [notice] active:1,rel:317,obs del:0,tw:0 2018/07/30 14:28:43 +681 [notice] conns:0,resp:0,c-resp:0 2018/07/30 14:28:43 +681 [notice] resp fin:0,resp rst:0 2018/07/30 14:28:43 +681 [notice] send:635,send content:0 2018/07/30 14:28:43 +681 [notice] send syn:318, fin:0,reset:317 2018/07/30 14:28:43 +681 [notice] reconnect:0,for no syn:124 2018/07/30 14:28:43 +681 [notice] retransmit:0 2018/07/30 14:28:43 +681 [notice] recv packs after retransmission:0 2018/07/30 14:28:43 +681 [notice] syn cnt:512,all clt:2160,clt cont:701 2018/07/30 14:28:43 +681 [notice] total cont retransmit:0, frag:120 2018/07/30 14:28:43 +681 [notice] total captured packets:17242 2018/07/30 14:28:43 +681 [warn] many connections can't be established 2018/07/30 14:29:13 +677 [notice] user time used:0 2018/07/30 14:29:13 +677 [notice] sys time used:0 2018/07/30 14:29:13 +677 [notice] max memory size:102564 2018/07/30 14:29:13 +677 [notice] voluntary ctx switches:15044 2018/07/30 14:29:13 +677 [notice] involuntary ctx switches:0 2018/07/30 14:29:13 +681 [notice] active:1,rel:323,obs del:0,tw:0 2018/07/30 14:29:13 +681 [notice] conns:0,resp:0,c-resp:0 2018/07/30 14:29:13 +681 [notice] resp fin:0,resp rst:0 2018/07/30 14:29:13 +681 [notice] send:647,send content:0 2018/07/30 14:29:13 +681 [notice] send syn:324, fin:0,reset:323 2018/07/30 14:29:13 +681 [notice] reconnect:0,for no syn:126 2018/07/30 14:29:13 +681 [notice] retransmit:0 2018/07/30 14:29:13 +681 [notice] recv packs after retransmission:0 2018/07/30 14:29:13 +681 [notice] syn cnt:522,all clt:2197,clt cont:711 2018/07/30 14:29:13 +681 [notice] total cont retransmit:0, frag:120 2018/07/30 14:29:13 +681 [notice] total captured packets:17423 2018/07/30 14:29:13 +681 [warn] many connections can't be established 2018/07/30 14:29:43 +681 [notice] active:1,rel:327,obs del:0,tw:0 2018/07/30 14:29:43 +681 [notice] conns:0,resp:0,c-resp:0 2018/07/30 14:29:43 +681 [notice] resp fin:0,resp rst:0 2018/07/30 14:29:43 +681 [notice] send:655,send content:0 2018/07/30 14:29:43 +681 [notice] send syn:328, fin:0,reset:327

我的环境是docker环境

wangbin579 commented 6 years ago

估计是路由不生效。

先让intercept运行在testserver,这样就能捕获到第二次握手数据包,看看能不能完成三次握手

shenhuayingshy commented 6 years ago

按您的建议做法如下 两台服务器 onlineserver:10.112.5.239 testserver和intercept部署在一台服务器上:10.112.5.240 操作步骤: 1、在10.112.5.240服务器上启动intercept :./intercept -i eth0 -F tcp and src port 80 -d

2、在10.112.5.239服务器上启动: ./tcpcopy.old -x 80-10.112.5.240:80 -s 10.112.5.240 -c 99.99.99.x -d

测试效果: 路由可以通,测试服务器上可以收到复制过来的请求

有两个问题想问一下: 1、如果想让testserver和intercept部署在两台服务器上,应该怎么做 2、testserver和intercept部署在一台服务器上,刚才测试发现,测试服务器实际收到的请求要比设置的复制倍数n要少,且有延迟,请问应该怎么办

多谢大神解答

shenhuayingshy commented 6 years ago

我下载的tcpcopy和intercept版本都是1.0.0

wangbin579 commented 6 years ago

对于问题1,你得让testserver设置的路由生效,让响应包路由到intercept所在的机器才行 对于问题2,复制n倍,得看情况,如果是流量本身比较大,复制n倍意义就不是很大,容易导致session(四元组中的客户端ip和客户端端口)冲突,效率就会下来。

shenhuayingshy commented 6 years ago

那复制流量的时候,ip和端口分配是随机的?不会自动检查吗?ip和端口分配依赖于哪个模块

wangbin579 commented 6 years ago

随机的,自动检测代价太大,尤其是短链接场合。

shenhuayingshy commented 6 years ago

那如果有冲突,程序接下来的行为是什么? 1、程序是直接放弃这次请求呀? 2、还是一直尝试请求,直到成功,还是有次数或时间限制? 3、如果一直尝试请求,那是用原ip和端口,还是会用其他的IP和端口

wangbin579 commented 6 years ago

如果有冲突,影响的不是一个session,而是两个session。

不建议使用多倍复制,除非是长连接,且连接数量不多的场合使用。

还有一个缺点,多倍复制因为请求的重复,效果会大打折扣。

shenhuayingshy commented 6 years ago

想用这个工具做压测,而且连接都是短连接,做压测肯定得需要多倍复制,那这个工具是不是不太适合短连接压测

wangbin579 commented 6 years ago

可以运行多个tcpcopy实例指定不同的客户端ip地址来解决这个问题

shenhuayingshy commented 6 years ago

不好意思,又要打扰你了

我现在的测试环境是阿里云docker,服务器里包含多个容器,服务器向外暴露的端口是9080。在服务器上安装了tcpcopy(没在容器里面安装) 有个现象:如果走容器,引流就不成功(测试服务器上没有任何引流消息),如果不走容器,直接开启一个python -m SimpleHTTPServer 8045,就可以引流成功,

下面是走容器的步骤: 服务器容器网络结构链接如下: http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/7104/5531_zh-CN.png

正式环境安装了tcpcopy,IP:10.113.3.183:9080 测试环境安装intercept,ip:10.113.3.188:9080

1、先运行./intercept -i eth0 -F tcp and src port 9080 -d 2、然后运行tcpcopy -x 9080-10.113.3.188:9080 -s 10.113.3.188 -c 99.99.99.99 -d 3、tcpcopy log如下: 2018/08/01 10:04:46 +368 [notice] tcpcopy version:1.0.0 2018/08/01 10:04:46 +368 [notice] tcpcopy internal version:6 2018/08/01 10:04:46 +368 [notice] target:9080-10.113.3.188:9080 2018/08/01 10:04:46 +368 [notice] TC_COMBINED mode 2018/08/01 10:04:46 +368 [notice] epoll mode 2018/08/01 10:04:46 +368 [notice] session timeout:120 2018/08/01 10:04:46 +368 [notice] keepalive timeout:240 2018/08/01 10:04:46 +368 [notice] min sess pool size:576 2018/08/01 10:04:46 +368 [notice] sess pool size:1024 2018/08/01 10:04:46 +368 [notice] set global port for tcpcopy 2018/08/01 10:04:46 +368 [notice] raw_clt_tf_ip:99.99.99.99 2018/08/01 10:04:46 +368 [notice] parallel connections per target:2 2018/08/01 10:04:46 +368 [notice] s parameter:10.113.3.188 2018/08/01 10:04:46 +368 [notice] set only ip for tcpcopy 2018/08/01 10:04:46 +368 [info] pool:20013984,block:20030384,len:44 occupy 2018/08/01 10:04:46 +368 [info] pool:20013984,block:20030384,len:44 occupy 2018/08/01 10:04:46 +368 [info] connect to remote server(10.113.3.188:36524) 2018/08/01 10:04:46 +368 [info] connect to remote server(10.113.3.188:36524) 2018/08/01 10:05:46 +368 [notice] user time used:0 2018/08/01 10:05:46 +368 [notice] sys time used:0 2018/08/01 10:05:46 +368 [notice] max memory size:4020 2018/08/01 10:05:46 +368 [notice] voluntary ctx switches:884 2018/08/01 10:05:46 +368 [notice] involuntary ctx switches:0 2018/08/01 10:06:46 +369 [notice] user time used:0 2018/08/01 10:06:46 +369 [notice] sys time used:0 2018/08/01 10:06:46 +369 [notice] max memory size:4020 2018/08/01 10:06:46 +369 [notice] voluntary ctx switches:1777 2018/08/01 10:06:46 +369 [notice] involuntary ctx switches:1 2018/08/01 10:07:46 +369 [notice] user time used:0 2018/08/01 10:07:46 +369 [notice] sys time used:0 2018/08/01 10:07:46 +369 [notice] max memory size:4020 2018/08/01 10:07:46 +369 [notice] voluntary ctx switches:2661 2018/08/01 10:07:46 +369 [notice] involuntary ctx switches:1 2018/08/01 10:08:46 +369 [notice] user time used:0 2018/08/01 10:08:46 +369 [notice] sys time used:0 2018/08/01 10:08:46 +369 [notice] max memory size:4020 2018/08/01 10:08:46 +369 [notice] voluntary ctx switches:3511 2018/08/01 10:08:46 +369 [notice] involuntary ctx switches:1 2018/08/01 10:09:46 +369 [notice] user time used:0 2018/08/01 10:09:46 +369 [notice] sys time used:0 2018/08/01 10:09:46 +369 [notice] max memory size:4020 2018/08/01 10:09:46 +369 [notice] voluntary ctx switches:4364 2018/08/01 10:09:46 +369 [notice] involuntary ctx switches:1 2018/08/01 10:10:46 +370 [notice] user time used:0 2018/08/01 10:10:46 +370 [notice] sys time used:0 2018/08/01 10:10:46 +370 [notice] max memory size:4020 2018/08/01 10:10:46 +370 [notice] voluntary ctx switches:5261 2018/08/01 10:10:46 +370 [notice] involuntary ctx switches:1 2018/08/01 10:11:46 +370 [notice] user time used:0 2018/08/01 10:11:46 +370 [notice] sys time used:0 2018/08/01 10:11:46 +370 [notice] max memory size:4020 2018/08/01 10:11:46 +370 [notice] voluntary ctx switches:6094 2018/08/01 10:11:46 +370 [notice] involuntary ctx switches:1 2018/08/01 10:12:46 +370 [notice] user time used:0 2018/08/01 10:12:46 +370 [notice] sys time used:0 2018/08/01 10:12:46 +370 [notice] max memory size:4020 2018/08/01 10:12:46 +370 [notice] voluntary ctx switches:6996 2018/08/01 10:12:46 +370 [notice] involuntary ctx switches:1 2018/08/01 10:13:46 +370 [notice] user time used:0 2018/08/01 10:13:46 +370 [notice] sys time used:0 2018/08/01 10:13:46 +370 [notice] max memory size:4020 2018/08/01 10:13:46 +370 [notice] voluntary ctx switches:7889 2018/08/01 10:13:46 +370 [notice] involuntary ctx switches:1

4、结果就是测试服务器没有关于IP为99.99.99.99的任何流量过来

shenhuayingshy commented 6 years ago

想试试与监听的网卡是不是有关系,intercept端怎么监听所有网卡和docker的端口

lazio579 commented 6 years ago

新的问题最好提交一个新的issue,在已有问题后面提,不好发现。

还是得抓包分析和推理,从上面来看,貌似是tcpcopy没有捕获数据包

xingfeng1234 commented 5 years ago

按您的建议做法如下 两台服务器 onlineserver:10.112.5.239 testserver和intercept部署在一台服务器上:10.112.5.240 操作步骤: 1、在10.112.5.240服务器上启动intercept :./intercept -i eth0 -F tcp and src port 80 -d

2、在10.112.5.239服务器上启动: ./tcpcopy.old -x 80-10.112.5.240:80 -s 10.112.5.240 -c 99.99.99.x -d

测试效果: 路由可以通,测试服务器上可以收到复制过来的请求

有两个问题想问一下: 1、如果想让testserver和intercept部署在两台服务器上,应该怎么做 2、testserver和intercept部署在一台服务器上,刚才测试发现,测试服务器实际收到的请求要比设置的复制倍数n要少,且有延迟,请问应该怎么办

多谢大神解答

您好,在阿里服务器上,选了三台同网络的服务器,做测试。TS和AS在一台服务器上是可以Copy成功的,TS和AS分开部署是Copy流量不成功的。看你和王的交流就是路由设置的不对,现请教下你是怎么设置路由的? 另外,参考了阿里云服务器需要到vpc控制台里配置路由,本机配置的不会生效,已让运维手工添加了一个网段,作为路由网段。

xingfeng1234 commented 5 years ago

按您的建议做法如下 两台服务器 onlineserver:10.112.5.239 testserver和intercept部署在一台服务器上:10.112.5.240 操作步骤: 1、在10.112.5.240服务器上启动intercept :./intercept -i eth0 -F tcp and src port 80 -d 2、在10.112.5.239服务器上启动: ./tcpcopy.old -x 80-10.112.5.240:80 -s 10.112.5.240 -c 99.99.99.x -d 测试效果: 路由可以通,测试服务器上可以收到复制过来的请求 有两个问题想问一下: 1、如果想让testserver和intercept部署在两台服务器上,应该怎么做 2、testserver和intercept部署在一台服务器上,刚才测试发现,测试服务器实际收到的请求要比设置的复制倍数n要少,且有延迟,请问应该怎么办 多谢大神解答

您好,在阿里服务器上,选了三台同网络的服务器,做测试。TS和AS在一台服务器上是可以Copy成功的,TS和AS分开部署是Copy流量不成功的。看你和王的交流就是路由设置的不对,现请教下你是怎么设置路由的? 另外,参考了阿里云服务器需要到vpc控制台里配置路由,本机配置的不会生效,已让运维手工添加了一个网段,作为路由网段。

正如王老师分析,就是路由的问题,最后经过艰难万阻终于成功了。在弄路由的时候给以下几点建议: 1、tcpcopy命令中-c参数指定的网段,你要清楚能不能路由,路由后应该到哪。 2、阿里云的服务,本地加路由是不生效的,需要在控制台设置。 3、验证路由配置的没问题了,要看下你的防火墙。 4、正如TCPCopy指导文档里说的,这需要很多知识点来做支撑。 祝大家使用TCPCopy好运