我正在编写一个应用程序,需要能够跟踪网络流量的谨慎配置文件的吞吐量(当然,使用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回调逐个数据包更新。
以这种方式做到这一点是疯狂/不明智/不可能吗?我担心它可能不足以跟上数据包捕获的速度。我需要注意哪些复制语义?我认为它应该是合适的,只要我没有导致循环缓冲区在每次更新时都被复制。我问,因为我不确定我是否完全掌握了所有的含义。