最近在优化之前开发的一个tcp抓包分析工具,这种工具主要通过获取应(request)答(response)报文的到达时间,分析服务的响应时间。
寻找应答报文主要是匹配报文中源地址(ip:port)、目的地址(ip:port),以及处理tcp报文头部中ack number 和sequence number的之间的计算关系。
understanding-tcp-sequence-acknowledgment-numbers这篇文章(需要梯子)是我最早参考的一片文章,原理已经解释的很清楚了。
这里用redis协议(可以认为是一种应用层协议)来做基本的验证。
1、开启tcpdump抓包
tcpdump -i bond0 -s 0 -S tcp port 6379 and host 10.201.30.119
2、另外使用redis-cli 发送命令到server端
redis-cli -h 10.201.30.119 -p 6379 'ping'
3、简单印证
ping命令实际上会转化一个RESP(redis serialization protocol) Arry , 即TCP报文中payload内容为“*1\r\n$4\r\nping\r\n,其中(\r和\n算一个字符,\r\n连在一起作为redis的协议分隔符),这个字符串的长度为14。
redis协议说明参考,http://redis.io/topics/protocol
而应答报文的内容是“+PONG\r\n, 长度是7个字符。
1) 客户端服务器(chenqun.com)发送数据是,seq = 3150838897,发送payload长度是14 (收到的应答报文的ack应该等于3150838897+14=3150838911),ack=548555278 .
2)而serve端(10.201.30.119)应答报文长度中,seq =548555278 ,而ack为3150838911。
3)客户端再次tcp ack确认包中,ack的为548555285(548555278+7)
4、seq 和 ack 在应答报文之间体现的关系
因而在tcp抓包是可以根据ack 和seq的对应关系可以找出server端所有接收到的请求和服务返回的应答。
即请求报文中的ack == seq (response/ack package)
应答报文中的ack == 请求报文seq + length of payload
请问能否参考一下tcp抓包分析工具分析服务的响应时间,谢谢