2010-05-03 91 views
3

我正在开发用于替代TCP/IP的并行计算的主动消息协议。我的目标是减少数据包的延迟。由于环境是一个局域网,我可以用更简单的协议替换TCP/IP来减少数据包延迟。我不写任何设备驱动程序,我只是试图用简单的东西替换TCP/IP堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间,反之亦然。我听说过mmap()。这是做这件事的最好方法吗?如果是的话,如果你可以给出一些例子的链接,那将是很好的。我是一个Linux新手,我真的很感谢您的帮助。谢谢...避免在用户和内核空间之间复制数据,反之亦然

感谢, 巴拉

+2

如果你是“linux新手”,在尝试用“更简单”的东西替换TCP/IP之前,我会考虑三次。即使在局域网上,也不要以为你可以不用校验和重传等功能。 – 2010-05-03 21:23:45

+0

你..但我正在学习Linux,并希望做这个项目。欢迎您的建议... – bala1486 2010-05-03 22:40:25

回答

3

您应该使用UDP,这已经是相当快的。至少W32/SQLSlammer足够快速地传遍整个互联网。

关于您的第一个问题,请参阅(vm)splicetee Linux系统调用。

从手册页:

三个系统调用剪接(2), vmsplice(2),和T(2)),提供具有完全控制 用户空间程序在任意内核缓冲区, 在内核中使用 对管道使用的相同类型的缓冲区使用 。在概述中,这些系统调用 执行以下任务:

剪接(2)

moves data from the buffer to an arbitrary file descriptor, or vice 

反之亦然,或从一个缓冲到另一个。

三通(2)

"copies" the data from one buffer to another. 

vmsplice(2)

"copies" data from user space into the buffer. 

虽然我们谈论抄袭,实际 副本一般都是可以避免的。 内核通过将 管道缓冲区作为一组 引用计数指针指向 内核内存页来实现此目的。内核通过 创造新的指针(用于输出 缓存)指的是网页,并 增加引用计数为 页面创建 的一个缓冲区页“拷贝”:只有指针被复制, 不是网页缓冲区。

+0

谢谢您的建议。实际上,我需要绕过TCP/IP堆栈来绝对减少网络延迟。这是我的论文实验。基本上我需要一个在内核和用户空间之间共享的缓冲区。你有什么想法做这个?谢谢.... – bala1486 2010-05-04 01:46:01

+0

-1使用UDP ...今天没有理由了 – Artyom 2010-05-04 04:30:39

+0

你在开玩笑吗?也许你应该运行一些基准。你是否理解基于数据包和基于流的区别?你知道,速度是妥协,UDP的速度/延迟好处是很好理解。 – ypnos 2010-05-04 10:44:55

0

因为环境是一个局域网,我可以用更简单的协议取代TCP/IP来降低数据包延迟

一般情况下,即使是在LAN UDP数据包往往会被丢失,还他们会如果客户端 没有足够的时间消耗它,则会丢失...

不,不要用别的东西(UDP)替换TCP。因为如果你确实需要可靠的传输,TCP将是最快的(因为连接到确认和重传的所有东西都是在内核空间中完成的)。

一般来说,在正常情况下有使用TCP无延迟的缺点(当然不要忘了TCP_NODELAY选项)

关于共享内存。实际上,您分配的所有内存都是使用mmap创建的。所以当内核从驱动程序创建数据包时,内核需要以任何方式复制它。

如果你正在谈论减少复制它通常是为文件/套接字和 sendfile()使用,确实可以防止复制内核和用户之间的数据。但我认为 你不需要发送文件。

+0

UDP数据包根本不会在LAN中丢失。而OS的接收缓冲区实际上非常大。在对其他人进行投票前,你应该检查你的事实。 – ypnos 2010-05-04 10:44:14

+0

@ynpos - 是的,他们是(经验)。此外,缓冲区很大的事实并不妨碍任何形式的服务器由于某种原因而使CPU失去活性,并且缓冲区可能会变满。所以,是的,UDP数据包不会频繁丢失,但会发生这种情况。你不能继续这个。 – Artyom 2010-05-04 11:53:04