Q2:如果一个ether网帧的目的MAC地址,不是本机,网卡驱动应该还是收取到驱动缓冲区吧,然后由硬件丢弃??如果网口设为混杂模式,是不是就是网卡收到,还交给链路层?? 设为混杂模式和普通模式,工作方式有什么不同?
网卡处理可以进行优化,不让所有的以太网帧都拿来处理。该功能称为Onboard Address Reconition(板上地址识别),只有MAC地址是本机的才交给上层处理,这就是普通模式。 所谓混杂模式promiscuous mode就是关闭了这个优化功能,只要是所有收到的包,都给上层处理。
Q3:所谓修改MAC地址,是怎么工作的?这个问题没有研究过,但是猜测有两种可能。
a、确实网卡的MAC地址被修改过了。例如MAC地址写在网卡上面EPROM里面,提供了驱动程序使用IOCTRL进行修改的接口。如果是这样的话,在一个机器上面修改了MAC地址以后,换一个机器的话,MAC地址仍然是修改后的。某些在DOS下运行的网卡确实支持这种方式的修改。
b、Windows里面的MAC地址实际上是一个逻辑意义上的地址,例如写在IO地址映射空间的内容里面(网卡分配的地址是E800-E8FF,总共256个字节,足够了)。网卡的硬件工作在物理层,负责电信号处理,驱动程序应该是工作在数据链路层,负责将码流形成帧,给TCP/IP处理(考虑到不安装TCP/IP协议仍然可以联网,哪个数据链路层的工作应该是由网卡驱动实现的)。驱动程序不会每次都读取网卡的寄存器来获得本机的MAC地址,应该是启动设备的时候读入,放到地址空间里面(呵呵,根据PCI总线配置空间猜想)。如果修改了这个IO地址空间里面的MAC数据,驱动程序组装以太网帧的时候是就使用你设置的新的MAC地址了。
我猜想应该是后面一种方式,具体的过程可以参考linux中关于以太网网卡驱动的部分。