我正在开发一个项目,需要从 TCP header 打印出 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->saddr
、tcp->source
等。我有相同的数字据 Wireshark 报道。
但是,我打印的序列号和确认号的数字不匹配。我得到了这两个非常大的数字(没有任何意义),而 Wireshark 报告有意义的数字,例如 Seq =1、Ack=1 或 Seq=1、Ack=8 等。
我注意到,wireshark 中报告的序列号和确认号旁边分别显示“相对序列号”和“相对确认号”。所以我猜 Wireshark 报告的数字只是相对于其他内容的数字,而我从 TCP header 打印出的数字是实际数字。
尽管如此,我想打印一些 Wireshark 报告的内容,可以吗?如果是这样,请告诉我
感谢所有的帮助,并提前感谢您!
最佳答案
Wireshark 序列和 ack 编号与 TCP 连接中的第一个数据包相关(从客户端到服务器的 SYN、从服务器到客户端的 SYN 和 ACK)。因此,只需记录这些数据包的实际序列和确认号,然后从您正在打印的数据包的实际值中减去这些值即可。
例如,如果客户端发送其实际序列号为 100 的 SYN,则从该 TCP 连接中后续数据包的实际序列值中减去 100。这将给出相对序列号。
关于c - 如何从 TCP header 打印序列和确认号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989092/