Netty中net.inet.tcp.recvspace,SO_RCVBUF,Direct ByteBuf和ByteBufAllocator之间的关系

时间:2014-05-21 23:57:47

标签: tcp netty nio

有人可以快速解释Netty / NIO如何从操作系统中消耗TCP缓冲区吗?

我认为TCP滑动窗口ACK由OS TCP堆栈(recvspace)管理,并在每个数据包(MTU大小)之后发回,直到recvspace满。

然后在NIO选择器触发接收事件后,NIO(在直接buf模式下)创建一个指向同一存储区的直接缓冲区并将其标记为已读?或者它是否从recvspace复制到另一个缓冲区?

如果是这种情况,那么每个应用程序的SO_RCVBUF是什么?是否相关?

我的目标是在完全消耗缓冲区之后从下一个缓冲区读取(因此发送新的ACK以读取更多)。

1 个答案:

答案 0 :(得分:1)

  

我认为TCP滑动窗口ACK由OS TCP堆栈(recvspace)管理,并在每个数据包(MTU大小)之后发回,直到recvspace已满。

正确。这发生在内核中的套接字接收缓冲区中。

  

然后在NIO选择器触发接收事件后,NIO(在直接buf模式下)创建直接缓冲区

不一定。我没有看到它成为直接缓冲区的原因。

  

指向相同的内存区域

没有。它在应用程序空间中。

  

并将其标记为已阅读?

没有。

  

或者它是否从recvspace复制到另一个缓冲区?

正确。它通过调用ReadableByteChannel.read()来读取,它最终调用recv(),它将数据从套接字接收缓冲区复制到应用程序内存中。

  

如果是这种情况,那么每个应用程序的SO_RCVBUF是什么?是否相关?

这是上面提到的第一件事。