Total Pageviews

Friday 31 July 2015

owamp测量单向延时、丢包 & 配置owamp通过带外通信测量单向延时丢包信息


owamp测量单向延时、丢包
中国互联网极其坑爹,在很多情况下,为了更加清楚地了解问题所在,需要对单向延时、丢包率进行测量。
owamp的网站地址 在http://www.internet2.edu/performance/owamp/index.html。由于它是用来测量单向延时的,这要求两端的机器时钟必须同步。

时钟同步

服务器可以安装ntp进行时间同步。必须注意的是,为了得到精确时间,所选NTP服务器和本地服务器之间的延时应该对称的,也就是往返所需时间相等。另外NTP服务器和本地服务器之间的延时应该稳定,否则时钟会随时间漂移。
根据经验,即使在同一城市同一ISP,在一天之内延时都可能有1ms左右的波动。因此对NTP的精度要求在精确到若干毫秒就可以了。
在坑爹的中国网络中,寻找一个可以将本地时间同步精确到若干毫秒的NTP服务器难上加难。国家授时中心的NTP服务器尽管是多线路的,不受电信、联 通难以互通之影响,然而电信和联通也不能保障从北京到用户所在地一天24小时内延时稳定。例如联通存在南北互通问题、电信存在“CHINANET核心压力 很大”的问题。教育网的s2a.time.edu.cns2b.time.edu.cn跟标准时间相差340ms左右,也不可用。
我目前使用的NTP服务器分别是:
清华大学(北京教育网):ntp.cuhk.edu.hk的ipv6地址和ntp2.cuhk.edu.hk(ipv4)和另一个ipv6地址用来中转clock.isc.org //ipv6不稳定的学校例如北大、北邮就不必使用ntp.cuhk.edu.hk的ipv6地址了。即便清华ipv6目前没有问题也不能过于相信ipv6,首选ntp设置为了ntp2
上海片区电信:首先要确定本地到上海国际出口的延时是否稳定,在稳定的情况下,clock.isc.org可用。
联通:联通勉强可以用ntp2.cuhk.edu.hk,只不过联通到cuhk的延时有2ms左右的波动外加丢包。
美国:美国好啊,一般ISP都会提供ntp的,更别说各种机构了,并且一般延时稳定。我用的是clock.isc.orgntp.nasa.gov对比观察。
这套组合我验证过了在清华、美国、电信、联通的机器如此设置相互间的时钟相差在2ms以内。
其中ntp2.cuhk.edu.hkclock.isc.org基本无差别(小于0.5ms)、clock.isc.orgntp.nasa.gov有3ms左右的差别。

安装owamp

我的系统是Debian,目前还没有Debian安装包,因此要手动编译。configure时指定
./configure --prefix=/usr --exec-prefix=/usr --libexecdir=/usr/lib/owampd --sysconfdir=/etc/owampd --sharedstatedir=/var/lib --localstatedir=/var --mandir=/usr/share/man --infodir=/usr/share/info
安装后复制conf/目录中的owampd.confowampd.limits/etc/owampd/,并编辑owampd.conf中的datadir。(/var/lib/owampd/ ?)
启动owampd的命令行为owampd -c /etc/owampd -R /var/run/。可能要在运行owampd之前运行ntptime -N

处理owping数据

owping的运行参数设置为-i 0.001 -R -L 1较方便。
-R选项对应的输出格式是每行输出SEQNO SENDTIME SSYNC SERR RECVTIME RSYNC RERR TTL。其中TIME的格式是:高32位是从1900年1月1日到现在的秒数(不是Epoch time),低32位是纳秒数/10^9 * 2^32。
记录是按照收到回复的顺序排列的,最后会补上没有收到回复的记录并将RECVTIME标记为0.

配置owamp通过带外通信测量单向延时丢包信息主机A到主机B之间有某条待测线路C<->D,其中A、B、C、D均为IP地址,A、B为公网地址,C、D为内网地址。C<->D线路上可能出现极端的丢包情况,也可能是某个单向出现问题,这时却因为owamp无法建立控制连接导致不能测量单向丢包。
owamp设计时是允许通过别的链路建立控制连接进行测量的。
owping的参数中,可以增加创建控制连接用的server地址。但是3.2rc4版本的实现中,在上述背景下,owping会通过A创建到B的控制连接,随后进行的是A和D这两个地址之间的单向延时丢包信息,不是C<->D。owping的-S选项在manpage中说会将本地socket绑定到指定的IP上,然而它会将控制连接和测试的本地IP都指定为源地址。此时,指定-S C后,C到B根本无法创建控制连接(公网、内网不互通),也无法正确测试C<->D的单向延时丢包信息。
为此我修改了owping的代码,将-S参数的作用仅仅限定为测试时使用这个本地地址,控制连接不绑定到本地IP。补丁见:http://yangzhe1990.files.wordpress.com/2011/09/owping-patch.ppt
在patch代码后,owping就是通过系统(自动使用地址A)创建到B的控制连接,再测量C<->D链路了。然而patchowping的代码仍然不能正确运行:为了防止owping被用来攻击,(B上运行的)owampd拒绝了测试IP(C)跟控制连接的客户端(A)不同的测试请求。
        /*
         * Check for possible DoS as advised in Section 7 of owdp
         * spec.
         * (control-client MUST be receiver if openmode.)
         */
阅读owamp/sapi.c可以发现,只要不是openmode,这种测量行为就被允许。
为此,只要对owpingowampd加上验证信息,并进行正确配置。
增加验证信息的方式十分简单:在B上执行pfstore -f /etc/owampd/owampd.pfs -n yangzhe输入密码即可创建yangzhe的认证信息。将owampd.pfsyangzhe这行复制到机器A的owampd.pfs中去。
owampd.limits中,还可以增加assign user yangzhe root取消用户yangzhe的流量限制。
在B上重启owampd后,在A上就可以通过owping -S C -i 0.001 -c 1000 -k /etc/owampd/owampd.pfs -u yangzhe D B以0.001秒的间隔来回发送1000个数据包对C<->D线路进行双向测试了,并且控制连接是在A、B间建立的,不用担心C<->D本身的不稳定造成无法测量.