C语言 有效的方式验证UDP通信协议具有单一的服务器和多个客户端



我开发了一个单服务器/多客户端udp应用程序,其中服务器可以处理x个客户端在同一时间。服务器有x个线程,每个线程专用于一个客户端。

代码工作得很好。现在我想检查我的应用程序的所有可能的情况,即验证我的应用程序。为此,我需要设计一个最好的测试。

初始设计:

我最初设计的试验台具有以下功能:

  • 服务器GUI上有一个按钮。单击该按钮时,服务器中的每个线程读取一个文本文件,从中获取几个字节文本文件,并将这些块发送到其各自的客户端。的线程然后从文本文件中选择下一个字节块,并发送它们

  • 另一端的客户端不断接收这些字节块,创建一个文本文件,并将这些字节块存储在它的文本文件。

  • 当客户端收到服务器的EOF时,开始发送

  • 当文件被完全接收回(回显)时,服务器然后比较两个文本文件,即发送的文件和返回的文件。如果两个文件都是一样的,通信过程中没有发生

上面提到的验证技术(发送文本文件,接收回显文件,然后比较两者)检查以下内容:

  1. 发送的字节数=接收的字节数。
  2. 没有数据损坏。
  3. 数据接收顺序正确。

如果不满足上述三个条件中的任何一个,则说明通信出现了错误。

现在我被要求对这个测试头进行更改并向其添加更多功能。我正在使用的程序实际上可以在所有场景中检查上述3个条件吗?

除了上述3个条件外,还有其他条件必须检查吗?

除了我设计的,发送一个文本文件并得到它的回显,然后比较,还有什么方法可以检查通信协议呢?

我必须在他的测试台上实现更多的功能,以使验证系统更有效,或者用更好的选项完全替换上面的测试台。

请把你的建议告诉我。

前两个条件由UDP保证。选择"几个字节",即任何小于65535字节(64kiB不是真正的"几个"字节)将导致单个数据报被发送,任何大于这个数的都会失败。虽然您不会想要最大可能的数据报大小,因为它会导致IP碎片(保持在1280字节以下是一个好主意)。

您将能够完全收到您发送的金额或什么都没有,不会多或少。UDP不保证发送的任何数据报到达(它不能保证,因为IP不能),但它保证整个数据报按原样到达——或者什么都不到达。从来没有介于两者之间的东西。
它进一步保证数据报中的数据与其校验和匹配(包括IP/以太网/ATM在内的底层协议进一步执行自己的校验和),从而以与发送时相同的二进制表示形式到达。换句话说,数据按顺序到达(在数据报中)并且不会损坏。

当然,理论上一个位错误通过所有3层校验和是可能的,但这是极不可能的,在实践中也不会发生。除非您需要防范某人恶意地篡改数据包,否则您无需担心。意外发生的比特错误类型由协议中使用的校验和可靠地拾取。
另一方面,如果你确实需要防止恶意修改你的数据,你必须添加一个MAC(或者一个校验和加密整个数据包——单独添加校验和是没有用的)。

为了确保跨越多个数据报的数据按顺序到达,您必须在数据包中添加序列号(以与TCP相同的方式)。有了,您也可以使用TCP,这可能更有效,更不容易出错。人们想要使用UDP的主要原因之一通常是因为顺序交付和可靠性不需要,或者有时需要可靠性,但不需要顺序交付。在丢包期间,按顺序传递是TCP延迟的主要原因(在没有丢包的情况下,TCP和UDP一样"快"),所以如果需要的话,没有理由不首先使用TCP。这是一个经过微调的协议,40年来为数十亿人可靠地工作。

另外,每个客户端使用一个套接字和一个线程可能不是最好的方法。磁盘读取速度不会加快,网卡发送速度也不会加快。UDP也不需要每个客户端都有套接字。当使用TCP时,您将别无选择,只能为每个客户端使用一个套接字,但是使用就绪通知系统进行多路复用将为您提供更好的性能和更少的线程错误机会。

另外,发送回一个校验和,比如SHA系列中的一个(或者MAC,如果需要安全的话)可能比回显大量数据更有效。校验和匹配而数据意外地不匹配的可能性是可以忽略的。
为数百万人管理数百万行代码的整个修订控制系统(比如git)依赖于这样一个事实,即这不会发生在识别文件上(当然,它确实会发生,只是您不会活着看到它)。

我有一个问题吗?为什么是UDP,为什么不是TCP?特别是当您担心数据包顺序和数据损坏时。根据我(我可能是错的),UDP只有当数据是时间敏感的视频流是好的。

其次,是的,还有其他方法来检查传输数据的完整性。最简单的可能是检查MD5和SHA1校验和。

我使用的程序实际上可以在所有场景中检查上面提到的3个条件吗?

是的

除了我设计的,发送一个文本文件并得到它的回显,然后比较,还有什么方法可以检查通信协议呢?

它不一定是一个文件,但它必须是你得到响应后可以检查的东西。你可以生成一些随机数据,并保存它,直到得到响应。

你得告诉我们你真正想测试什么。如果您试图确保UDP不会给您坏数据或乱序数据,那么您使用了错误的协议。你没有测试任何东西,看看你是否按照你通过UDP发送的确切顺序获得确切的数据,除了你已经到位的网络基础设施。

你说你想测试你的应用程序的"所有可能的情况",但这甚至没有任何意义。您正在测试,看看是否存在的行为是UDP规范的一部分,并试图看到它没有?是的,确实如此。即使你从未见过它。

相关内容

最新更新