简介

我正在编写一个应用程序,需要能够跟踪网络流量的谨慎配置文件的吞吐量(当然,使用libpcap) . 基本思想是在每个常规采样间隔期间累积字节和数据包计数器,并使用它计算大约1秒间隔的平均吞吐量 .

详情

每个数据点都由远程地址和远程端口区分 . 它们将(非常短的)样本历史存储在由以下结构组成的循环缓冲区中:

typedef struct {
  struct timeval ts_start;  // Time at the start of this sample
  size_t packets;           // packet count during this sample
  size_t bytes;             // byte count during this sample
} Sample;

我最初的想法是使用类似于以下内容的STL和Boost做一些事情:

typedef std::pair<unsigned long /* addr */, unsigned short /* port */> PeerSpec;
typedef boost::circular_buffer<Sample> DataPoint;
std::map<PeerSpec, DataPoint> tracked_peers;

每个循环缓冲区将包含少量元素,该数字定义为 1 + summary_interval / sample_period . 我认为在1秒的汇总间隔中,250-1000毫秒的采样周期是合适的(意味着每个数据点有2-5个历史样本) .

在捕获中观察到此类流量时,将实例化每个数据点并将其动态添加到 tracked_peers 映射 . 当然,计数器将通过我的pcap回调逐个数据包更新 .

问题

以这种方式做到这一点是疯狂/不明智/不可能的吗?我担心它可能不足以跟上数据包捕获的速度 . 我需要注意哪些复制语义?我认为它应该是合适的,只要我没有导致循环缓冲区在每次更新时都被复制 . 我问,因为我不确定我是否完全掌握了所有的含义 .