网卡收发包流程

2019/07/21
今天在进行发包部分调优的时候,发现对于从最开始调用系统函数,到最终的网卡发包过程不是很理解,就去特意学习了一下。
先是看了那本网络模块的书,但是因为他的内容属于比较细节的,基本上算是看不懂把。
这样的话,就来看一看网络上的文章,看看大致的思路。

  1. 发包流程
    文章[1]属于简单明了的,不给你弄很多细节,就是直接给你发包的流程,如图1所示。
网卡收发包流程
发包流程

这部分他的阐述非常简单,并没有进行多少细节的描述,比如说中断怎么安排等内容,但是最为一个简单的脉络信息,已经非常完整了。

  1. 文献[2]算是非常详细的一个介绍,但同时也造成了非常晦涩的感觉,因为内容太多,很容易看着后面的望着后面的。这个系列的文章发包和收包都包含。
    文章[3]算是文章[2]的***把,同时利用一些简略图添上了自己的理解;同时它也包含发包和收包。

  2. tc部分的内容


    网卡收发包流程
    tc命令

    但这个依然不是网卡队列的中的信息,而是中间的一个。

  3. 文献[4]中也算是一个稍详细的解释,但仍然是有些晦涩。


这里记录一些在阅读这些材料中的一些问题

  1. 网卡的多队列到底是什么形式,是硬件队列,还是软件队列。
  2. 如果利用协议栈进行发包,到底有多少地方需要进行所有权的抢占,其实也就是锁的数量
  3. 如果设置的多队列,底层发包的时候,是不是同样需要进行抢占某一个函数的使用权
  4. 到底中断是什么,感觉看的越多,就觉得越模糊

2019/07/23 目前总结的话,主要瓶颈还是在于多队列部分的内容不是非常理解。

文章[5]是一个介绍队列的文章,我看过中文版的,但没怎么看懂;这个英文版的也没怎么看懂。

参考文献

[1]kernel笔记——网络收发包流程
[2]Monitoring and Tuning the Linux Networking Stack: Sending Data
[3]Linux网络 - 数据包的发送过程
[4]网卡驱动收发包过程
[5]Queueing in the Linux Network Stack