tcp应答报文中sequence nummber 和ack number关系

最近在优化之前开发的一个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'

具体的tcp报文信息如下:
tcp1

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)

tcp3

4、seq 和 ack 在应答报文之间体现的关系
因而在tcp抓包是可以根据ack 和seq的对应关系可以找出server端所有接收到的请求和服务返回的应答。

即请求报文中的ack == seq (response/ack package)
应答报文中的ack == 请求报文seq + length of payload

此条目发表在develop, os/linux分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>