![Windows 机器上 Wireshark 数据包接收和处理流程是怎样的?](https://linux22.com/image/684609/Windows%20%E6%9C%BA%E5%99%A8%E4%B8%8A%20Wireshark%20%E6%95%B0%E6%8D%AE%E5%8C%85%E6%8E%A5%E6%94%B6%E5%92%8C%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%EF%BC%9F.png)
我即将使用Wireshark用于我的一些流量监控视窗电脑。在操作过程中,我想知道Wireshark设法在之前捕获低级网络数据包视窗做。
首先,我的 NIC 上的网络接口接收一个数据包。然后 NIC 进行一些初始检查(CRC、正确的 MAC 地址等)。假设验证成功,NIC 将转发数据包。但是如何转发以及转发到哪里呢?
我知道驱动程序是 NIC 和操作系统或其他应用程序之间的粘合剂。我进一步猜测,应该有一个单独的驱动程序视窗和Wireshark(网卡?)。 否则,Wireshark无法接收以太网帧。是否有两个或多个 NIC 驱动程序同时共存?NIC 如何知道要使用哪一个?
答案1
Windows 中的 I/O 模型基于组件堆栈。数据必须流经物理网卡和使用数据的应用程序之间的堆栈的各个组件。有时,这些不同的组件会在数据流经堆栈时检查数据(例如 TCP 数据包),并且根据该数据包的内容,数据可能会被更改,或者数据包可能会被完全丢弃。
这是“网络堆栈”的简化模型,数据包通过该模型从应用程序传输到网络,反之亦然。
上面的屏幕截图中显示的其中一个最有趣的组件是 WFP(Windows 筛选平台)Callout API。如果我们放大它,它可能看起来像这样:
开发人员可以自由地将自己的模块插入此堆栈中的适当位置。例如,防病毒产品通常使用“过滤驱动程序”插入此模型并检查网络流量或提供防火墙功能。Windows 防火墙服务显然也适合此模型。
如果您想编写一个记录网络流量的应用程序,例如 Wireshark,那么适当的方法是使用您自己的驱动程序,并将其尽可能低地插入堆栈,以便它可以在防火墙模块有机会丢弃网络数据包之前检测到它们。
因此,此过程涉及许多“驱动程序”。驱动程序的类型也多种多样。此外,系统上的其他输入/输出形式(例如硬盘驱动器的读取和写入)也遵循非常相似的模型。
另外需要注意的是,WFP 调用并不是进入网络堆栈的唯一方法。以 WinPCap 为例,它通过驱动程序直接与 NDIS 交互,这意味着它有机会在进行任何过滤之前拦截流量。
参考:
答案2
正如 Ryan Ries 的回答所说:
以 WinPCap 为例,它通过驱动程序直接与 NDIS 交互,这意味着它有机会在进行任何过滤之前拦截流量。