从 tun 设备读取()而不删除从操作系统缓冲区读取的数据

Posted

技术标签:

【中文标题】从 tun 设备读取()而不删除从操作系统缓冲区读取的数据【英文标题】:read() from tun device without removing data read from the OS buffer 【发布时间】:2015-07-04 04:21:30 【问题描述】:

短版。是否有一个 Linux API 允许从文件描述符中读取(类似于 read())而不实际从操作系统缓冲区中删除数据?某种方式将 read() 拆分为 front() (读取而不删除)和 pop() (删除)的等价物。

场景。我有一个 TUN 设备,用于通过我自己的网络堆栈传送 IP 数据报。问题是,特别是当上面的应用程序使用 UDP 时,TUN 设备可能会被操作系统淹没,而我的堆栈无法足够快地管理这些数据。

目标。我想:一旦数据报通过 TUN 设备就读取它,不将其从内核缓冲区中删除,检查数据报,确定下面的专有协议栈的其余部分是否可以处理它,如果是,则从内核缓冲区中弹出()数据,否则将数据保留在那里。

为什么。不从内核缓冲区中弹出() 之所以不同,是因为上面的应用程序实际上可以意识到网络协议的较低层是拥塞的(因为它自己的网络接口上的 write() 或 send() 会失败),并采取相应的行动。如果数据被删除,就像普通的 read() 一样,应用程序对拥塞没有任何线索,并继续泛滥。

【问题讨论】:

【参考方案1】:

源是可用的,所以你总是可以编写这样的选项。

您还可以将iptables-j TEE 选项to duplicate packets 一起使用到第二个界面并从那里读取。原件将保持未读状态。

不是最佳答案,我同意...

【讨论】:

以上是关于从 tun 设备读取()而不删除从操作系统缓冲区读取的数据的主要内容,如果未能解决你的问题,请参考以下文章

从 ByteBuffer 读取字符串而不使用双缓冲

it机房设置缓冲区

通用TUN/TAP设备驱动

Memcached

Arduino串口读取

Linux系统I/O操作与零拷贝