网卡工作原理详解 网卡的主要功能是什么( 二 )


1 数据链路层MAC 控制器
首先我们来说说以太网卡的 MAC 芯片的功能 。以太网数据链路层其实包含MAC(介质访问控制)子层和LLC(逻辑链路控制)子层 。一块以太网卡MAC 芯片的作用不但要实现MAC 子层和LLC 子层的功能,还要提供符合规范的PCI 界面以实现和主机的数据交换 。MAC 从PCI 总线收到IP 数据包(或者其他网络层协议的数据包)后,将之拆分并重新打包成最大1518Byte,最小64Byte 的帧 。这个帧里面包括了目标MAC 地址、自己的源MAC 地址和数据包里面的协议类型(比如IP 数据包的类型用80 表示) 。最后还有一个DWORD(4Byte)的CRC 码 。可是目标的 MAC 地址是哪里来的呢?这牵扯到一个ARP 协议(介乎于网络层和数据链路层的一个协议) 。第一次传送某个目的IP 地址的数据的时候,先会发出一个ARP 包,其MAC 的目标地址是广播地址,里面说到:"谁是xxx.xxx.xxx.xxx 这个IP 地址的主人?"因为是广播包,所有这个局域网的主机都收到了这个ARP 请求 。收到请求的主机将这个IP地址和自己的相比较,如果不相同就不予理会,如果相同就发出ARP 响应包 。这个IP 地址的主机收到这个ARP 请求包后回复的ARP 响应里说到:"我是这个IP 地址的主人" 。这个包里面就包括了他的MAC 地址 。以后的给这个IP 地址的帧的目标MAC 地址就被确定了 。(其它的协议如IPX/SPX 也有相应的协议完成这些操作 。)IP 地址和MAC 地址之间的关联关系保存在主机系统里面,叫做ARP 表,由驱动程序和操作系统完成 。在Microsoft 的系统里面可以用 arp -a 的命令查看ARP 表 。收到数据帧的时候也是一样,做完CRC 以后,如果没有CRC 效验错误,就把帧头去掉,把数据包拿出来通过标准的借口传递给驱动和上层的协议客栈,最终正确的达到我们的应用程序 。还有一些控制帧,例如流控帧也需要MAC 直接识别并执行相应的行为 。以太网MAC芯片的一端接计算机PCI 总线,另外一端就接到PHY 芯片上 。以太网的物理层又包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI 子层 。而PHY 芯片是实现物理层的重要功能器件之一,实现了前面物理层的所有的子层的功能 。
2 物理层PHY
PHY 在发送数据的时候,收到MAC 过来的数据(对PHY 来说,没有帧的概念,对它来说,都是数据而不管什么地址,数据还是CRC),每4bit 就增加1bit 的检错码,然后把并行数据转化为串行流数据,再按照物理层的编码规则(10Based-T 的NRZ 编码或100based-T的曼彻斯特编码)把数据编码,再变为模拟信号把数据送出去 。(注:关于网线上数据是数字的还是模拟的比较不容易理解清楚 。最后我再说)收数据时的流程反之 。发送数据时,PHY 还有个重要的功能就是实现CSMA/CD 的部分功能,它可以检测到网络上是否有数据在传送 。网卡首先侦听介质上是否有载波(载波由电压指示),如果有,则认为其他站点正在传送信息,继续侦听介质 。一旦通信介质在一定时间段内(称为帧间缝隙IFG= 9.6 微秒)是安静的,即没有被其他站点占用,则开始进行帧数据发送,同时继续侦听通信介质,以检测冲突 。在发送数据期间,如果检测到冲突,则立即停止该次发送,并向介质发送一个“阻塞”信号,告知其他站点已经发生冲突,从而丢弃那些可能一直在接收的受到损坏的帧数据,并等待一段随机时间(CSMA/CD 确定等待时间的算法是二进制指数退避算法) 。在等待一段随机时间后,再进行新的发送 。如果重传多次后(大于16 次)仍发生冲突,就放弃发送 。接收时,网卡浏览介质上传输的每个帧,如果其长度小于64 字节,则认为是冲突碎片 。如果接收到的帧不是冲突碎片且目的地址是本地地址,则对帧进行完整性校验,如果帧长度大于1518 字节(称为超长帧,可能由错误的LAN 驱动程序或干扰造成)或未能通过CRC校验,则认为该帧发生了畸变 。通过校验的帧被认为是有效的,网卡将它接收下来进行本地处理许多网友在接入 Internt 宽带时,喜欢使用"抢线"强的网卡,就是因为不同的PHY 碰撞后计算随机时间的方法设计上不同,使得有些网卡比较"占便宜" 。不过,抢线只对广播域的网络而言的,对于交换网络和ADSL 这样点到点连接到局端设备的接入方式没什么意义 。而且"抢线"也只是相对而言的,不会有质的变化 。

推荐阅读