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.38k stars 1.02k forks source link

pcap抓包和raw socket抓包,结果非常诡异 #113

Closed wangbin579 closed 11 years ago

wangbin579 commented 11 years ago

1)对于外网实际应用,pcap抓包 pk raw socket抓包,结果如下: pcap抓包后,复制过去的请求比在线少0.121%(一次测试);而raw socket方式抓包,却比在线多出0.25%。 注意:1)在tcpcopy中,pcap抓包是在数据链路层抓包,而raw socket抓包是在ip层抓包 2)我们内网的应用,经过测试,没有发现多出请求的问题

wangbin579 commented 11 years ago

raw socket在数据链路层抓,也是比在线多。

wangbin579 commented 11 years ago

进行了如下试验: 在一台在线机器上面,有两份tcpcopy(均添加了debug模式),一份是pcap抓包,一份是raw socket抓包,执行命令为: pcap: tcpcopy -x 80-xxx.xxx.xxx.148:18080 -r 1 -d

raw socket: tcpcopy -x 80-xxx.xxx.xxx.161:18080 -r 1 -d

这样执行后,同样的请求会复制给148和161机器,通过应用层的access.log进行对比,找出差异的记录,并根据抓包文件和tcpcopy的debug日志,发现pcap模式抓包,丢包相对较严重,而raw socket没有丢包,而在性能方面,pcap性能好于raw socket方式,因为在内核态过滤了不该抓的包。

所以pcap抓包(非pfring),会丢失更多请求。

采用raw socket方式,为啥会多出请求呢? 经过分析,结论如下: 1)由于tcpcopy没有去分析上层应用请求的边界,会导致一些带有payload的数据包(由于各种原因需要传递这些带有payload的数据包,比如半途截获请求)发过去以后,被上层应用报400错误或者408错误

2)由于应用程序前面有lvs,lvs会发送本不该发送的数据包给目标机器,tcp模块会拒绝掉这些数据包(比如发送rst包),但tcpcopy由于在数据链路层或者IP层抓包,不会去丢弃,而是转发出去(根据需要会自动补充三次握手)