网卡工作原理
⽹卡⼯作原理
⽹卡⼯作原理
1 ⽹卡发包
⽹卡驱动程序将IP包添加14字节的MAC头,构成frame(暂⽆CRC)。Frame(暂⽆CRC)中含有发送端和接收端的MAC地址,由于是驱动程序创建MAC头,所以可以随便输⼊地址,也可以进⾏主机伪装。
驱动程序将frame(暂⽆CRC)拷贝到⽹卡芯⽚内部的缓冲区,由⽹卡处理。
⽹卡芯⽚将未完全完成的frame(缺CRC)再次封装为可以发送的packet,也就是添加头部同步信息和CRC校验,然后丢到⽹线上,就完成⼀个IP报的发送了,所有接到⽹线上的⽹卡都可以看到该packet。
2 ⽹卡收包
丁俊晖第三杆147
⽹线上的packet⾸先被⽹卡获取,⽹卡会检查packet的CRC校验,保证完整性,然后将packet头去掉,得到frame。⽹卡会检查MAC包内的⽬的MAC 地址,如果和本⽹卡的MAC地址不⼀样则丢弃(混杂模式除外)。
⽹卡将frame拷贝到⽹卡内部的FIFO缓冲区,触发硬件中断。(如有ring buffer的⽹卡,好像frame可以先存在ring buffer⾥再触发软件中断(下篇⽂章将详细解释Linux中frame的⾛向),ring buffer是⽹卡和驱动程序共享,是设备⾥的内存,但是对操作系统是可见的,因为看到linux内核源码⾥⽹卡驱动程序是使⽤kcalloc来分配的空间,所以ring buffer⼀般都有上限,另外这个ring buffer size,表⽰的应该是能存储的frame的个数,⽽不是字节⼤⼩。另外有些系统的 ethtool 命令并不能改变ring parameters来设置ring buffer的⼤⼩,暂时不知道为什么,可能是驱动不⽀持。)
⽹卡驱动程序通过硬中断处理函数,构建sk_buff,把frame从⽹卡FIFO拷贝到内存skb中,接下来交给内核处理。(⽀持napi的⽹卡应该是直接放在ring buffer,不触发硬中断,直接使⽤软中断,拷贝ring buffer⾥的数据,直接输送给上层处理,每个⽹卡在⼀次软中断处理过程能处理weight个frame)
过程中,⽹卡芯⽚对frame进⾏了MAC过滤,以减⼩系统负荷。(除了混杂模式)
3 ⽹卡中断处理函数
产⽣中断的每个设备都有⼀个相应的中断处理程序,是设备驱动程序的⼀部分。每个⽹卡都有⼀个中断处理程序,⽤于通知⽹卡该中断已经被接收了,以及把⽹卡缓冲区的数据包拷贝到内存中。
当⽹卡接收来⾃⽹络的数据包时,需要通知内核数据包到了。⽹卡⽴即发出中断。内核通过执⾏⽹卡
酒精的浓度越高
已注册的中断处理函数来做出应答。中断处理程序开始执⾏,通知硬件,拷贝最新的⽹络数据包到内存,然后读取⽹卡更多的数据包。
这些都是重要、紧迫⽽⼜与硬件相关的⼯作。内核通常需要快速的拷贝⽹络数据包到系统内存,因为⽹卡上接收⽹络数据包的缓存⼤⼩固定,⽽且相⽐系统内存也要⼩得多。所以上述拷贝动作⼀旦被延迟,必然造成⽹卡FIFO缓存溢出 - 进⼊的数据包占满了⽹卡的缓存,后续的包只能被丢弃,这也应该就是ifconfig⾥的overrun的来源。
当⽹络数据包被拷贝到系统内存后,中断的任务算是完成了,这时它把控制权交还给被系统中断前运⾏的程序。
4 缓冲区访问cs1.6加人
空间主人寄语
甘字少一横⽹卡的内核缓冲区,是在PC内存中,由内核控制,⽽⽹卡会有FIFO缓冲区,或者ring buffer,这应该将两者区分开。FIFO⽐较⼩,⾥⾯有数据便会尽量将数据存在内核缓冲中。
⽹卡中的缓冲区既不属于内核空间,也不属于⽤户空间。它属于硬件缓冲,允许⽹卡与操作系统之间有个缓冲;
内核缓冲区在内核空间,在内存中,⽤于内核程序,做为读⾃或写往硬件的数据缓冲区;
⽤户缓冲区在⽤户空间,在内存中,⽤于⽤户程序,做为读⾃或写往硬件的数据缓冲区;
另外,为了加快数据的交互,可以将内核缓冲区映射到⽤户空间,这样,内核程序和⽤户程序就可以同时访问这⼀区间了。
珠海景点对于有ring buffer的⽹卡,ring buffer是由驱动与⽹卡共享的,所以内核可以直接访问ring buffer,⼀般拷贝frames的副本到⾃⼰的内核空间进⾏处理(deliver到上层协议,之后的⼀个个skb就是按skb的指针传递⽅式传递,直到⽤户获得数据,所以,对于ring buffer⽹卡,⼤量拷贝发⽣在frame从ring buffer传递到内核控制的计算机内存⾥)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。