c - 如何从 TCP header 打印序列和确认号

标签 c networking tcp network-programming

我正在开发一个项目,需要从 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->saddrtcp->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/

相关文章:

node.js - TCP和HASH验证

qt - 如何使用QTcpSocket进行小数据包的高频发送?

sockets - SOCK_SEQPACKET 可用性?

c - 如何将 int 添加到先前创建的包含字符串的缓冲区

java - 什么会导致 close(2) 因只读文件的 EIO 而失败?

c - 从动态数组 C 中删除元素

c - 外部关键字和设置字符串变量

networking - kubernetes pod内的代理不会拦截任何HTTP流量

c - 头文件中函数原型(prototype)(声明)的重要性

android - 3G 连接设备和 WiFi PC 之间的 UDP