SharpPcap - 传入的数据包被丢弃

Posted

技术标签:

【中文标题】SharpPcap - 传入的数据包被丢弃【英文标题】:SharpPcap - Incoming packets are dropped 【发布时间】:2019-07-25 21:36:20 【问题描述】:

我正在编写一个通过以太网与外部设备通信的 C# 应用程序。我为此使用 SharpPcap 版本 4.5.0。

不幸的是,我不得不意识到一些传入的数据包被丢弃了。为了测试,我还在外部设备和我的计算机之间放置了一个开关,它也记录每个数据包。在此日志中,数据包是可见的。因此我很确定这个数据包真的被发送了(这不是外部设备的错误)。

这是我使用的代码:

public bool TryActivateChannel(uint channelNumber, out string message)
    
        message = string.Empty;
        devices[(int)channelNumber].Open(DeviceMode.Promiscuous);
        devices[(int)channelNumber].OnPacketArrival += PacketArrived;
        devices[(int)channelNumber].StartCapture();
        return true;
    

public bool CloseChannel(uint channelNumber, out string message)
        
            message = string.Empty;
            devices[(int)channelNumber].OnPacketArrival -= PacketArrived;
            devices[(int)channelNumber].Close();
            return true;
        
private void PacketArrived(object sender, CaptureEventArgs e)
        
            if (e.Packet.LinkLayerType != PacketDotNet.LinkLayers.Ethernet)
            
                return;
            
            else
            
                inputQueue.Enqueue(e);
            

devices 只是 CaptureDeviceList.Instance 而 inputQueue 是一个 ConcurrentQueue,它在另一个线程中出列。该线程将每个传入的数据包写入 *.pcap 文件(其中数据包丢失)。此外,我查看了 ICaptureDevice 的 Statistics 属性,它声称没有丢弃任何数据包。我也试过在另一台电脑上运行它,以确保它不是网卡的问题。

此时,我真的很无奈。我的代码做错了吗?这是一个已知的问题?我在其他地方读到 SharpPcap 可以管理高达 3 MBit/s。我离这个值很远,因此我不认为这是一个性能问题。

附录:我也尝试了作者提供的List,而不是ConcurrentQueue。在那里,我得到了相同的结果:丢失了一些数据包。我还有一个没有第二个线程的版本,其中数据包直接在事件处理程序中处理。结果相同:数据包丢失。此外,我与 Wireshark 同时捕获。在这里,数据包也丢失了。我意识到丢失的数据包都有一个共同点,即它们都有一定的长度(大约超过 60 个字节)。对于较短的数据包,我从未观察到它们丢失了。我正在使用 WinPcap 4.1.3。问题出在哪里?

【问题讨论】:

作者提供了一个decent example 来工作。该代码中的lock 不是可选的。 @HansPassant 非常感谢您的回复。我也尝试过这种方法,但没有成功。请参阅我在问题中提供的其他信息。 我也有同样的问题,而且我有一个 AMD 3950x...所以这不是 CPU 问题。就我而言,速度约为 15kb/s,而且包仍在下降 【参考方案1】:

作为记录,如果您在 WireShark 中看不到数据包,则问题既不在您的代码中,也不在 SharpPcap 中。 这意味着它要么在硬件中,要么在驱动程序/操作系统中。


收不到包的常见原因:

数据包带有 VLAN 标记,根据适配器配置,它可能会在到达操作系统之前丢弃带有 VLAN 标记的帧。

防火墙:一些防火墙能够阻止数据包到达 Npcap/WinPcap 驱动程序,这通常会影响 IP 数据包。

错误的驱动程序:示例:Npcap 错误https://github.com/nmap/npcap/issues/119

数据包“丢弃”:这意味着数据包被硬件本身拒绝, 您可以使用命令netstat -e 进行检查,通常原因:

电缆不好:是的,真的。 帧冲突:使用半双工电缆以及数据包之间的时间太短时会更频繁地发生。

【讨论】:

以上是关于SharpPcap - 传入的数据包被丢弃的主要内容,如果未能解决你的问题,请参考以下文章

SharpPcap 中的离线数据包过滤

如何通过Sharppcap获得连续数据包?

.net 数据包捕获:pcap.net 与 Sharppcap

DNS解析污染原理——要么修改包,要么直接丢弃你的网络包

从零开始学安全(四十三)●Wireshark分析ICMP(IP)协议

Pcap.net vs Sharppcap