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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 对于IPerf源码解析,我是基于2.0.5版本在Windows下执行的情况进行分析的,提倡开始先通过对源码的简单修改使其能够在本地编译器运行起来,这样可以打印输出一些中间信息,对于理解源码的逻辑,程序实现的过程能够起到事半功倍的效果。

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

IPerf主要分为如下几个模块:

  • 选项参数处理;
  • 线程封装和角色扮演;
    • 四种线程模式(或者说角色):
      • 客户端线程;
      • 服务端线程;
      • 报告者线程;
      • 监听者线程。
  • 套接字选项设置与提取;
  • 链表和数组的封装和维护;
  • 处理多并发Condition条件变量的封装;
  • 时间戳封装;
  • Windows下作为后台服务运行的创建和运行。

下面尽可能针对每个模块进行说明:

选项参数的处理:

作为命令行控制台应用程序,首要考虑到的问题就是对输入参数命令行选项的处理,如果是简单的应用程序直接通过case-switch或者if条件语句或许可以解决,但是一旦到了规模较大,实现内容较为复杂的控制台应用程序,比如IPerf,还是用该处理方法就显得相对笨拙,在性能、逻辑处理等方面都有所不及。

对于选项参数的处理,IPerf使用的GUN的一个getopt文件,在Linux下已有该头文件,而在Windows需要自己导入该头文件和实现文件,加入文件之后,还需要做的就是对文件中的一些长选项和短选项字符串进行处理,因为这是自己定义的需求,处理选项参数的逻辑是一定的,但是要将哪些内容作为合理的选项和参数以及操作数,那些又是非法的字符和未能识别的操作数,程序需要据此进行判断,所以需要进行一个初始化的过程,后面在使用的过程中调用相应的接口对主函数传进来的args和argv[]作为输入参数进行处理就行了,更多关于选项参数的处理,可以看看该篇文章,或者自行网上找寻。

 

程序的主要模块就是角色线程的生成、运行和销毁,其他模块包括时间戳、条件变量、维护的链表等都是为此服务的,所以这里打算先说一下其他模块然后在逐一分析不同类型的线程。

 

套接字选项的封装和设置:

说套接字选项之前还需要先说一下套接字的生成,IPerf对套接字Socket的生成定义了一个名为WIN32Socket的宏,这个宏内部调用了WSASocket,而套接字的属性和协议类型是通过定义WSAPROTOCOL_INFO类型静态函数,并将该函数作为输入参数传到WASSocket实现的。

PerfSocket.cpp中只有一个名为SetSocketOptions的函数,顾名思义就是用来设置套接字选项的值,函数里面包含设置TCP滑动窗口大小(setsock_tcp_windowsize函数在另一个名为tcp_window_size.c的文件中单独实现)、设置拥塞控制、设置多播、设置IP服务类型(这个很少用得到)、设置最大报文段大小(setsock_tcp_mss函数在sockets.c文件中实现)、设置非延迟等。当然,除了设置套接字选项外,也有获取相应选项的函数,比如getsock_tcp_windowsize和getsock_tcp_mss。

在SocketAddr.c文件中,IPerf定义了一系列以“SocketAddr_函数功能”格式命名的函数,通过宏条件判断是否支持IPV6,定义了包括:通过IP地址获取到或者说转换成对端的套接字地址结构,将网络序转成点分十进制,获取和设置端口值等,围绕着定义的iperf_sockaddr类型(IPV4下为sockaddr_in类型,IPV6下为sockaddr_storage)判断该套接字地址是否相同等。

 

链表和数组的维护和封装:

IPerf在实现中创建了几种不同类型的链表和数组:在开始时的线程链表,报告使用的报告者首部链表,监听(者)线程维护的客户端链表,紧接在传送类型报告者首部后面的包数组,在服务端和多并发客户端维护的多组报告首部维护的传输信息数组。具体的接下来会详细讲述到,List.cpp封装对Iperf_ListEntry类型链表的增删查和销毁操作,而该链表仅是监听者用来存储和维护已连接客户端的信息,别无它用。

 

处理多并发Condition条件变量的封装:

