wireshark sequence number 解码与原始消息不一致问题

来源:互联网 发布:三位一体2 mac版 编辑:程序博客网 时间:2024/04/29 22:26

原贴:http://blog.sina.com.cn/s/blog_53512f590102xfq6.html


我在看TCP协议报文,随机抓了一个TCP包,用WIRESHARK解码,发现   sequence number =0  ,  协议定“序号”是占4个字节的,但实际消息编码它不是0 ,而是:“85 ab f2 29”.

答案:

我终于明白了。 这个“0”是WIRESHAK软件自己计算出来的。

TCP 首部,协议关于”序号“说的很清楚:——  由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这 个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。序号字段的值则指的是本报文段所发送的数据 的第一个字节的序号。这个 Sequence Number 跟WIRESHARK中的Sequence Number不是一个东西,规范定义的是绝对值,而wireshark为了看上去方便,采用了相对值!


如下帧均是A发给B方向的,是一次TCP建链,到发送数据的过程:

第1帧是:“85 ab f2 29” ,whreshark  sequence number= 0   tcp segment length=0; //syn
第2帧是:“85 ab f2 2a” ,whreshark  sequence number= 1   tcp segment length=0; //ack
第3帧是:“85 ab f2 2a” ,whreshark  sequence number= 1  tcp segment length=47; //data 与前一个序号"85 ab f2 2a"相比没有变化,所以sequence number 不变,还是1 .下一帧的sequence number应当是48!从“85 ab f2 2a”这个数字开始加,再加46个,一共是47个字节,这些数据传给了B ,相加的结果是:“85 ab f2 58”,那下一个要传的数字就是 "85 ab f2 59".


第4帧是:“85 ab f2 59” ,whreshark  sequence number= 48  tcp segment length=0; //data 只有传数据,只传了一个ACK信号,表示我收到了对方的数据。所以下一帧的发送地址还应当是这个“85 ab f2 59”

第5帧是:“85 ab f2 59” ,whreshark  sequence number= 48  tcp segment length=520; //data

第6帧是:“85 ab f4 61” ,whreshark  sequence number= 568  tcp segment length=24; //data

结论:
wireshark中某一帧当中的 sequence number= 上一帧的 sequence number+ tcp segment length 。
如上面的第6帧 sequence number= 48 + 520 =568 。



0 0
原创粉丝点击