Linux 查找原始套接字中丢弃的数据包数
我正在开发一个程序,它使用原始套接字(AF\u PACKET,SOCK\u raw)嗅探网络数据包,并以某种方式处理它们 我不确定我的程序是否运行得足够快,是否能成功捕获套接字上的所有数据包。我担心这个套接字的接收缓冲区有时会满(由于流量突发),一些数据包会被丢弃 我如何知道数据包是否由于数据包中缺少空间而被丢弃 套接字的接收缓冲区 我试过运行Linux 查找原始套接字中丢弃的数据包数,linux,sockets,Linux,Sockets,我正在开发一个程序,它使用原始套接字(AF\u PACKET,SOCK\u raw)嗅探网络数据包,并以某种方式处理它们 我不确定我的程序是否运行得足够快,是否能成功捕获套接字上的所有数据包。我担心这个套接字的接收缓冲区有时会满(由于流量突发),一些数据包会被丢弃 我如何知道数据包是否由于数据包中缺少空间而被丢弃 套接字的接收缓冲区 我试过运行ss-f link-nlp 这将输出当前存储在该套接字的revice缓冲区中的字节数,但我无法判断是否有任何数据包被丢弃 我使用的是Ubuntu 14.0
ss-f link-nlp
这将输出当前存储在该套接字的revice缓冲区中的字节数,但我无法判断是否有任何数据包被丢弃
我使用的是Ubuntu 14.04.2 LTS(GNU/Linux 3.13.0-52-generic x86_64)
谢谢。首先,请关闭操作系统。
您需要一个可靠的、面向网络的操作系统。不是启用了“安全”功能的粉色蓬松的“易用性”。NetBSD或Gentoo/ArchLinux(裸安装,而不是GUI套件)
在网络点击上同时启动一个
tcpdump
,捕获您应该在程序一侧接收的流量,并比较结果
没有有效的方法来检查您是否已在接收端接收到您想要的所有数据包,因为数据包可能会在低于您预期的级别上丢弃
这也是Unix@StackOverflow的一个问题,这里没有编程,至少没有代码
唯一确定的验证数据包丢失的方法是让一个更强大的发送方(可能是一个发送数据包的机器群)到一个客户端,记录发送到接收方的每个数据包。将统计数据与你的发件人进行分析和比较,看看你下降了多少 更便宜的方法是购买网络分路器,或者如果可能的话,在交换机中购买更多的特设端口镜像。这使您能够将尽可能多的流量转储到第二台计算机中 这将为您提供更准确的结果,因为您的应用程序计算机将忙于处理传入的流量并对其进行处理。 此外,这也是网络窃听之所以有效的原因,因为它们将通信分为两个通道,如果您愿意的话,您的通信的接收和发送方向。这使您能够在两台单独的计算机上捕获流量(也可以使用
tcpdump
,但可以获得更精确的流量镜像,而不是镜像端口)
因此,要么使用端口镜像
或者你买一个: 首先,关闭操作系统。 您需要一个可靠的、面向网络的操作系统。不是启用了“安全”功能的粉色蓬松的“易用性”。NetBSD或Gentoo/ArchLinux(裸安装,而不是GUI套件)
在网络点击上同时启动一个
tcpdump
,捕获您应该在程序一侧接收的流量,并比较结果
没有有效的方法来检查您是否已在接收端接收到您想要的所有数据包,因为数据包可能会在低于您预期的级别上丢弃
这也是Unix@StackOverflow的一个问题,这里没有编程,至少没有代码
唯一确定的验证数据包丢失的方法是让一个更强大的发送方(可能是一个发送数据包的机器群)到一个客户端,记录发送到接收方的每个数据包。将统计数据与你的发件人进行分析和比较,看看你下降了多少 更便宜的方法是购买网络分路器,或者如果可能的话,在交换机中购买更多的特设端口镜像。这使您能够将尽可能多的流量转储到第二台计算机中 这将为您提供更准确的结果,因为您的应用程序计算机将忙于处理传入的流量并对其进行处理。 此外,这也是网络窃听之所以有效的原因,因为它们将通信分为两个通道,如果您愿意的话,您的通信的接收和发送方向。这使您能够在两台单独的计算机上捕获流量(也可以使用
tcpdump
,但可以获得更精确的流量镜像,而不是镜像端口)
因此,要么使用端口镜像
或者你买一个:
我和你有着类似的问题。我知道tcpdump能够生成关于数据包丢失的统计数据,所以我试图找出它是如何做到这一点的。通过查看tcpdump的代码,我注意到它不是自己生成这些统计信息,而是使用libpcap库来获取这些统计信息。另一方面,libpcap通过访问if_packet.h头并调用packet_statistics套接字选项(至少我这么认为,但我不是C专家)来获取这些统计信息 因此,我只看到了两种解决问题的方法:
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)
tpacket_stats结构在linux/packet.h头文件中定义
使用tpacket_stats结构创建变量,并使用PACKET_STATISTICS将其传递给getSockOpt。SOL_SOCKET选项将给出接收到的数据包和丢弃的数据包数
--有时,下降可能是由于缓冲区大小
--因此,如果要减少丢弃计数检查,请使用setsockopt函数增加缓冲区大小我遇到了与您类似的问题。我知道tcpdump能够生成关于丢包的统计信息