进程内存的地址空间中是否有TCP缓冲区?

时间:2016-08-03 05:52:47

标签: networking tcp linux-kernel network-programming operating-system

我被告知要增加TCP缓冲区大小以便更快地处理消息。 我的问题是,无论我使用什么缓冲区用于TCP消息(ByteBuffer,DirectByteBuffer等),每当CPU从NIC接收中断,处理网络请求以读取套接字数据时,OS是否在内存空间外维护任何缓冲区。请求进程(ig正在侦听该套接字的进程)

无论CPU接收网络数据的方式如何,它总是只写入进程地址空间的缓冲区而没有缓冲区(包括' Recv-Q'以及' Send-Q' netstat命令)是否为此通信维护了地址空间之外?

3 个答案:

答案 0 :(得分:0)

Linux网络堆栈接收数据的过程有点复杂。我写了一个comprehensive guide to the Linux network stack,解释了从设备驱动程序到用户程序的套接字接收队列所需要知道的一切。

内核中维护了很多缓冲区:

  1. 在NIC到达后由NIC写入数据包的DMA环。
  2. 对DMA环上的数据包的引用用于处理数据包。
  3. 最终,分组数据被添加到进程'如果接收队列尚未满,则接收队列。
  4. 从套接字读取将从进程中提取数据包'接收队列。
  5. 如果正在进行数据包嗅探,则会复制数据包数据并将其发送到数据包嗅探代码添加的任何过滤器。
  6. 上面链接的博客文章中描述了如何移动,计算和删除数据(如果需要)的完整过程。

    现在,如果您想更快地处理邮件,我认为您的意思是希望减少数据包处理延迟,对吗?如果是这样,您应该考虑使用SO_BUSYPOLL来帮助减少数据包处理延迟。

    增加接收缓冲区只会增加可以为用户区套接字排队的数据包数。要提高数据包处理能力,您需要仔细监视和调整网络堆栈的每个组件。您可能需要使用类似RPS的东西来增加处理数据包的CPU数量。

    您还需要监控网络堆栈的每个组件,以确保可用的缓冲区和CPU处理能力足以处理数据包工作负载。

答案 1 :(得分:-1)

您被告知要增加套接字发送或接收缓冲区大小。它们与内核的TCP部分中的套接字相关联。请参阅setsockopt()SO_RCVBUF以及SO_SNDBUF

答案 2 :(得分:-1)

请参阅: http://linux.die.net/man/3/setsockopt

选项是SO_SNDBUF和SO_RCVBUF。如果直接使用C-API,则调用是setsockopt本身。如果您使用某种框架查找如何设置套接字选项。这确实是一个内核端缓冲区,而不是您的进程所持有的缓冲区。它确定内核可以为您从读取/接收调用中获取的字节数。它还会影响TCP的flow control机制。