常规计算机硬件体系结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二章常规计算机硬件体系结构

早期的包处理系统是建立在常规计算机系统之上的,这也是最廉价的包处理系统。我们定义一个常规的计算机系统由四个基本部件组成:一个CPU,一个内存,一个或多个I/O设备,一条总线。总线连接另外的三个基本部件,并允许它们相互通信。PC机是一个常规计算机系统,因为它包括了以上所有四个部件。

为了将一台常规的计算机转换成一个可以处理数据包的网络系统,必须在计算机上增加一些硬件和软件。增加的硬件用来发送和接收数据包,增加的软件用来处理数据包。

2.1 早期的NIC

将一个计算机系统连接到一个网络的硬件设备称为网络接口卡(Network Interface Card,NIC)。对于计算机来说,NIC和其它I/O设备一样连接到计算机的总线并由CPU控制,CPU 控制NIC的方法与控制其它I/O设备的方法也相同。对于网络来说,NIC表现得像一台主机,即NIC可以发送和接收数据包。

主机和包分析器只连接到一个网络上,这样的系统只需要一块NIC。复杂一些的系统,像网桥、路由器等,要求多个网络连接。当系统需要多个网络连接时,有两种可能的实现方法。一种方法是将多块网卡插入到总线扩展槽中,每块网卡连接一个网络;另一种方法是在一块电路板上提供多个独立的网络接口,电路板插入扩展槽中,每个网络接口连接一个网络,目前已经出现了这种商用的NIC硬件。从计算机的角度来看,这两种方法没有什么区别。但是由于总线扩展槽的数量是有限的,因此后一种方法更好,可以节省扩展槽。

网络接口由CPU操作,这意味着CPU控制着所有数据包的发送和接收。为发送一个数据包,CPU首先在内存中组装好数据包,然后将包传递给NIC,NIC再将数据包发送到网络上。在系统接收一个数据包前,CPU必须先允许NIC,指明数据包存放的位置。NIC等待从网络上到来的数据包,将其存放到指定的位置,然后通知CPU。NIC中通常包含实现物理层协议标准的物理接口芯片组,它们保证每个输出的帧具有正确的格式并且产生出符合物理层协议标准的信号波形;类似地,它们检查每个到来的帧以保证每个帧是有效的。

数据总线上一次可以传输的数据量由数据总线的宽度(即数据线的数目)决定。一般来说,数据总线的宽度不足以一次传输一个完整的帧,因此一个帧必须分成许多较小的片段(如32比特)分多次传递给NIC。由于NIC是由CPU操作的,这意味着CPU必须参与到这种传输过程中。事实上,早期的NIC硬件依赖于计算机系统的CPU完成帧的收发。在帧的接收过程中,CPU反复地访问NIC取得下一个片段的数据,然后存放到内存中。在帧的发送过程中,CPU反复地将帧的片段发送给NIC。使用CPU传输数据包的主要优点是代价低,因为NIC硬件不需要做很多事,因此可以做得很简单。主要的缺点是开销大和可扩展性差,使用CPU处理输入输出意味着它不能做别的事;更重要的是,一个CPU无法适应高速网络,特别是当系统有多个网络接口时。

2.2 现代的NIC

为了支持多个网络接口和适应高速网络,必须将输入/输出和包处理分离开来,并尽可能避免使用CPU,因此现代的NIC都包含独立于CPU操作的复杂硬件。以下四种技术用来优化数据传输和减少开销:(1)卡上地址识别和过滤;(2)卡上包缓存;(3)直接内存访问DMA;(4)操作链。

(1)卡上地址识别和过滤

以太网使用共享媒体进行传输,每个节点实际上可以收到所有的帧,只是丢弃哪些不是

