%# -*- coding: utf-8-unix -*-

\section{纳秒级高精度硬件测量}
\label{sec:c:sdn-ob:s:ns}

\subsection{实验目的}
\label{subsec:c:sdn-ob:s:ns_object}

本实验的主要目的是让学生掌握网络测试的常用原理及方法，了解在测试过程中影响测量精度的原因及如何提高测量精度。了解软硬件结合的测量方法与优势。

\subsection{实验内容}
\label{subsec:c:sdn-ob:s:ns_content}

使用可编程网络平台及用户应用AMS（自动测量系统）软件源代码，对网络远端的服务器进行RTT延时测量和带宽测量，测量不同长度网线的数据传输时长。主要完成以下内容：

\begin{enumerate}
  \item \textbf{测量RTT时长：}使用AMS软件测量一台校园网内服务器的RTT时间，测量报文使用ping协议文本；
  \item \textbf{测量带宽：}在测量网络中添加一台可编程网络平台，配置为带宽响应测量模式，测量这两个节点之间的实时网络流量，并用不同测量报文大小来验证测量结果；
  \item \textbf{测量网线时延：}测量不同长度网线的数据传输时延，根据测量结果分析本系统的测量优势与局限；
  \item \textbf{添加软件计时测量：}修改测量报文代码，在开始发送时取系统时间做为软件发送时间，在接收到报文后为每个报文设置系统接收时间，计算软件的RTT时间。
\end{enumerate}

\subsection{实验原理、方法和手段}
\label{subsec:c:sdn-ob:s:ns_principle}

\subsubsection{测量原理}
网络测量主要是通过时间和数据量相关和相对的关系来反映网络中的各种特性，
如带宽、延时、抖动和丢包等。

网络测量的分类标准有多种。根据测量的方式分为：
主动测量和被动测量；根据测量点的多少分为：单点测量与多点测量；
根据被测量者知情与否分为：协作式测量与非协作式测量；
根据测量所采用的协议分为：基于BGP协议的测量、
基于TCP/IP协议的测量以及基于SNMP协议的测量；
根据测量的内容分为：拓扑测量与性能测量。
\subsubsection{可编程网络平台的测量特征}

本实验的测量最主要方法是由软件构造测量报文和设定发送报文的时刻表，
由硬件在指定时间进行报文发送，并在接收获得回应报文后标记硬件的接收时刻。
接收数据由软件汇总统计计数，与原发送数据进行时间关联，
计算测量结果。硬件的时间控制精度为8ns，
故测量数据的收发时间均控制在8ns误差范围内。
根据时间的精准控制，扩展出硬件背靠背发包测试网络带宽，
精准周期发包测量网络抖动。

\subsubsection{测量流程}

\begin{enumerate}
  \item \textbf{软件构造测量报文：}根据测量要求，软件构造测量报文，
  报文内容由用户决定。如果测量通用服务器，可以使用ping报文；
  \item \textbf{软件设置测量报文的发送间隔：}软件设备每个测量报文的发送间隔，
  间隔时间可以是零，表示硬件背靠背发送报文；
  \item \textbf{软件发送测量报文到硬件缓存：}软件将所有测量报文构造好后，
  通过分组发送函数发送到硬件缓存。硬件最大缓存32个MTU为1500的分组数据；
  \item \textbf{软件启动发送：}所有测量分组发送到硬件完成后，
  软件可以随时启动发送，通过写硬件状态寄存器的方式通知硬件开始发送测量报文；
  \item \textbf{硬件根据时间参数严格输出测量报文：}
  硬件从开始接收到发送标记时刻开始发送第一个报文，
  然后根据报文携带的间隔时间，循环等待，直到下一个报文发送时刻，
  将该报文依次发送出去；
  \item \textbf{硬件接收测量响应报文，标记硬件时间戳：}
  等待测量响应服文返回，当接收到任何响应报文后，
  硬件均会在报文的头部添加本址硬件时间戳信息，然后将该报文发送给软件；
  \item \textbf{软件接收报文：}软件根据测量要求，循环接收测量响应报文，
  如ping 32个报文后需要接收到32个响应报文；
  \item \textbf{软件计算测量结果：}测量响应报文接收完成后，
  将之前设置的测量配置参数（各报文发送间隔）、
  硬件开始发送报文时间戳和接收报文内的时间戳等信息汇总起来进行计算，
  得到测量结果后打印输出。
\end{enumerate}

\subsection{实验条件}
\label{subsec:c:sdn-ob:s:ns_requirement}

\begin{itemize}
  \item 可编程网络平台两个，被测试主机一台；
  连接拓扑如图\ref{fig:c:sdn-ob_ns-topo}所示；
  \item 串口线一根，网线多根；
  \item AMS软件源代码。 
\end{itemize}

\begin{figure}[!ht]
  \centering
  \includegraphics[width=9cm]{ns-topo}
  \caption{高精度网络测量实验拓扑图}
  \label{fig:c:sdn-ob_ns-topo}
\end{figure}

