如何开发Linux内核模块以使UDP可靠?这是我的大学任务,我不知道如何继续。如何通过加载新的内核模块来改变linux内核中的默认UDP行为?以及如何编程这样的内核模块?
答案 0 :(得分:15)
可靠UDP与仅使用TCP不同。存在许多差异,但最主要的是保证始终收到整个UDP消息或根本不接收它。然而,接收部分TCP消息不仅可能而且非常普遍。
由于这只是一个家庭作业,我建议只实现一个发送消息,等待ACK,发送超时的下一个消息例程。如果超时启动,则在声明失败之前重新发送消息一定次数。是的,这将比必要的慢。有很多技术可以提高吞吐量,但是对于你的任务,你可能不需要使用它们。
答案 1 :(得分:10)
答案 2 :(得分:5)
那些一直告诉穷人“只使用TCP”的人忽略了有充分理由说明为什么可以在TCP上使用可靠的UDP实现 - 而且它不是数据报语义(它很容易在TCP之上分层)< / p>
主要的合法驱动因素是许多节点之间/之间的无连接通信,否则可能需要携带过多的连接多样性
这通常用于广播数据馈送,集群内系统软件通信等。
答案 3 :(得分:3)
在TCP上覆盖TCP,就像TCP已经做的那样。 '可靠的UDP'是矛盾的。它的设计不是这样的。
答案 4 :(得分:3)
我经常使用UDP,我最终看到的主要“可靠性”问题是丢失数据包(特别是在碎片化的IP数据包中)。您可以通过防止碎片(添加一个将数据报切换成IP大小的块)以及让recipeint检测并请求重新发送丢失的“块”来完成90%的工作。
然而,这种事情确实是TCP的发明。 UDP最适用于时间敏感的数据,无论如何都会在重发时失效。
有一个网络拓扑解决方案。只需安排一些事情,以便不会发生任何冲突(LAN上丢失数据包的#1来源)。以下是我们努力使UDP可靠的地方:
(注意:最后一个特别重要。在许多系统中,导致ARP请求的IP数据包都被丢弃,而不是在ARP解析后发送。)
答案 5 :(得分:3)
可靠传输数据的技术统称为“ARQ”,代表自动重复请求。
在这里解释的主题太冗长了,但维基百科页面是一个很好的起点,但不过是这个。我建议你拿一本关于计算机网络的教科书(例如Tanenbaum或Kurose / Ross)并从那里开始。如果您认为它足以完成任务,请实施基本的停止等待ARQ并忘记更高级的ARQ方案,他们需要更多批次构建。
我没有开发Linux内核模块的经验,但如果你选择一种更高级的ARQ方案,如果ARQ机制的实现比打包内核模块更有效,我也不会感到惊讶
祝你好运。
答案 6 :(得分:3)
我认为询问如何使UDP可靠可能正在以错误的方式接近问题。根据定义,UDP或多或少是不可靠的 - 事实上。您无法在任何地方使协议的操作系统端实现更“可靠”。
许多使用UDP的应用程序使用它,因为它们需要低开销,低延迟的性质,远远超过它们需要TCP的精确可靠性。但是,几乎所有这些应用程序仍然需要一些机制来验证某些类型的消息的端到端接收,甚至可能需要重新组装和/或初始握手。例如,考虑VoIP电话中的SIP;对于体面的呼叫建立时间或QoS,TCP的潜在三次握手和非常渐进的拥塞控制并不是真的可以接受,但肯定需要某种确认消息的方式(这就是SIP术语中的临时响应)。或者在线游戏使用的各种协议 - 相同的基本想法。
分配的真正意图很可能 - 即使没有明确说明 - 也不是为了使 UDP 可靠,而是创建一个使用的简单程序 UDP 和在自己的通信方案中有一些原始的可靠性抽象层,封装在UDP中。
答案 7 :(得分:2)
如果您绝对需要基于消息的传输层协议,您可以在其中关闭某些TCP可靠性功能(如行头阻止),请查看SCTP。 API甚至还有一个“UDP mode”来掩盖底层连接。
这仍然是一项正在进行中的工作,所以你不能指望用户拥有它 - 但如果你只需要它用于你维护的计算机,它应该没问题。它是在various flavors of unix中实现的,尽管FreeBSD是大多数开发工作的地方。 YMMV。
答案 8 :(得分:1)
如果您想了解有关如何修改Linux内核的更多信息,我的第一个回应是谷歌“linux内核”,甚至可能添加“套接字”。 Linux Kernel网站看起来可能还有一些其他潜在客户可以关注。
我的建议是
1)看看如何在Linux中实现UDP
2)看看如何实施RUDP(正如有人已经提到过的)
3)......(你在这里制造魔法)
4)利润!错误...完成家庭作业!
答案 9 :(得分:1)
我不确定是否有一种简单的方法可以通过新模块修改现有UDP代码的行为。
更简单的方法是使用UDP代码(net / ipv4 / udp.c)并创建一个具有新IP协议号的新模块,并修改此代码以实现可靠的UDP协议。您将需要重命名所有外部符号,以便名称不与现有符号冲突,找出它注册协议号的位置(17)并更改它,然后更新Makefile以构建新模块并可能放入一个条目的Kconfig。
查看/ etc / protocols以查看已分配的协议ID。
编辑:看起来udp.c无法构建为模块。您需要查看一些其他协议(例如ipip.c或ip_gre.c)以了解如何将代码转换为模块。
答案 10 :(得分:1)
说实话,我想知道这是不是一个技巧问题。它需要两方进行通信,并且您所做的一切都不能确保发送方知道(或关心)您希望它重新发送数据包,除非您已经建立了一个协议来传达这个愿望。如果UDP本身可以做到这一点,我强烈怀疑内核已经支持它了。
您剩下的就是识别并实现一个实现新协议的模块。这没有什么不对,其他人已经给你建议,我相信你可以使用UDP实现来处理实际的数据包传输。但请记住,这是一个新协议的实现,而不仅仅是为了获得新的功能而扭曲UDP。
答案 11 :(得分:0)
你需要考虑可靠的手段。此外,您需要确定是否需要按顺序包或者无序是否正常。如果无序,您需要提出ACK,重新传输和超时方案。您还需要决定是否要处理数据包碎片。如果你可以逃脱它,你可能想要限制数据包的大小,以防止碎片。
答案 12 :(得分:0)
你可能会遇到的可能是“可靠”的概念。您是否清楚地了解了技术术语中的含义? (或者,更重要的是,我认为,你的导师对此意味着什么。)
当您准确了解协议必须具备哪些特性才能使其称之为可靠时,可能会为您提供工作指导。将此作为最低要求,而不是让您更充分地迷失方向 - 现实世界的实施,也可能使你的作业更加可行。
答案 13 :(得分:0)
如果您想要可靠的UDP,最好选择使用SCTP(Stream Control Transmission Protocol)。它现在已经成熟,无处不在。
答案 14 :(得分:-2)
如果由于某种原因你必须使用UDP(严重的话,只需使用TCP),一些快速简便的可靠性功能将是存在心跳,确认和xor'ed校验和。