如何从TCP标头打印序列和确认号码

时间:2014-11-18 07:47:04

标签: c networking tcp network-programming

我正在开发一个项目,需要从TCP标头打印出TCP序列号和TCP确认号。以下是我的工作

ip = (struct iphdr*) buffer; //buffer is used to store the packet that I received
tcp = (struct tcphdr*) (buffer+(4*ip->ihl));

printf ("TCP sequence number = %d\n",ntohl(tcp->seq));
printf ("TCP ack number = %d\n",ntohl(tcp->ack_seq));

为确保我能正确收到数据包,我还会打印其他信息,例如ip->saddrtcp->source等。我的数字与Wireshark报告的数字相同。

但是,我打印出的序列号和确认号码的数字不匹配。我得到了两个非常大的数字(没有任何意义),而Wireshark报告有意义的数字,如Seq = 1,Ack = 1或Seq = 1,Ack = 8等。

我注意到在wireshark中报告的序列号和确认号旁边分别表示“相对序列号”和“相对序号”。所以我想Wireshark报告的数字只是相对于其他数字的数字,我从TCP标题打印出的数字是实际的数字。

尽管如此,我想在Wireshark报道中打印一些内容,是否可以这样做?如果是的话,请告诉我

感谢所有帮助,并提前感谢您!

1 个答案:

答案 0 :(得分:2)

Wireshark序列和ack编号是相对于TCP连接中的第一个数据包(从客户端到服务器的SYN,从服务器到客户端的SYN和ACK)。因此,只需记录这些数据包中的实际序列和确认号码,然后从您正在打印的数据包的实际值中减去这些值。

例如,如果客户端发送其实际序列号为100的SYN,则从该TCP连接中后续数据包中的实际序列值中减去100。这将给出相对序列号。