-1

I have developed a single Server/multiple Clients udp application, where Server can handle x number of clients at a time. The Server has x number of threads each thread dedicated to one Client.

The code works perfectly fine. Now I want to check my application for all possible scenarios i.e. validate my application. For this purpose, I need to design a test best.

Initial Design: The test bed I initially designed has following functionalities:

  • The Server GUI has a button on it. When the button is clicked, the each thread in the Server reads a text file, picks up few bytes of the text file, and sends those chunks to its respective clients. The thread then picks next chunk of bytes from the text file, sends those chunks to the client and so on until EOF is found.

  • The Client on the other side keep receiving these chunks of bytes, creates a text file, and keeps storing these chunks of bytes in its text file.

  • When EOF from Server is received, the Client starts sending the completely received text file back to the Server over its Socket.

  • When the file is completely received back (echoed), the Server then compares the two text files, the Sent file and the echoed one. If both files are same, the communication process has occurred without any fault and the communication protocol is validated.

The above mentioned validation technique (sending the text file, receiving the echoed file and then comparing both) checks the following things:

  1. The number of bytes sent = number of bytes receieved.
  2. No data is corrupted.
  3. The data is receieved in proper order.

If any of the above mentioned three conditions is not fulfilled, that means that there is some error in communication.

Now I have been asked to make changes to this test bead and add more functionlities to it. Does the procedure that I am using actually can check above mentioned 3 conditions in all scenarios?

Are there some other conditions that must be checked besides above mentioned 3 conditions.

What could be other methods of checking communication protocol except the one I desgined i.e. Sending a text file and getting it echoed and then comparing.

I have to implement more functionlities to his test bed for making validation system more efficient or completely replece the above test bed with some better option.

Please help me with your suggestions.

Thanks in advane :)

4

3 回答 3

1

我使用的程序实际上可以在所有情况下检查上述三个条件吗?

是的

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

它不一定是一个文件,但它必须是您在收到响应后可以检查的内容。您可以只生成一些随机数据并保留它,直到您得到响应。

您必须告诉我们您真正想要测试的内容。如果您试图确保 UDP 不会为您提供错误数据或乱序数据,则说明您使用了错误的协议。除了您拥有的网络基础设施之外,您不会通过查看您是否按照您通过 UDP 发送的确切顺序获得确切数据来测试任何东西。

您说您想针对“所有可能的情况”测试您的应用程序,但这甚至没有任何意义。您正在测试是否存在属于 UDP 规范的行为,并试图查看它不存在?嗯,确实如此。即使你从未见过它。

于 2013-05-31T06:36:06.260 回答
1

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

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

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

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

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

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

于 2013-05-31T07:19:49.663 回答
1

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

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

于 2013-05-31T06:32:41.870 回答