Iperf 源代码分析(八)

Iperf发送的数据包结构

在Iperf的测量过程中,说者线程会向听者线程发送一组数据包。在这些数据包中,除了使数据包达到指定大小而使用的填充数据外,还用以下

主要信息:

数据包本身的信息,如编号(id)、发送时间戳(timestamp)。主要用在UDP连接中。
客户端向服务器端报告所使用的测量参数的信息,服务器端利用这些信息来发起反向连接,这些信息包含在client_hdr结构中。
听者线程向说者线程报告测量结果的信息,包含在server_hdr结构中。

这些结构定义在文件src/Setting.hpp文件中。Iperf用来保存和操作测试参数的类是Settings,它的定义和实现位于文件src/Settings.hpp和

src/Setting.cpp中。

PerfSocket类的成员变量mBuf是指向用来保存数据包的缓冲区的指针(见src/PerfSocket.hpp文件)。

    // buffer to do reads/writes
    char *mBuf;

这里声明mBuf为char型指针,使用时通过强制类型转换将mBuf构造为不同的结构。

 

UDP_datagram结构用来表示数据包本身的信息,用在UDP通信中,其定义如下(见src/Settings.hpp文件):

// used to reference the 4 byte ID number we place in UDP datagrams
// use int32_t if possible, otherwise a 32 bit bitfield (e.g. on J90)
struct UDP_datagram {
#ifdef HAVE_INT32_T
    int32_t id;
    u_int32_t tv_sec;
    u_int32_t tv_usec;
#else
    signed   int id      : 32;
    unsigned int tv_sec  : 32;
    unsigned int tv_usec : 32;
#endif
};

该结构包括一个32位的id域和用来表明数据包发送时间(timestamp)tv_sec(秒)和tv_usec(微秒)。说者线程在填写这些数据之后将该结

构发往对端的听者线程,由后者根据id域的值计算丢包率参数,根据tv_sec和tv_usec计算延迟抖动参数。

客户端通过client_hdr结构向服务器报告使用的连接数据,在双向测试(dualtest和tradeoff)的情况下,服务器依照这些参数发送fanxiang

连接。client_hdr的定义如下(见src/Settings.hpp文件):

/*
 * The client_hdr structure is sent from clients
 * to servers to alert them of things that need
 * to happen. Order must be perserved in all
 * future releases for backward compatibility.
 * 1.7 has flags, numThreads, mPort, and bufferlen
 */
struct client_hdr {

#ifdef HAVE_INT32_T

    /*
     * flags is a bitmap for different options
     * the most significant bits are for determining
     * which information is available. So 1.7 uses
     * 0x80000000 and the next time information is added
     * the 1.7 bit will be set and 0x40000000 will be
     * set signifying additional information. If no
     * information bits are set then the header is ignored.
     * The lowest order diferentiates between dualtest and
     * tradeoff modes, wheither the speaker needs to start
     * immediately or after the audience finishes.
     */
    int32_t flags;
    int32_t numThreads;
    int32_t mPort;
    int32_t bufferlen;
    int32_t mWinBand;
    int32_t mAmount;
#else
    signed int flags      : 32;
    signed int numThreads : 32;
    signed int mPort      : 32;
    signed int bufferlen  : 32;
    signed int mWinBand   : 32;
    signed int mAmount    : 32;
#endif
};

flags:表示客户端Iperf的版本信息以及测试模式信息,具体见代码中的注释;
numThreads:表示并行的测试线程数,在双向测试中,服务器从收到的第一个数据包中提取出numThreads的值,来决定发起的并行反向连接的

数目;
mPort:客户端使用的端口号,在双向测试中,服务器向客户的这个端口发起反向连接;
bufferlen:反向连接发送的数据包的长度;
mWinBand:TCP协议中表示TCP窗口的大小,UDP协议中表示接收缓冲区的大小;
mAmount:若mAmount>0,则在发送了mAmount字节的数据后说者线程停止发送,若mAmount<0,则在发送-mAmount秒后说者线程停止发送。

当使用UDP协议时,由说者发送给听者的数据包由三部分构成:UDP_datagram结构,用来记录数据包本身的信息;client_hdr结构,用来向服务

器告知客户端使用的测试参数;填充数据,可以用用户指定的文件填充,默认情况是用发送方随机填充数据。

对于使用TCP时的情况,由于TCP是面向连接的,TCP提供给上层协议的是数据流模型,没有单独的数据包的概念,因此发送TCP数据时不需要

UDP_datagram这样的结构。说者线程通过write向表示TCP连接的socket一次写入的数据包括两部分:client_hdr结构,用来向服务器告知客户

端使用的测试参数;填充数据,可以用用户指定的文件填充,默认情况是用发送方随机填充数据。

client_hdr中各数据域的填充是调用Settings类的方法GenerateClientHdr完成的。GenerateClientHdr方法将结构体ext_gSettings中的相应数

据复制到将要发送的client_hdr结构中。

在Iperf中,网络参数的测量主要是由听者线程完成的。当测试结束时,听者线程将测得的数据返回给说者线程。返回测量结果时发送的数据结

构是server_hdr:

/*
 * The server_hdr structure facilitates the server
 * report of jitter and loss on the client side.
 * It piggy_backs on the existing clear to close
&n

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值