有人可以快速解释Netty / NIO如何从操作系统中消耗TCP缓冲区吗?
我认为TCP滑动窗口ACK由OS TCP堆栈(recvspace)管理,并在每个数据包(MTU大小)之后发回,直到recvspace满。
然后在NIO选择器触发接收事件后,NIO(在直接buf模式下)创建一个指向同一存储区的直接缓冲区并将其标记为已读?或者它是否从recvspace复制到另一个缓冲区?
如果是这种情况,那么每个应用程序的SO_RCVBUF是什么?是否相关?
我的目标是在完全消耗缓冲区之后从下一个缓冲区读取(因此发送新的ACK以读取更多)。
答案 0 :(得分:1)
我认为TCP滑动窗口ACK由OS TCP堆栈(recvspace)管理,并在每个数据包(MTU大小)之后发回,直到recvspace已满。
正确。这发生在内核中的套接字接收缓冲区中。
然后在NIO选择器触发接收事件后,NIO(在直接buf模式下)创建直接缓冲区
不一定。我没有看到它成为直接缓冲区的原因。
指向相同的内存区域
没有。它在应用程序空间中。
并将其标记为已阅读?
没有。
或者它是否从recvspace复制到另一个缓冲区?
正确。它通过调用ReadableByteChannel.read()来读取,它最终调用recv(),它将数据从套接字接收缓冲区复制到应用程序内存中。
如果是这种情况,那么每个应用程序的SO_RCVBUF是什么?是否相关?
这是上面提到的第一件事。