【问题标题】:OSI Layers on local host本地主机上的 OSI 层
【发布时间】:2015-06-25 15:45:06
【问题描述】:

我编写了一个小应用程序来尝试显示捕获数据包的协议标头。我所有的数据包都是用 libpcap 的 pcap_loop 捕获的。我的程序的工作方式如下:我根据 if_ether.h ip.h 和 tcp.h 中定义的结构编写了自己的头文件。 pcap_loop 将 char 指针设置为数据包的开头,然后我逐步遍历数据包,每次都转换为适当的结构,并将指针增加标头的大小。现在重要的是要记住我的问题不是特定于代码的;我的代码有效,但存在我无法理解的逻辑缺陷;请记住,我的数据包是通过同一台机器,不同的端口发送的(我编写了微型 python 服务器,我使用 telnet 将数据发送到):

1.当数据包通过本地主机发送时,以太网标头不显示任何看起来正确的内容(当我在互联网数据包上使用我的程序时,MAC 地址会正确显示)

2.通过反复试验,我确定结构 iphdr 在数据包缓冲区开始后正好 16 个字节开始,而不是预期的 14 个字节,即以太网标头的大小

这些观察使我提出以下问题: 当数据包通过本地主机发送时,我们是否在第 2 层使用另一个协议? 有什么东西可以分隔数据包标头吗? ip.h 和 tcp.h 中定义的 iphdr 和 tcphdr 结构是否已过时?

【问题讨论】:

    标签: c networking localhost pcap


    【解决方案1】:

    当数据包通过本地主机发送时,我们是否在第 2 层使用另一个协议?

    实际上没有第 2 层协议,因为没有真正的网络适配器。

    但是,为捕获流量的程序提供了虚假的第 2 层标头。提供的虚假标头取决于操作系统。

    在 Linux 上,伪造的第 2 层标头是伪造的以太网标头。

    在 *BSD、OS X、iOS 以及我认为的 Solaris 11 上,它们是 DLT_NULL 或 DLT_LOOP 标头,如 the list of libpcap/WinPcap/pcap/pcap-ng link-layer header types 中所述。

    但是:

    通过反复试验,我确定结构 iphdr 在数据包缓冲区开始后正好 16 个字节开始

    如果您在“任何”设备上捕获,则标头为 DLT_LINUX_SLL headers,长度为 16 个字节。

    如果您使用 pcap 或任何 pcap 包装器,您必须在尝试解析之前无一例外地调用 pcap_datalink() 或包装器的等效项您从保存文件中捕获或读取的任何 数据包。您不得假设数据包将具有ANY特定的链路层标头类型。

    【讨论】:

    • 谢谢!这回答了这个问题!另外,在解码 iphdr 时,我怎么知道是否设置了任何选项?据我了解,这会改变标题的大小。最后,如果协议是 ipv6 而不是 ipv4,会发生什么?
    • 这些是单独的问题,应该单独提出,以便得到自己的答案。
    猜你喜欢
    • 2022-06-14
    • 2011-05-13
    • 2012-06-13
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多