2013-12-15 35 views
1

我正在阅读Linux内核的源代码,试图弄清楚Linux内核如何发送网络包,经过许多小时后,我只能看到网络的流量数据包遍历TCP层,IP层和数据链路层,我找不到哪些线程正在执行这些工作。什么内核线程负责在Linux内核中发送网络包

我的问题是哪些内核线程负责发送网络数据包,它们在哪里? (因为我们可以将套接字设置为非阻塞,并让用户应用程序尽可能快地发送网络数据包,所以当网络繁忙时,必须有一些队列来缓冲这些数据包,并且必须有一些内核线程运行在某个位置发送这些数据包)。

+0

询问http://kernelnewbies.org/ –

回答

2

默认情况下,内核不使用线程发送网络数据包。

良好的网络芯片管理硬件中的数据包队列。 便宜的芯片有一个固定长度的队列或根本没有队列,并且当一个数据包被发送时引发一个中断;然后内核从中断处理程序中排队或提交来自其自己队列中的下一个数据包。

这个softirq被称为NET_TX_SOFTIRQ(见net/core/dev.c)。 如果内核负载过重或配置为将工作移出中断,则线程会处理softirqs。

+0

假设此时某个套接字的发送缓冲区已满,并且拥有此套接字的用户进程挂起。几分钟后,当网络空闲时,谁会将数据包从套接字发送缓冲区中取出并重新发送?没有内核线程将这些数据包移动到芯片中的数据包队列中吗?如果不存在,TCP层如何知道何时重新发送此套接字的数据包? – Steve

+1

当网络空闲时,网络芯片引发中断,即当其他数据包已被处理时。 –