tcpdump TCP 报头偏移量 13

tcpdump TCP 报头偏移量 13

我试图了解其tcpdump工作原理并尝试读取 TCP 标头控制标志 SYN、ACK 等。

在网上研究之后,我了解到控制标志在偏移量 13 处可用,并且我需要使用 tcp[13],但是我无法理解如何计算这个值 13。

有人可以帮忙吗?

答案1

TCP[13] 是一个位(标志)数组。当它们设置为 1 时,表示启用;当它们设置为 0 时,表示禁用。

这些tcpdump命令显示如何获取 TCP[13] 位的集合并进行逐位与运算以测试这些位是否已启用:

Show all URG packets:
# tcpdump 'tcp[13] & 32 != 0'

Show all ACK packets:
# tcpdump 'tcp[13] & 16 != 0'

Show all PSH packets:
# tcpdump 'tcp[13] & 8 != 0'

Show all RST packets:
# tcpdump 'tcp[13] & 4 != 0'

Show all SYN packets:
# tcpdump 'tcp[13] & 2 != 0'

Show all FIN packets:
# tcpdump 'tcp[13] & 1 != 0'

Show all SYN-ACK packets:
# tcpdump 'tcp[13] = 18

引用的 URL(见下文)中有此项,也对此进行了解释:

记住这些过滤器工作的原因。上面的过滤器找到这些不同的数据包是因为 tcp[13] 查看 TCP 标头中的偏移量 13,该数字表示字节内的位置,而 !=0 表示相关标志设置为 1,即打开。

TCP 报头

如果你看一下RFC 793 3.1以及这篇文章tcpdump 高级过滤器它变得更加明显。

TCP header
----------

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          Source Port          |       Destination Port        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Sequence Number                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Acknowledgment Number                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Data |       |C|E|U|A|P|R|S|F|                               |
    | Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             | 
    |       |       |R|E|G|K|H|T|N|N|                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |           Checksum            |         Urgent Pointer        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Options                    |    Padding    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                             data                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

- Matching any TCP traffic with a source port > 1024
# tcpdump -i eth1 'tcp[0:2] > 1024'

- Matching TCP traffic with particular flag combinations

The flags are defined in the 14th byte of the TCP header.

    +-+-+-+-+-+-+-+-+
    |C|E|U|A|P|R|S|F|
    |W|C|R|C|S|S|Y|I|
    |R|E|G|K|H|T|N|N|
    +-+-+-+-+-+-+-+-+

笔记:这些是我们感兴趣的标志。

计算旗帜的位置

从顶部开始数字节(8 位),并将其编号为 0:

  • 所以“源端口”&“目的端口”将组成字节 0、1、2 和 3。
  • 下一行,“序列号”,将是4-7。
  • “确认号码”将是字节8-11。
  • “数据偏移”和“Res.”将是字节 12。
  • 这将带您到第 13 个字节,此字节中的位是标志。

位顺序

我还要提到,存储在字节 13 中的数字的排序如下:

  • 位 1 =
  • 位 2 =同步
  • 位 4 =恢复时间
  • 位 8 =聚苯乙烯磺酸钠
  • 位 16 =确认
  • 位 32 =乌拉圭

参考

相关内容