几乎没有任何其他数据集的规模可以与互联网上流动的大网络数据相媲美。到2016年,全球IP每年流量预计将超过ZB(zettabyte),即10亿太字节TB(a billion terabytes)。高速路由器(High-speed routers)现在可以以每秒数百太比特(hundreds of terabits)的速度转发网络流量(Cisco CRS-3)。在大型企业网络中,来自路由器、交换机、入侵检测系统和防火墙的流量记录traffic records(如NetFlow)和日志(logs)会不断产生,占用大量存储空间; 通常,这样的流量记录在删除之前只保留有限的时间框架(limited time frame),以便为新信息腾出空间。大数据也发生在网络边缘。举几个例子,谷歌每秒处理超过4万个搜索查询(search queries),每天产生5亿条推文,阿里巴巴等主要在线零售商每年处理超过10亿销售额。随着这些数据日复一日、年复一年地积累,从这些数据中挖掘知识(mining them for knowledge)成为一项艰巨的任务,需要大量的资源。这本书的目的是开发新的紧凑和快速的在线测量方法(online measurement methods),减少大网络数据的测量摘要数量级(measurement summaries orders-of-magnitude),小于传统方法可以做的。新方法有望允许路由器使用网络处理器上的小型缓存内存(small cache memory on network processors) 对大型网络流量进行实时测量,允许企业系统在更长的时间框架内存储其流量记录(以摘要(summaries)的形式),并允许用户使用普通计算资源对大型网络数据进行分析。
现代路由器通过交换结构将数据包从输入端口转发到输出端口。为了实时处理数据包,在网络处理器上实现流量测量(traffic measurement)、数据包调度(packet scheduling)、访问控制(access control)和服务质量(quality of service)等在线模块,几乎完全绕过主存储器和CPU。网络处理器芯片上常用的缓存存储器是SRAM,通常是几兆字节(a few megabytes)。将片上内存(on-chip memory)增加到10MB以上在技术上是可行的,但它的价格要高得多,访问时间也更长。片外SRAM(off-chip SRAM)或嵌入式DRAM(embedded DRAM)(基于3-D堆叠互连或封装在同一模块上built on 3-D stacking interconnect or packaging on the same module)可以做得更大。但是,它的访问速度较慢,并且网络处理器与其片外内存之间的带宽可能成为性能瓶颈。因此,片上存储器(on-chip memory)仍然是在线网络功能(online network functions)的首选,这些功能的设计与线路速度(line speed)相匹配。
为了使问题更具挑战性,有限的片上内存可能必须在同一芯片上实现的路由(routing)/性能(performance)/测量(measurement)/安全(security)功能之间共享。每个功能只能使用可用空间的一小部分。根据它们的相对重要性,一些功能可能只分配一小部分片上内存,而它们必须处理和存储的数据量在高速网络中可能非常大。内存需求和供应(supply)的巨大差异要求我们尽可能紧凑地实现在线功能(online functions),包括实时流量测量。例如,如果分配给流量测量功能的片上内存量为1Mb,但有1M个并发流(concurrent flows),每个流1位(1 bits per flow),我们还可以进行逐流流量测量(per-flow measurement)。如果有10M并发流,仍然使用相同的内存分配方案即1Mb,会是什么样呢?这就是我们想通过这本书达到的目的。
线下(offline)时也存在空间问题,其中磁盘用于长期存储网络流量数据以进行长期分析。由于这些数据是不断产生的,因此它们的存储时间是有限的。对于给定数量的磁盘空间,我们减少的流量数据越小(the smaller we can reduce the traffic data, the longer we can keep the data before it has to be removed.),在必须删除数据之前保留数据的时间就越长
当我们分析大数据时,空间问题(space issue)也会出现。假设有一个访问网络搜索记录的分析师想要分析(profile)每个关键字keyword/短语phrase/问题question/句子sentence的搜索次数。这些信息对在线社交(online social)/经济(economical)/舆论趋势研究(opinion trend studies)很有用。分析(profiling)可能需要数十亿个计数器,如果分析人员想要删除同一用户的重复搜索,则需要更复杂的数据结构——这被称为基数测量或估计(cardinality measuremnet or estimation) 。Google的各种数据分析系统,如Sawzall、Dremel和PowerDrill,每天都会估计非常大的数据集的基数,这对计算资源,特别是内存提出了挑战——对于PowerDrill系统,查询的不可忽略部分不能从历史上被计算(a non-negligible fraction of queries historically count not be computed),因为它们超出了可用内存。
作为另一个例子,让我们考虑一位可以访问在线零售商数十亿销售记录的分析师。假设她想分析购买关联(purchase associations)。每个关联(association)被定义为购买一个产品,伴随着从同一个客户购买另一个产品。分析(profiling)每个关联的频率有助于零售商在客户购买后跟进产品推荐。然而,这种分析需要配对(pairing up)销售记录。配对增加的努力(the multiplicative effort of pairing)可能会导致大量的购买关联,远远大于销售记录的数量。尽管分析人员可能会求助于数据中心来获取所需的资源,但如果我们能够在普通的笔记本电脑上完成同样的工作,即使笔记本电脑上可用内存位(memory bits)的数量远远少于购买关联的数量,这当然是受欢迎的。
在本书中,我们将网络数据建模为一组流(a set of flows),每个流都是基于测量需求定义的数据子集的抽象(the abstraction of a data subset)。例如,我们可以将来自相同源地址的所有数据包视为流,即单源流(per-source flow) 。在这种情况下,流标识符(the flow identifier)是包头(packet header)中的源地址。类似地,我们可以定义单目的流(per-destination flows)、per-source/destination flows、TCP流、WWW流、P2P流或其他特定于应用程序的流(other application-specific flows) 。我们还需要定义要测量的流中的元素(elements) 。根据应用程序的需要,这些元素(elements)可以是目的地址、源地址、端口,甚至是流的数据包(in the packets of a flow)中出现的关键字(keywords)。
大网络数据(big network data)由数百万甚至数十亿的流(flows)组成。我们可以测量流量大小(flow size) ——这就是NetFlow所做的——以字节数或数据包数(in number of bytes or packets); 在这里,每个字节(或数据包)(each byte or packet)都被视为一个要计数的元素(element)。我们可以通过每个流中不同元素的数量来度量流基数flow cardinality(这是防火墙经常做的事情)。这是一个更难的问题,因为为了删除流中的重复元素,我们需要一种方法来记住我们在过去看到过的元素。或者我们可以测量流的持续基数(the persistent spread of a flow) : 对于一定数量的连续周期,如果流的一个元素在每个周期中出现,我们称之为持久元素(a persistent element) 。流在给定周期内的持续基数(the persistent spread of the flow)被定义为流中持续元素的不同数量(the distinct number of persistent elements in the flow)。这本书提出了三个重要的基本在线功能:单流大小测量(per-flow size measurement),持续基数测量(persistent spread measurement),和单流基数测量(per-flow cardinality measurement) 。
测量流量大小(Measuring flow size) 有许多重要的应用。我们可以测量每个TCP流中的数据包数量,每个ip语音会话(voice-over-IP session)的数据速率,每个主机下载的字节数,来自每个源地址的SYN数据包数量,或者发送到每个地址的ACK数据包数量。这些信息对于服务提供(service provision)、容量规划(capacity planning)、会计(accounting)和计费(billing)以及异常检测(anomaly detection)非常有用。例如,测量SYN/ACK数据包的数量为检测SYN攻击提供了一种手段。另一个例子,如果我们使用客户端地址作为流量标识符(flow identifiers),每流大小测量(per-flow size measurement)提供了每个客户端的流量容量(traffic volume),这是基于使用的计费(usage-based billing)和优雅的服务区分(graceful service differentiation)的基础,其中客户端的服务优先级(service priority)在超过其资源配额时优雅地下降(gracefully drops as he over-speeds his resource quota)。
研究连续测量期间的每流统计数据(per-flow statistics) 可以帮助我们发现网络访问模式,并与用户分析(user profiling)一起揭示用户之间的地理/人口流量分布(geographi / demographic traffic distributions)。这些信息将有助于互联网服务提供商和应用程序开发人员使网络资源分配符合大多数人的需求。在发生僵尸网络攻击(botnet attack) 时,小流量突然激增,安全管理员可以分析流量大小分布(flow size distribution)的变化,并使用每个流量的信息(per-flow information)来编译(compile)导致变化的候选僵尸列表(the list of candidate bots),帮助缩小范围以进行进一步调查。
在本书中,我们首先提出了一种新的SRAM-only counter architecture的计数器架构,称为计数器树(Counter Tree) 。这些贡献总结如下:
测量流量基数(Measuring flow cardinality) 也有许多应用。地址扫描检测(Address-scan detection) 是测量每个单源流(per-source flow)中不同目的地址(元素)的数量。如果发现一个源(source)与太多目的地(destinations)联系,则将其标记为潜在扫描器(potential scanner)。在蠕虫攻击随机扫描(random scanning in worm attacks) 的情况下,这种基数测量提供了蠕虫(worm)的感染率。类似地,端口扫描检测(port-scan detection) 是测量每个per-source/destination流中不同目的端口的数量。在另一个应用程序示例中,我们将发送到公共目的地(common destination)的所有数据包视为单目的地流(per-destination flow) ,并计算每个流中不同源地址的数量。如果我们观察到某个流的基数突然激增,这可能是针对该流的目的地址进行DDoS攻击的信号。对于其他应用程序,大型服务器群(a large server farm)可以通过跟踪访问每个文件的不同用户的数量来了解其内容的受欢迎程度,其中对文件的所有访问形成抽象流(abstract flow); 机构网关(institutional gateway)可以通过跟踪每个web内容的出站web请求(outbound wet requests for each web content)数量来确定缓存优先级(caching priority)的外部web内容(external web content)的受欢迎程度,其中来自不同用户对公共URL的所有请求形成一个流(a flow)。流量基数也可以帮助识别P2P主机 。
对于引言中网络边缘的大数据案例,如果我们将查询同一短语(phrase)的所有搜索记录视为一个流,我们可以将每个流的基数(the cardinality of each flow) 定义为执行搜索的不同源地址的数量,这表明短语的流行程度(popularity of the phrase),因此在社会/经济/疾病趋势研究中很有用。如果我们将每个在线购买关联(online purchase association)视为一个流(a flow),我们可以将流基数定义为购买关联中两种产品的不同消费者的数量,这为定向广告(targeted advertisement)提供了信息。
为了处理由大量流组成的大数据,在设计基数估计模块(cardinality estimation module)时必须节省内存空间(conserve memory space)。为此,过去开发了一系列解决方案,包括PCSA、MultiresolutionBitmap(which is a generalization of LinearCounting)、MinCount、LogLog、HyperLogLog等。它们都为每个流分配一个单独的数据结构,称为估计器(estimator) 。每个估计器包含一定数量的寄存器(registers)、位图(bitmaps)或其他基本数据结构。参考文献[11]HyperLogLog中最紧凑的估计器需要数百字节才能保证较大的估计范围(a large estimation range)和较好的估计精度,这对于测量大型网络数据来说仍然是太多了。
经过几十年的发展,在不牺牲估计范围或精度的情况下,将单个估计器的大小进一步压缩到数百位(hundreds of bits)以下似乎非常困难。最近,一个有趣的想法是让不同的估计器(每个对应一个流)共享比特(share bits),以至于一个未使用的比特就可以被另一个获取。我们发现共享比特(sharing bits)实际上是低效的(inefficient),因为在估计器之间引入了太多的噪声(noise)。共享空间(sharing space)是好的,但是应该在寄存器级别(register level)而不是位级别(bit level)上进行不同的操作,寄存器是一个多比特的数据结构,稍后将介绍。此外,共享(sharing)只应用于位图(bitmap)和PCSA[10],早期的工作可以追溯到1985年。我们开发了一个虚拟估计器框架(a framework of virtual estimators) ,该框架支持最近的基数估计解决方案的内存共享,包括LogLog[8]和HyperLogLog[11],后者是现有工作中最好的。最后,我们完整地开发了虚拟HyperLogLog解决方案(the virtual HyperLogLog solution) ,并提供了一个在共享空间记录单流信息(per-flow information)的新程序,给出了一组去除噪声后的单流基数估计公式(per-flow cardinality ),以及在寄存器共享条件下(register sharing)估计误差的分析结果。我们表明,新的解决方案可以在每个流少于1位甚至每流十分之一位(1 bit per flow or even one tenth of a bit per flow)的紧张内存空间中工作——这是以前从未实现过的任务。
传统的超级传播者检测器(SuperSpreader detector) 用于识别有异常大的基数(abnormally large spreads)的流量,在网络异常监测中有很多应用。例如,如果一个spreader 估计器可以测量每个源流(per-source flow)中不同目的地的数量,那么它可以用于检测网络扫描器(network scanners)(或受感染的主机),它们探测大量不同的目的地(destinations)。另一个例子是单目的地流的spreader估计器(spreader estimator of per-destination flows),它可以用于检测众所周知的DDoS攻击,在这种攻击中,恶意方使用一群受损主机(compromised hosts)来压倒目标服务器。
问题1:per-flow measurement,per-source flow,per-destination flow,spreader,SuperSpreader、network scanners、persistent flows这些概念不清楚,尤其是这个per到底是什么东西,单条的意思吗?spreader是基数估计吗和super superSpreader是什么关系?这个persistent flows都说是在很多时间窗口中都出现的流,那怎么检测多个时间窗口呢,感觉很模糊
但是,如果攻击者故意抑制流量容量(traffic volumes)和基数(spreads)以逃避检测,则超级传播器者检测器(superSpreader detector)可能无法发现恶意活动。在这些情况下,**测量持久流基数(measuring persistent flow cardinality)**可能会找到它的应用。考虑两个例子,其中仅流基数是不够的。首先,如果扫描器(scanners)向太多的目标地址发送探测,也就是说,每个源流的基数(the cardinalities of per-source flows)很大,扫描器就可以被识别出来。然而,一个隐匿的扫描器(a stealthy scanner)可能有意降低其探测速率(probing rate)来控制其流量基数(flow cardinality),以逃避检测。即使降低了探测速率(probing rate),经过足够的时间后,扫描器(scanner)也可以发现存在漏洞的系统。**测量持久流基数(Measuring persistent flow cardinality)**可以帮助识别这种类型的扫描器。当扫描器随时间探测不同的目标地址时,其持久流基数(persistent flow cardinality)为零。因此,适度的流基数(modest flow cardinality)(但通常较低的持久基数low persistent cardinality )表示在目标地址空间漫游的低速率扫描器(a low-rate scanner)。
在第二个示例中,如果有太多的客户端向服务器发送请求,即每个目的地流的基数(the cardinality of a per-destination flow)太高,则可以识别出DDoS攻击。然而,在攻击机器数量较少的情况下,隐蔽的拒绝服务攻击(stealthy denial-of-quality attacks)不会试图用过多的请求使目标服务器不堪重负,而是降低其性能(degrade its performance)。如果攻击机器的数量与合法用户的数量相似,我们就不会看到异常的流量基数(unusual flow cardinality)。在这种情况下,**测量持久流基数(measuring persistent flow cardinality)**可能会有所帮助。根据我们对CAIDA的真实网络痕迹(traces)的分析,合法用户与其目标服务器之间的持续交互通常短于20分钟。对于隐蔽的拒绝服务攻击,由于其目的是长期降低目标服务器的性能,攻击机器将持续向目标服务器发送请求,导致随着时间的推移,持久性基数(persistent cardinality)显著高于通常值(usual value)。
本书提供了一个基于多虚拟位图(multi-virtual bitmaps) 的数据结构的**持久基数估计器(persistent spread estimator)**的实现。它所需的片上SRAM空间的大小与时间段的数量t(the number of time periods t)无关,而是取决于在一个时间段内通过路由器的流元素的数量。更准确地说,在每个时间段内,其所需的SRAM的大小小于每个流元素一位(one bit per-flow element)。
即使在如此有限的空间下,我们的算法也能够提供很高的估计精度。评估结果表明,我们的估计器比Flajolet-Martin sketches 的连续变体(continuous variant)准确率高90%。这样的改进来自于我们的观察,在真实的网络流量跟踪(traces)中,合法用户与HTTP/HTTPs服务器的持续交互在持续时间上非常短,通常不到20分钟。因此,可以过滤合法用户的短期行为流量(the short-term behaviors),保留可能与隐蔽的DDoS攻击或网络扫描(network scanning)相关联的长期持续流量(long-term persistent traffic)。此外,随着测量周期t的增加,我们的算法的估计精度也会提高,因为它能够更有效地过滤合法用户的短期流量(short-term traffic of legitimate users)。随着t增长而增加的精度是一个有用的特性,它允许网络管理员任意增加t,以区分持久元素和正常的瞬时流量(distinguish persistent elements from normal transient traffic)。
与传统的位图方法(bitmap method) 相比,我们的算法还提供了另一个优势,即将产生有效测量的操作范围扩展了数百倍(extends the operating range of producing effective measurements by hundreds of times),传统的位图方法(traditional bitmap method) 为每个流分配一个大小相等且分隔的位图(equal-sized and separated bitmap)。相反,我们的方法允许不同的流共享公共内存池中的位(share bits from a common memory pool)。通过从池中随机抽取比特(drawing bits randomly from the pool),单个流构建一个虚拟位图(vitrual bitmap) ,用于估计其持续基数(persistent spread)。通过位共享(bit sharing) ,大流量(large flows)可以从小流量(small flows)中“借用”位,扩大其有效工作范围。通过基于真实网络流量跟踪的实验,我们评估了算法的性能,包括内存开销(memory expense)、估计精度(estimation accuracy)和操作范围(operating range)。
本书的其余部分组织如下。第二章提出了一种基于二维计数器共享(two-dimensional counter sahring) 的可扩展的流量大小测量计数器架构(a scalable counter architecture for per-flow size measurement)。在这一章中,我们为数据包记录/解码(recording/decoding) 提供了一种新颖的树形计数器结构(tree structure of counters) ,它将每个流的信息(per-flow information)随机混合在一个紧凑的SRAM空间中。第三章提出了一种基于寄存器(多比特)级共享的虚拟估计器框架(a framework of virtual estimators based on register(multi-bit) level sharing)。我们可以将该框架应用于基数估计(cardinality estimation)的各种解决方案,获得比现有最佳工作更好的内存效率(memory efficiency)。第四章提出了一种基于物理位图中位共享(based on bit sharing in physical bitmap)的持久基数测量(persistent spread measurement)方案,该方案将测量周期内所有流的元素记录到单个位图(single bitmap)中。在不同的测量期间建立的位图可以组合起来估计任何流的持续基数(the persistent spread of any flow)。