Linux 可靠用户数据报协议

Linux 可靠用户数据报协议,linux,linux-kernel,udp,Linux,Linux Kernel,Udp,如何开发Linux内核模块以使UDP可靠?这是我的大学作业,我不知道该怎么做。如何通过加载新的内核模块来更改linux内核中的默认UDP行为?如何编写这样的内核模块?在UDP之上覆盖TCP,就像TCP已经做的那样“可靠的UDP”是一种矛盾修饰法。它不是设计成这样的。你需要考虑可靠意味着什么。此外,您还需要决定是否需要有序的数据包或无序的数据包。如果没有问题,您需要提出一个确认、重新传输和超时方案。您还需要决定是否要处理数据包碎片。如果你能侥幸逃脱,你可能想限制数据包的大小以防止碎片。实际上有可靠

如何开发Linux内核模块以使UDP可靠?这是我的大学作业,我不知道该怎么做。如何通过加载新的内核模块来更改linux内核中的默认UDP行为?如何编写这样的内核模块?

在UDP之上覆盖TCP,就像TCP已经做的那样“可靠的UDP”是一种矛盾修饰法。它不是设计成这样的。

你需要考虑可靠意味着什么。此外,您还需要决定是否需要有序的数据包或无序的数据包。如果没有问题,您需要提出一个确认、重新传输和超时方案。您还需要决定是否要处理数据包碎片。如果你能侥幸逃脱,你可能想限制数据包的大小以防止碎片。

实际上有可靠的UDP,它被称为UDP,它是为计划9而发明的。然而,这真的没有意义,只是使用TCP


编辑:也可能有用。它基于UDP,但是是可靠的。

如果出于某种原因您必须使用UDP(认真地说,只需使用TCP),一些快速且简单的可靠性功能将是状态心跳、acks、,和xor'ed校验和。

如果您确实需要一个基于消息的传输层协议,在该协议中您可以关闭一些TCP可靠性功能,如线首阻塞,请查看。API甚至有一个“”来屏蔽底层连接


这仍然是一项正在进行的工作,所以你不能期望用户拥有它——但是如果你只需要在你维护的计算机上使用它,它应该是好的。它是在中实现的,尽管FreeBSD是大部分开发工作发生的地方。YMMV.

可靠的UDP与仅使用TCP不同。有许多不同之处,但最主要的是保证始终接收整个UDP消息,或者根本不接收它。然而,接收部分TCP消息不仅是可能的,而且是非常常见的


由于这只是一个家庭作业,我建议只执行一个发送消息,等待确认,发送下一个消息例程并超时。如果超时开始,则在声明失败之前重新发送消息若干次。是的,这将比需要的慢。有很多技术可以提高吞吐量,但对于您的分配来说,很可能您不需要使用它们。

我经常使用UDP,我最终看到的主要“可靠性”问题是丢失的数据包(特别是在碎片化的IP数据包中)。您可以通过防止碎片化(添加一个将数据报分割成IP大小的块的层),以及让接收方检测并请求重新发送丢失的“块”,来完成90%的工作

然而,这种事情才是TCP发明的真正目的。UDP最好用于对时间敏感的数据,这些数据无论如何在重新发送时都会过时

有一个网络拓扑解决方案。只要把事情安排好,就不会有任何冲突(局域网上丢失数据包的第一个来源)。以下是我为使UDP可靠所做的工作:

  • 将一个客户机和服务器置于专用以太网链路上(可能是它们之间的交换机,但在它们的专用LAN上没有其他系统)
  • 在UDP LAN上保持严格的客户机-服务器通信协议。除了响应客户机,服务器永远不允许讲话
  • 关闭该UDP链接(Netbios等)上的所有外部网络垃圾
  • 使两端的ARP条目保持静态(这样ARP不会每10分钟干扰一次)

(注意:最后一个特别重要。在许多系统上,导致ARP请求的IP数据包只是被丢弃,而不是在ARP被解析后发送)。

如果您想了解有关如何修改Linux内核的更多信息,我的第一个响应是谷歌“Linux内核”,甚至可能会在其中添加“套接字”。该网站看起来可能有其他线索供您参考

我的建议是

1) 看看UDP是如何在Linux中实现的
2) 看看RUDP是如何实现的(正如有人已经提到的)
3) ... (你在这里创造了奇迹)

4) 利润!犯错误完成作业

可靠传输数据的技术统称为“ARQ”,代表自动重复请求

这是一个太冗长的主题,无法在这里解释,但维基百科页面是一个很好的开始,但仅此而已。我建议你选择一本关于计算机网络的教科书(如Tanenbaum或Kurose/Ross),然后从那里开始。如果您认为它足以满足您的任务,那么实施基本的停止等待ARQ,忘记更高级的ARQ方案,它们需要做更多的工作

我没有开发Linux内核模块的经验,但是如果您选择一种更高级的ARQ方案,那么如果ARQ机制的实现比将其打包为内核模块需要更多的工作,我也不会感到惊讶


祝你的作业好运。

你可能会被“可靠”这个概念所困扰。你有一个明确的概念,确切地说,在技术术语中,你的意思是什么?(或者更贴切地说,我想,你的导师是指什么。)


当您准确了解协议必须具备哪些特征才能称之为可靠时,这可能会为您的工作提供方向。将此作为最低要求进行构建,而不是迷失在功能更全面的现实世界实现中,也可能使完成家庭作业更加可行。

我不确定是否有简单的方法通过新模块修改现有UDP代码的行为

更简单的方法是使用UDP代码(net/ipv4/UDP.c)创建一个具有新IP协议号的新模块,并修改此代码以实现可靠的UDP协议。您需要重命名所有外部符号,以便名称不会与现有符号冲突,找出它在何处注册协议