0

我试图从 tcp 中检索 ack,就像一个 Wireshark 返回的一样。在wireshark 中,它返回一个1 或647 的ack。但是当我试图从数据包中获取ack 时,它返回一个与wireshark 返回的ack 完全不同的长数字。

我得到这些确认:

1918004163 3350411129 3083820792 1730247758 3668869711 4218577993

这是我的代码:

 if (packet.hasHeader(tcp) && packet.hasHeader(ip)) {
                        long tcpack = packet.getHeader(tcp).ack();

                        String name = packet.getHeader(tcp).getName();
                        int urgent = packet.getHeader(tcp).urgent();
                        int windowScaled = packet.getHeader(tcp).windowScaled();
                        int window = packet.getHeader(tcp).window();
                        int wirelen = packet.getCaptureHeader().wirelen();
                        // System.out.println("WireLen: "+wirelen);
                        int caplen = packet.getCaptureHeader().caplen();
                        // System.out.println("caplen: "+caplen);
                        String ipTypeString = ip.typeEnum().toString();
                        // System.out.println("IP Type: "+ipTypeString);
                        String ipDescription = ip.getDescription();
                        // System.out.println("IP Description: "+ipDescription);
                        byte[] dIP = packet.getHeader(ip).destination();
                        byte[] sIP = packet.getHeader(ip).source();
                        String sourceIP = FormatUtils.ip(sIP);
                        // System.out.println("Source IP: "+sourceIP);
                        String destinationIP = FormatUtils.ip(dIP);
                        // System.out.println("Destination IP: "+destinationIP);
                        int tcpPORTSource = tcp.source();
                        // System.out.println("TCP PORT Source:
                        // "+tcpPORTSource);
                        int tcpPORTDestination = tcp.destination();
                        // System.out.println("TCP PORT Destination:
                        // "+tcpPORTDestination);
                        if (sourceIP.equals("someip") && tcpPORTSource == 0000 && ipTypeString.equals("TCP")
                                && wirelen == 1514) {
//                          System.out.println("TCP ack: "+tcpack+" name: "+name+ " urgent: "+urgent + " window scaled: "+windowScaled+ " window: "+window);
                        }

如何检索与wireshark 相同的ack 值?

4

2 回答 2

0

默认情况下,Wireshark 显示TCP 数据包的相对序列号。(即,相对于在 TCP 连接开始时使用的实际序列号的序列号)。这使得查看/使用序列号变得更加容易。

在 Wireshark 中的 TCP 协议下有一个首选项来显示 TCP绝对序列号(那些实际用于 TCP 数据包的序列号)。

一旦您将 Wirehark 配置为显示绝对 TCP 序列号,我希望它们将与您通过代码获得的值相匹配。

读者练习:为什么每个 TCP 连接不以实际序列号 1 开头?:) :)

于 2016-11-18T18:06:51.970 回答
0

你不能。您在wireshark 中看到的数字是No.列中的数字,对吗?它们由wireshark 分配,而不是数据包中可用的信息。

在此处输入图像描述

于 2016-11-18T05:45:06.100 回答