登录
首页 工业以太网 工业以太网
回帖 发帖
正文

主题:NIC的历史

点击:911 回复:1


http://blog.gkong.com/images/file/doc.gif
nic的历史.doc

(完整版,从历史去理解,能洞察出其本质!)

早期的包处理系统是建立在常规计算机系统之上的,这也是最廉价的包处理系统。我们定义一个常规的计算机系统由四个基本部件组成:一个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为了每个包都向cpu请求中断,则nic可能会因遭遇延迟而丢包。
卡上缓存允许nic处理突发的流量,因为nic可以不用等待总线或cpu就能接收包。用于卡上缓存的nic硬件允许两种同时的操作:从网络接口接收一个帧并存到nic的缓冲区,以及将nic缓冲区中的一个帧通过总线传输到计算机。在nic上设计一个较大的缓冲区是非常重要的,因为如果缓冲区能够容纳全部突发的流量,则没有包会丢失。
3)直接存储器访问
nic的第三个优化措施是在nic和计算机内存之间提供高速的数据传输,一种优化的方法是采用直接存储器访问dma。
由于数据总线的宽度不足以一次传输一个完整的包,因此一个包必须分成若干较小的片段,每个总线周期传输一个片段。许多早期的i/o接口采用pio(programmed i/o)技术,要求cpu处理每一次总线传输,这样既加重了cpu的负担,又影响了传输速度。dma技术允许i/o直接访问计算机的内存,而不需要cpu的干预。特别是,dma可以和cpu并行操作。为了采用dma方式传输,nic将每个包分成长度与数据总线宽度相同的片段,执行一系列的总线操作将每个片段传送到计算机内存,然后向cpu发出中断。
nic如何知道应将数据包存放到哪个位置呢?nic等待cpu的指令,cpu在总线上给出内存中一个缓冲区的位置,然后允许nic接收包。nic将收到的包传送到指定的计算机内存位置,然后产生一个中断通知cpu操作完成。
发送数据包时也可以使用dma。cpu在内存中组装好一个包后,利用总线将包存放的位置告诉nic,然后cpu可以转而去做其它的事情。nic利用dma从内存中读取所有的片段,通过网络接口发送出去,然后产生一个中断通知cpu。
4)操作链和数据链
dma允许nic在网络和计算机内存之间传输包而不需要cpu的介入。有些nic提供一种称为数据链(data chaining)或缓冲区链(buffer chaining)的机制。当使用数据链时,cpu提供给nic一个由较小的缓冲区形成的链表,而不是一个较大的缓冲区。当nic要向内存传输一个较大的帧时,它首先将数据写入第一缓冲区;当该缓冲区满时,nic自动将数据写入第二个缓冲区,依次类推。
作为进一步的优化,高速nic使用一种称为操作链(operation chaining)或命令链(command chaining)的技术,它允许nic自动地执行一系列的包传输。操作链可以和数据链结合起来使用,也可以单独使用。为启动一个操作链,cpu在内存中创建一个“命令”链表,然后将链表的地址传递给nic。nic依次执行每一个命令,并在执行完最后一个命令后停止。图2-1是包含一系列传输命令的一个链表,每一个表项包含四个域:传输命令(发送或接收),指向内存中一个缓冲区(或一个缓冲区链)的指针,同步比特,指向下一个命令的指针。同步比特是为了告诉cpu哪个输入缓冲区已经填充了数据或者哪个输出缓冲区的数据已经发送完毕。当cpu创建命令链表时,清除每个表项中的同步比特(即置0);当nic完成一个操作后,将该表项的同步比特置1,并向cpu发出中断。如cpu不能及时处理中断,这期间nic可能完成了多个命令。因此,当cpu处理中断时,必须沿着链表检查每一个表项的同步比特,以便确定nic已经完成了多少命令。

----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=129938&Name=zjcsharp
10-11-30 12:09
该用户被锁定!
10-12-23 18:34

工控新闻

更多新闻资讯