有人能快速解释netty/nio是如何从操作系统中使用tcp缓冲区的吗?
我认为tcp滑动窗口ack由os-tcp堆栈(recvspace)管理,并在每个包(mtu大小)之后发送回,直到recvspace满为止。
然后在NIO选择器触发一个接收事件之后,NIO(在直接buf模式下)创建一个指向相同内存区域的直接缓冲区,并将其标记为read?还是从recvspace复制到另一个缓冲区?
如果是这样,那么每个应用程序的rcvbuf是什么?这有关系吗?
我的目标是在充分使用缓冲区之后才能从下一个缓冲区读取数据(并因此发送新的ack以读取更多数据)。
最佳答案
我认为tcp滑动窗口ack由os-tcp堆栈(recvspace)管理,并在每个包(mtu大小)之后发送回,直到recvspace满为止。
对的。这发生在内核中的套接字接收缓冲区。
然后在NIO选择器触发接收事件之后,NIO(在直接buf模式下)创建一个直接缓冲区。
不一定。我看不出它是直接缓冲的理由。
指向同一存储区
不,它在应用程序空间中。
并将其标记为已读?
不.
还是从recvspace复制到另一个缓冲区?
对的。它通过调用readableBytechannel.read()进行读取,该函数最终调用recv(),将数据从套接字接收缓冲区复制到应用程序内存中。
如果是这样,那么每个应用程序的rcvbuf是什么?有什么关系吗?
这是上面提到的第一件事。