\subsection{实验步骤}
\label{subsec:c:sdn-ob:s:ns_procedure}
\begin{enumerate}
  \item 测试测量平台与被测量主机间的连接性，在测量平台\texttt{ping 192.168.1.111}；
  \begin{code}[console]
    root@HNXS-FAST:/home/hnxs/ams# ping 192.168.1.111
  \end{code}
  \begin{code}[text]
    PING 192.168.1.111 (192.168.1.111) 56(84) bytes of data.
    64 bytes from 192.168.1.111: icmp_seq=1 ttl=64 time=1.57 ms
    64 bytes from 192.168.1.111: icmp_seq=2 ttl=64 time=1.60 ms
    64 bytes from 192.168.1.111: icmp_seq=3 ttl=64 time=1.74 ms
    ^C
    --- 192.168.1.111 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    rtt min/avg/max/mdev = 1.576/1.640/1.746/0.088 ms
  \end{code}

  \item 运行AMS测量命令，测量服务器RTT的命令如下：
  \begin{code}[console]
    root@HNXS-FAST:/home/hnxs/ams# ams 192.168.1.111 5 70 1000000000
  \end{code}
  \begin{code}[text]
    fastU->REG Version:20180827,OpenBox HW Version:2030200722
    FAST UA REG->from pid:1068,state:21,mid:131
    fastU->Register UA to FAST Kernel! Wait Reply......
    fastU->UA->pid:1068,mid:131,Register OK!
    fastU->libua version:20180827
    fastU->librule version:20181015,Default Action:0x40000080
    wait for ams pkts...
    fastU->fast_ua_recv......
  \end{code}
  系统输出如上信息说明AMS运行成功，并发送5个70字节大小的ping报文出去，默认间隔为1秒。等待ping响应回来。
  \item 观察RTT测量结果；
  \begin{code}[text]
    AMS ID PKT_SIZE             TS(ns)
        0,      70,              1583184
        1,      70,              1625224
        2,      70,              1707240
        3,      70,              1492256
        4,      70,              1650272
  \end{code}
  观察测量结果，计算结果在1.5ms左右，与之前的ping测试结果相差不大。

  \item 测试两个测量平台之间的实时网络带宽；
  \begin{code}[console]
    root@HNXS-FAST:/home/hnxs/ams# ams 192.168.1.111 5 100 0
  \end{code}
  \begin{code}[text]
    fastU->REG Version:20180827,OpenBox HW Version:2030200722
    FAST UA REG->from pid:1068,state:21,mid:131
    fastU->Register UA to FAST Kernel! Wait Reply......
    fastU->UA->pid:1068,mid:131,Register OK!
    fastU->libua version:20180827
    fastU->librule version:20181015,Default Action:0x40000080
    wait for ams pkts...
    fastU->fast_ua_recv......
  \end{code}

  测试之前，要在此链路中间增加一个背景流，使用iperf的UDP流大小为600Mbps，
  系统给测试主机发送5个100字节大小的ping报文出去，默认间隔为1秒。
\item 观察带宽测试结果；
  \begin{code}[text]
    AMS ID PKT_SIZE             BW(bps)
        0,      70,              341467254
  \end{code}
  iperf的背景流设置参数为600M时，其实际带宽会跑到648Mbps左右。
  链路上只有两种数据流，该测量值只是某个测量小时段的带宽反馈，
  UDP流也存在不稳定性，故其结果相加不可能完全是1000Mbps。
  其相加结果与千兆带宽基本相等。

\item 测量网线传输延时；
  \begin{code}[console]
    root@HNXS-FAST:/home/hnxs/ams# ams
  \end{code}
  \begin{code}[text]
    fastU->REG Version:20180827,OpenBox HW Version:2030200722
    FAST UA REG->from pid:1068,state:21,mid:131
    fastU->Register UA to FAST Kernel! Wait Reply......
    fastU->UA->pid:1068,mid:131,Register OK!
    fastU->libua version:20180827
    fastU->librule version:20181015,Default Action:0x40000080
    wait for ams pkts...
    fastU->fast_ua_recv......
  \end{code}

  网络测量时需要连接在设备的0和1号端口上。

  \item 观察网线测量结果
  \begin{code}[text]
    AMS ID PKT_SIZE             TS(ns)
        0,      100,              20194
        1,      100,              20214
        2,      100,              20210
        3,      100,              20216
        4,      100,              20202
  \end{code}

  \item 分析测量数据的差异。
  \begin{enumerate}
    \item 对相同测试案例进行多组测量，观察数据变化；
    \item 分析RTT测量时，软件计时测量与硬件计时测量的差异。
  \end{enumerate}
\end{enumerate}

\subsection{思考题}
\label{subsec:c:sdn-ob:s:ns_rethink}

\begin{enumerate}
  \item 硬件背靠背报文发送是什么意思？其测量的原理是什么？
  \item 通过硬件方式测量多组延时数据，为什么仍有较大波动？
  \item 如何测量网络的抖动？
\end{enumerate}

\subsection{注意事项及有关说明}
\label{subsec:c:sdn-ob:s:ns_notice}

\begin{enumerate}
  \item 测量其他网络节点的ping延时，需要修改发包内容为正确的ping报文内容;
  \item 测量报文的间隔可以设置为零，但真正发包时的发包时刻计算却不是零，
  是因为硬件报文是逐个逐个发送的，且每个报文发送时间长短与其报文长度相关;
  \item 时间计算与带宽计算中均用到了除法，引入了误差。
  硬件时钟本身是存在误差（时钟飘移）的，也会引入计数的误差。
\end{enumerate}

\subsection{考核方法}
\label{subsec:c:sdn-ob:s:ns_criterion}

完成本次实验，需要提交一份实验报告和一份程序输出日志。
\begin{enumerate}
  \item （20分）在规定时间内完成实验，并提交实验成果；
  \item （25分）实现软件计时测量与硬件测量对比；
  \item （25分）将多次测量结果以图形曲线形式汇总并做分析总结；
  \item （20分）完成网络抖动测量，并做图形化汇总统计；
  \item （10分）实验报告与源代码内容完整、格式规范。
\end{enumerate}