发给自己的帧。这意味着,每个节点必须接收网络上传输的每一个帧,然后检查帧头中的目的地址以决定是否要处理这个帧。如果目的地址匹配节点的单播地址或者广播地址,就处理该帧,否则丢弃。卡上地址识别和过滤的想法很简单,就是不用计算机的CPU检查帧的目的地址,而是用NIC的硬件来测试。也就是说,设计能够独立操作并能检查帧头中目的地址的NIC硬件。当一个帧到达时,NIC检查帧的目的地址;如果目的地址不匹配节点的单播地址或广播地址,则丢弃帧,并且不中断CPU。卡上地址识别可极大减轻CPU的负担,因为所有的帧都在共享网络上传输,而其中只有很少的帧是需要一个特定节点来处理的。

卡上多播地址的识别增加了NIC的复杂度。每个多播地址对应一个多播组,一个节点可以加入到多个多播组中,并且节点可以动态地加入或离开一个多播组,因此节点应识别的多播地址集合是动态改变的,这与固定不变的单播地址及广播地址完全不同。只要多播帧匹配多播地址集合中的任何一个地址,节点就应处理该帧,否则丢弃该帧。早期的NIC不过滤多播帧,而是将所有的多播帧都接收下来,交给CPU去检查和判断。然而,接收所有的多播帧会导致很高的开销,因为多播经常被音/视频这样的应用用来发送连续的数据流。更糟糕的是,网络上所有的节点都要产生这个开销,即使它们不参加任何一个多播组。

为减小开销,现代的NIC提供卡上多播地址识别和过滤。由于多播组是动态的,因此NIC允许CPU描述或改变多播地址集。当NIC加电时,它只识别节点的单播地址和网络广播地址。在任何时候,CPU都可以指示NIC开始接收某个多播地址的帧或者停止接收某个多播地址的帧。一旦CPU指定了地址,NIC就负责所有的识别工作,即接收那些匹配指定地址的帧,并丢弃其余的帧。由于NIC的存储空间是有限的,因此计算机不能指定任意数目的多播地址,事实上,许多NIC限定多播地址集合的大小为32或64。实际上,一个典型的应用在任何时候只加入一到两个多播组(如接收一个音频流和/或一个视频流),而一个节点上任何时候最多只有几个应用加入多播,因此大多数计算机系统只同时使用几个多播地址。

当一个多播帧到来时,将帧头中的多播地址与地址集合中的64个地址逐一比较是一件费时的工作,一般的NIC都没有足够的计算能力在短时间内完成。为此,NIC硬件采用了一种优化的实现方法。NIC维护一个64比特的矢量,并用一个哈希函数将多播地址映射成[0,63]之间的一个数。从本质上说,这是将所有可能的多播地址划分成64个组,每个组对应矢量中的一个比特。对于CPU指定要监听的每个多播地址计算一个哈希值,并将矢量中对应比特的值置为1。当一个多播帧到达时,NIC计算该地址的哈希值,然后检查矢量中对应比特的值。若该比特的值为1,则接收该帧,否则丢弃。在这个方案中,NIC不会漏掉任何一个该接收的多播帧,但可能会收下一个地址不匹配的帧,虽然这种概率是很低的。进一步的检查工作由CPU完成,即CPU收到一个多播帧后要检查其目的地址是否匹配。由于多个地址可能会映射到矢量的同一个比特上,因此当节点离开一个多播组时,不能简单地将该多播地址对应的比特位置1。解决的办法是用一个引用计数器统计有多少个地址对应矢量中的同一个比特,当删除一个多播地址时,只是将该地址在矢量中对应比特的引用计数值减1,当值减为0时,将矢量中该比特位置0。

(2)卡上包缓存

NIC的另一个优化措施是在NIC上增加足够的内存空间,用于缓存到来的包。卡上包缓存的必要性来自以下两个事实:1)包的传输是突发的;2)总线是共享的。网络流量的最大特点是突发性,即链路可能在一段时间里是空闲的,然后在一段时间里突然有持续的数据流出现。NIC必须能够处理连续到来的数据包,因为这些包可能都是送往同一个节点的。如果NIC来不及处理,就有一些包会丢失。总线共享以及与CPU交互均会影响NIC的接收速度。比如,NIC可能需要等待总线,因为其它高优先级的设备正在使用总线;与CPU的交互可能被推迟,因为CPU正在处理较高优先级的中断请求。因此,如果NIC为了每个包都

相关文档
最新文档