Linux 捕获数据包后会发生什么?
我一直在读NIC捕获数据包后会发生什么,读得越多,我就越困惑 首先,我了解到,传统上,NIC捕获数据包后,它会被复制到内核空间中的内存块中,然后复制到用户空间,用于处理数据包数据的任何应用程序。然后我读了DMA,NIC绕过CPU直接将数据包复制到内存中。那么NIC->内核内存->用户空间内存流是否仍然有效?此外,大多数NIC(如Myricom)是否使用DMA来提高数据包捕获率 其次,RSS(接收端缩放)在Windows和Linux系统中的工作方式是否相似?我只能在MSDN文章中找到关于RSS如何工作的详细解释,其中讨论了RSS(和MSI-X)如何在WindowsServer2008上工作。但是RSS和MSI-X的相同概念应该仍然适用于linux系统,对吗 多谢各位 问候,,Linux 捕获数据包后会发生什么?,linux,rss,windows-installer,packet,dma,Linux,Rss,Windows Installer,Packet,Dma,我一直在读NIC捕获数据包后会发生什么,读得越多,我就越困惑 首先,我了解到,传统上,NIC捕获数据包后,它会被复制到内核空间中的内存块中,然后复制到用户空间,用于处理数据包数据的任何应用程序。然后我读了DMA,NIC绕过CPU直接将数据包复制到内存中。那么NIC->内核内存->用户空间内存流是否仍然有效?此外,大多数NIC(如Myricom)是否使用DMA来提高数据包捕获率 其次,RSS(接收端缩放)在Windows和Linux系统中的工作方式是否相似?我只能在MSDN文章中找到关于RSS如何
Rayne看看这篇文章,它可能有助于解决一些内存管理问题这个过程如何进行主要取决于驱动程序作者和硬件,但对于我看过或写过的驱动程序以及我使用过的硬件,通常是这样的:
即使假设所有的恒星都对齐,当系统接收到数据时,数据实际上并不是在你的用户缓冲区中。直到应用程序请求数据时,内核才知道它将在何处结束。考虑多进程守护进程类Apache的情况。有很多子进程,都在同一个套接字上监听。也可以建立。一个连接,
fork()
,两个进程都能够recv()
传入数据
Internet上的TCP数据包通常是1460字节的有效负载(1500的MTU=20字节IP头+20字节TCP头+1460字节数据).1460不是2的幂,在任何系统上都与页面大小不匹配。这会给数据流的重新组装带来问题。请记住,TCP是面向流的。发送方写入之间没有区别,在接收端等待的两个1000字节写入将在2000字节的读取中完全消耗
进一步考虑,用户缓冲区,这些都是由应用程序分配的。为了被零拷贝一路使用,缓冲区需要是页面对齐的,不与任何其他页面共享内存。在<代码> ReVE()/代码>时间,内核可以理论上重新映射旧页面和包含数据的页面。将其“翻转”到位,但由于上面的重新组装问题,这是复杂的,因为连续的数据包将位于单独的页面上。内核可能会将其交回的数据限制在每个数据包的有效负载上,但这将意味着大量额外的系统调用、页面重新映射以及整体吞吐量可能会降低
在这个话题上,我只是触及了表面。在21世纪初,我曾在几家公司工作,试图将零拷贝的概念扩展到userland。我们甚至在userland中实现了TCP堆栈,并完全绕过了内核,用于使用该堆栈的应用程序,但这带来了它自己的一系列问题,而且从来没有产生过效果n质量。这是一个很难解决的问题。谷歌的零拷贝网络…现在很少有高速设备能够容忍内核和用户的双重拷贝。IANANG(我不是网络大师)但我相信DMA被积极使用。所以,现在,一旦NIC捕获数据包,它就会被直接复制到(用户)内存?@Rayne是的;NIC将使用DMA将数据直接传输到映射到进程(userland)地址空间的物理内存中。你为什么要问?你想实现什么?+1表示零拷贝。它现在已经广泛使用了好几天。