Linux网络协议栈
Linux收发网络包
当网卡收到网络包后,会通过DMA技术将网络包写入Ring Buffer内存地址,接着告诉操作系统这个网络包已到达。
怎么告诉操作系统网络包已到达呢?最简单一种方式就是触发中断,在高性能网络场景下,网络包的数据量非常多,那么就会触发很多中断,而当CPU收到中断之后,就会停下手里的事情,而去处理这些网络包,处理完毕之后,才会回去继续其它事情,那么频繁中断,则会导致CPU一直没完没了处理中断,导致其它任务可能无法继续处理,从而影响系统整体效率。
为了解决频繁中断带来的性能开销,Linux内核在2.6版本引入NAPI机制,它是混合中断和轮询的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后poll方法来轮询数据