找出原始套接字中丢弃的数据包的数量

时间:2015-06-09 09:14:17

标签: linux sockets

我正在开发一个程序,使用原始套接字( AF_PACKET,SOCK_RAW )嗅探网络数据包并以某种方式处理它们。

我不确定我的程序是否运行得足够快并成功捕获套接字上的所有数据包。我担心这个套接字的接收缓冲区显然已满(由于流量突发),一些数据包被丢弃。

  

我如何知道数据包是否由于空间不足而被丢弃   socket的接收缓冲区?

我尝试过ss -f link -nlp

这将输出当前存储在该套接字的revice缓冲区中的字节数,但我无法判断是否有任何数据包被丢弃。

我正在使用 Ubuntu 14.04.2 LTS(GNU / Linux 3.13.0-52-generic x86_64 )。

感谢。

2 个答案:

答案 0 :(得分:1)

我遇到了与你类似的问题。我知道tcpdump能够生成有关丢包的统计信息,所以我试图弄清楚它是如何做到的。通过查看tcpdump的代码,我注意到它本身并没有生成这些统计信息,而是使用libpcap库来获取这些统计信息。另一方面,libpcap通过访问if_packet.h头并调用PACKET_STATISTICS套接字选项来获取这些统计信息(至少我是这么认为的,但我不是C专家)。

因此,我只看到了两个问题的解决方案:

  1. 我不得不以某种方式与我的Pyhton脚本中的linux头文件进行交互以获取数据包统计信息,这看起来有点复杂。
  2. 使用Python版本的libpcap(pypcap)来获取这些信息。
  3. 由于我不知道如何做第一件事,我实施了第二个选项。以下是如何使用pypcap获取数据包统计信息以及如何使用dpkg获取数据包数据的示例:

    import pcap
    import dpkt
    import socket
    
    pc=pcap.pcap(name="eth0", timeout_ms=10000, immediate=True)
    
    def packet_handler(ts,pkt):
    
        #printing packet statistic (packets received, packets dropped, packets dropped by interface
        print pc.stats()
    
        #example packet parsing using dpkt
        eth=dpkt.ethernet.Ethernet(pkt)
        if eth.type != dpkt.ethernet.ETH_TYPE_IP:
            return
        ip =eth.data
        layer4=ip.data
        ipsrc=socket.inet_ntoa(ip.src)
        ipdst=socket.inet_ntoa(ip.dst)
    
    pc.loop(0,packet_handler)
    

答案 1 :(得分:-2)

首先,关闭操作系统。

您需要一个可靠的,面向网络的操作系统。不是一些粉红色蓬松&易于使用"与"安全"功能启用。 NetBSD或Gentoo / ArchLinux(裸设备,而不是GUI设备)。

在网络点按上同时启动tcpdump并捕获您应该在程序旁边收到的流量并比较结果。

没有有效的方法来检查您是否已经收到了您打算在接收端的所有数据包,因为数据包可能会被丢弃在比您预期的更低的级别。

这也是针对Unix @ StackOverflow的问题,我在这里没有编程,至少没有代码。

验证数据包丢弃的唯一方法是让一个更强大的发送者(可能是一组发送数据包的机器)到一个客户端,记录发送给你的接收者的每个数据包。对统计数据进行分析并与发件人进行比较,看看你有多少掉线。

更便宜的方法是在交换机中购买网络分流器甚至更多ad-hoc启用端口镜像(如果可能)。这使您可以将尽可能多的流量转储到第二台计算机中。

这将为您提供更准确的结果,因为您的应用程序计算机将忙于处理传入流量并对其进行处理。 此外,这就是为什么网络分流器有效的原因,因为它们将通信分成两个通道,如果您愿意,可以将流量的接收和发送方向分开。这使您可以在两台独立的计算机上捕获流量(也使用tcpdump,但您可以使用镜像端口而不是镜像端口)。

因此要么使用端口镜像

enter image description here

或者您购买其中一种:

enter image description here