不考虑零拷贝这种优化技术
总体的流程应该是这样的
- 网卡收到电信号,转成信息,传入网卡缓存
细节见书,《网络是怎样连接的》 ,6.2节对于网卡接收数据的描述
-
网卡中断cpu,cpu调用网卡驱动程序讲数据读入内核,对应的数据结构是input_pkt_queue
见链接博客 -
当操作系统一直运行在中断上下文中时,也就是说一直处于内核态,每层协议栈可能会将下层的数据复制到自己的空间,也可能只是操作指针就好了。我比较倾向于第二种,当然ip分片重组不可避免地要copy数据。
-
数据从内核中copy到用户空间。
总的来看,一共是两次次copy,分别发生在网卡缓存 --> 内核,内核到用户空间。
考虑零拷贝技术时的数据转移流程
网卡到内核使用的DMA, 内核到用户就没了,它使用了共享内存.所以叫做零拷贝。
见链接博客