【问题标题】:How can I automatically test a networking (TCP/IP) application?如何自动测试网络 (TCP/IP) 应用程序?
【发布时间】:2019-04-10 20:11:34
【问题描述】:

我教学生开发网络应用程序,包括客户端和服务器。目前,我们还没有接触到现有的协议,例如 HTTP、SMTP 等。学生们在普通的套接字 API 之上编写了非常简单的程序。目前我手动检查学生的工作,但我想自动化这项任务并为网络应用程序创建一个自动化测试台。最有趣的测试主题是:

  1. 将 TCP 分段分成小部分并以明显延迟交付它们。我需要这样的测试的一个原因是学生通常只是发出read/recv 调用并处理接收到的数据,而不检查是否收到了所有必要的数据。 TCP 不保证消息边界,因此在某些情况下需要进行多次read/recv 调用。问题在于,在大多数简单的网络应用程序中(例如,在聊天应用程序中),消息都很小并且适合单个 TCP 段,因此不会出现问题。我的想法是人为地将消息分成几个小的 TCP 段(即几个字节的数据),这样问题就会出现。
  2. 暂停数据传输一段时间以模拟多个慢速客户端,并检查学生服务器中的多线程/异步套接字是否正确实现。
  3. 随机重置连接。

我发现了几个模拟不良网络的系统(dummynet、clumsy、netem)。但是,它们都在堆栈的 IP 级别上工作,因此操作系统及其 TCP 实现将补偿数据丢失。这样的系统能够解决任务 2,但他们无法解决任务 1 和 3。所以我认为我需要开发自己的解决方案,它将充当 TCP 代理。我的问题是:

  1. 也许有任何库或应用程序可以(至少部分)解决给定任务,所以我可以将它们用作我自己的解决方案的基础?
  2. 如果没有任何合适的现有软件项目,也许有任何关于如何正确执行此操作的想法和方法?

【问题讨论】:

标签: sockets networking tcp operating-system automated-tests


【解决方案1】:

来自WireShark mailing list - Creating and Modifying Packets

...Wireshark Wiki 上有一个“工具”页面:

其中有一个“流量生成器”部分:

其中列出了一些可能有用的工具...

“流量生成器”一章还提到了another collection of traffic generators

【讨论】:

    【解决方案2】:

    如果您编写自己的套接字代码,则可以解决所有 3 个任务。

    1. 通过setsockopt()启用套接字的TCP_NODELAY选项(禁用用于发送合并的Nagle算法),然后您可以根据需要send()小数据片段,可选地在两者之间延迟(参见# 2).

    2. 只需在您的 send() 通话之间设置一个延迟即可。

    3. 使用setsockopt() 调整套接字的SO_LINGERSO_DONTLINGER 选项来控制关闭套接字是执行中止关闭还是正常关闭,然后在建立连接后以某个随机间隔简单地关闭套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多