本篇随笔讲述一下TCP协议下,双向测试模式和交易测试模式下客户端和服务端执行的情况;

双向测试模式:

官方文档的解释

Run Iperf in dual testing mode. This will cause the server to connect back to the client on the port specified in the -L option (or defaults to the port the client connected to the server on). This is done immediately therefore running the tests simultaneously. If you want an alternating test try -r.

客户端连接到服务端进行数据发送的同时,服务端通过客户端设置的监听端口(可通过-L选项另行设置)向客户端发起连接进行数据发送,达成双向测试的效果。其实换句话来说就是模拟全双工通信模式。

交易测试模式:

官方文档的解释

Run Iperf in tradeoff testing mode. This will cause the server to connect back to the client on the port specified in the -L option (or defaults to the port the client connected to the server on). This is done following the client connection termination, therefore running the tests alternating. If you want an simultaneous test try -d.

客户端连接到服务端进行数据发送结束后,服务端随即通过客户端设置的监听端口(可通过-L选项另行设置)向客户端发起连接进行数据发送,相应的就是模拟半双工通信模式。

两者的区别在于服务端何时模拟客户端的功能开始往回连接。这点在IPerf中很容易就实现了。

其实thread_Settings结构中存在两个指向thread_Setting类型的指针变量,分别命名为runNow和runNext,以往介绍IPerf的随笔中指出过,thread_Settings包涵了线程运行时所需的全部信息,程序是根据该类型的变量生成各种类型的线程,runNow表示在创建当前的线程之前需要先创建runNow指向的线程,而runNext表示当前线程结束后才创建runNext所指向的线程。定位到具体的代码如下所示:

            if ( tempSettings != NULL )
{
client_init( tempSettings );
if ( tempSettings->mMode == kTest_DualTest )
{
#ifdef HAVE_THREAD
server->runNow = tempSettings;
#else
server->runNext = tempSettings;
#endif
} else // if tradoff mode
{
server->runNext = tempSettings;
}
}

双向测试和交易测试其实就是:

1. 在客户端添加服务端的功能,表现在开始时添加了一个监听者线程,接收到服务端连接过来的套接字后添加了一个服务端线程;

2. 在服务端线程添加了客户端线程。

需要注意的一点就是,客户端监听服务端连接过来的套接字时,不是随便谁的连接都在接收后将其放入客户端链表,它需要判断对端的地址是否是当前这端客户端线程所连接的服务端的地址,如果不是则将其丢弃,并重新监听,具体定位到代码表示如下:

            if ( client )
{
//检测发起反向连接的对端是不是用户指定的服务端
if ( !SockAddr_Hostare_Equal( (sockaddr*) &mSettings->peer, (sockaddr*) &server->peer ) )
{
// Not allowed try again
close( server->mSock );
if ( isUDP( mSettings ) )
{
mSettings->mSock = -;
Listen();
}
continue;
}
}

下面两张图展示双向测试模式下客户端和服务端的执行过程:

IPerf——网络测试工具介绍与源码解析(5)的更多相关文章

  1. IPerf——网络测试工具介绍与源码解析(4)

    上篇随笔讲到了TCP模式下的客户端,接下来会讲一下TCP模式普通场景下的服务端,说普通场景则是暂时不考虑双向测试的可能,毕竟了解一项东西还是先从简单的情况下入手会快些. 对于服务端,并不是我们认为的直 ...

  2. IPerf——网络测试工具介绍与源码解析(2)

    对于IPerf源码解析,我是基于2.0.5版本在Windows下执行的情况进行分析的,提倡开始先通过对源码的简单修改使其能够在本地编译器运行起来,这样可以打印输出一些中间信息,对于理解源码的逻辑,程序 ...

  3. IPerf——网络测试工具介绍与源码解析(1)

    IPerf是一个开源的测试网络宽带并能统计并报告延迟抖动.数据包丢失率信息的控制台命令程序,通过参数选项可以方便地看出,通过设置不同的选项值对网络带宽的影响,对于学习网络编程还是有一定的借鉴意义,至少 ...

  4. IPerf——网络测试工具介绍与源码解析(3)

    [线程的生成]   生成线程时需要传入一个thread_Settings类型的变量,thread_Settings包含所有线程运行时需要的信息,命令行选项参数解析后所有得到的属性都存储到该类型的变量中 ...

  5. Android IntentService使用介绍以及源码解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...

  6. vue系列---Mustache.js模板引擎介绍及源码解析(十)

    mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ...

  7. JUC中Lock和ReentrantLock介绍及源码解析

    Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比.在这里先和synchronized做一下简单对比,然后分析下Lock接口 ...

  8. 【转载】Android IntentService使用全面介绍及源码解析

    一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何wo ...

  9. Android HandlerThread使用介绍以及源码解析

    摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.HandlerThread的介绍及使用举例              HandlerThread是什么鬼?其本质就是一个线程,但是Han ...

随机推荐

  1. OpenResty api网关设计

    本文讲述 OpenResty api网关设计,主要涉及api网关介绍.openresty api网关 请求路由(路由判断.路由重写.服务判断.限流).授权验证(统一认证).动态Upstream 以及这 ...

  2. 通过修改hosts解决gist.github.com无法访问的问题

    1.打开mac终端先ping一下 ping 192.30.253.119 如果能ping通的话 ,说明可以访问 2.修改hosts文件,添加如下语句: 192.30.253.118 gist.gith ...

  3. 机器学习排序算法:RankNet to LambdaRank to LambdaMART

    使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节. 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet ...

  4. Go Web:数据存储(2)——CSV文件

    存储到CSV文件中 1.内存存储 2.CSV文件存储 3.gob序列化存储 本文接上一篇:内存存储. 关于CSV文件的说明,见csv文件格式 当数据存储到了内存中,可以在需要的时候持久化保存到磁盘文件 ...

  5. [转]USDT与omniCore钱包

    本文转自:http://www.cnblogs.com/red-evil/p/10039740.html USDTUSDT,又称为泰达币,是由Tether公司在 2015年推出的一种与美元锚定的加密货 ...

  6. 第一册:lesson thirteen.

    原文:A new dress. A:What color's your new dress? B:It' green.Come upstairs and see it. A:Thank you. B: ...

  7. [Linux] nginx管理员指南基本功能

    1.运行时控制Nginx进程 NGINX有一个主进程和一个或多个工作进程. 如果启用了缓存,则缓存加载器和缓存管理器进程也会在启动时运行. 主进程的主要目的是读取和评估配置文件,以及维护工作进程. 工 ...

  8. 【Spring】使用Spring发送邮件

    Spring Email抽象的核心是MailSender接口,MailSender的实现能够通过连接Email服务器实现邮件发送的功能,如下图: Spring自带一个MailSender的实现就是Ja ...

  9. Maven(八)Eclipse创建Web项目(复杂方式)

    1. 生成标准的Web工程结构 2. 勾选结尾为webapp的包 3. 生成的文件结构如下 3.1 生成的目录结构若存在错误,缺少servlet.api 3.1.1 添加步骤如下 4.生成后存在的缺点 ...

  10. 详解Java中对象的软、弱和虚引用的区别

    对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...