Condition是IPerf自己封装的结构体,变量mCondition为事件内核对象的句柄,变量mMutex为互斥量的句柄,

Condition_Initialize( Cond ): 创建一个初始化就处于触发状态的互斥量并把返回的句柄值赋予mMutex,创建一个初始化为未触发状态的手动重置事件并把返回的句柄值赋予mCondition;

Condition_Destroy( Cond ):通过mCondition和mMutex的句柄值销毁事件内核对象和互斥量;

Condition_Lock( Cond )  == Mutex_Lock( &Cond.mMutex ) == WaitForSingleObject( Cond.mMutex, INFINITE )

Condition_Unlock( Cond ) == Mutex_Unlock( &Cond.mMutex ) == ReleaseMutex( Cond.mMutex )

Condition_Wait( Cond ): 首先释放互斥量,接着阻塞永久等待事件发生,然后等待互斥量;

Condition_TimedWait( Cond ): 首先释放互斥量,接着阻塞在一定的时间内等待事件发生,然后等待互斥量;

Condition_Signal( Cond ):因为是手动重置事件,当其被调用时,所有正在等待该事件的线程都会变成可调度状态;首先需要了解SetEvent和PulseEvent的区别,因为是手动重置事件,这对于两个函数就有区别了,在自动重置事件类型下事件发生后被等待接收后会自动重置为未触发状态,具体可以查看《Windows核心编程》第9章的内容,里面还介绍了SignalObjectAndWait函数的作用呢。

Condition条件变量定义的宏在使用过程中自己是不太理解的,因为调用的时候容易将等待事件和获取互斥量相互混淆,明明刚释放了互斥量然后永久等待事件发生时,好不容易等到事件发生了又要获取互斥量的所有权,所以写者在每次等待和每次进入以及随后的退出Condition时都加了相应的Debug输出,这样或许能够容易理解点,因为时间的关系,只能将这事放到后面去啃明白,但是在输出的过程中确实能发现其起到的作用,比如报告者在无可奉告的情况下等待输出内容的产生。

 

时间戳:

估计为了与UNIX统一起来,IPerf在Win32上不是直接调用API使用时间,而是自己封装了gettimeofday,先通过GetSystemTimeAsFileTime获取的UTC格式的时间转换成UNIX新纪元下的时间并通过timeval类型进行返回,在该实现函数中使用了几个特殊的数字,这在源代码行上的注释已经说明清楚,这里不再讲述;

TimeStamp这个类中就只有一个类型为timeval的成员变量,成员函数包括获取当前的时间,对时间进行相加减,比较两个时间的先后等,比较容易理解。

时间戳主要用在数据传输过程中给每个发送包赋值,表明这个包发送的时间;还有在-i选项在使用的条件下,计算每次需要打印报告的时间,通过比较将要打印报告的时间和最新发送包的时间戳,决定是否打印这段时间发送的带宽和发送的数据量以及发送的时间段。

 

作为后台服务运行:

仅用于服务端,并且在作为后台服务运行时,-o filename 选项参数才能起到作用,同样也是加入他人实现的文件,稍微看了一下,是通过SCManager的API才创建和执行服务的,这个后面有时间再认真学习,可以考虑自己在后面的某些项目中可以复用。

 

本文暂且就讲到这里,下一篇开始讲解线程和角色,也就是结合着线程讲解客户端、服务端、报告者、监听者的执行过程,暂且仅在TCP模式下,UDP后续再来说明,当然理解了TCP模式下的运行逻辑后,相信UDP模式下也不难理解。

目录
相关文章
|
2天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
19天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
115 30
|
3天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
3天前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
3天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
25 1
|
21天前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
24天前
|
SQL 安全 算法
网络安全之盾:漏洞防御与加密技术解析
在数字时代的浪潮中,网络安全和信息安全成为维护个人隐私和企业资产的重要防线。本文将深入探讨网络安全的薄弱环节—漏洞,并分析如何通过加密技术来加固这道防线。文章还将分享提升安全意识的重要性,以预防潜在的网络威胁,确保数据的安全与隐私。
47 2
|
3天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。

推荐镜像

更多