本地主机上的 OSI 层

OSI Layers on local host

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

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

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

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

When packets are sent over local host, do we use another protocol on layer 2?

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

但是,为捕获流量的程序提供了伪造的第 2 层 header。提供的假 header 是 operating-system-dependent.

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

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

中所述

但是:

Through trial and error, I've determined that the structure iphdr starts exactly 16 bytes after the start of the packet buffer

如果您在 "any" 设备上捕获,header 是 DLT_LINUX_SLL headers,长度为 16 个字节。

如果您正在使用 pcap 或任何 pcap 包装器,您必须,毫无例外地调用 pcap_datalink(),或者包装器的等价物,在尝试解析 any 数据包之前捕获或从保存文件中读取。你不能假设数据包将任何特定link-layer header 类型。