最近写了一个用于测试网络速度的发包工具,再工具发布之前,我使用nc配合pv对工具进行了测试,即确认工具发送的数据流量和nc/pv接收到的是一致的,确认工具是按设定参数发送数据。
先说一下发送数据的工具的工作原理
对于TCP,参数为每次写入的数据块的大小,以及数据块的数量,比如每次写入1M,共发送1000个,这样就发送了1G的数据。工具是服务端,收到客户端的任意数据后开始发送,所以可以配合nc使用,只要让nc执行时重定向一个文件进去。TCP可以在服务端这边测试速度,只要计算一下全部发送完的时间即可,由于是用go实现的,很方便,一个循环里面发送完,然后计时,算速度。
对于UDP,参数为目标带宽,发送时间以及每次发送的udp数据报负载大小。通过目标带宽,计算出每秒发送多少个udp数据报。然后在一个循环里面发送,发送时需要动态计算速度,如果速度超了需要sleep直到速度降下来才继续发送。整个发送时间到了退出。有点需要注意的是,带宽到udp发包速度的计算,我使用的算法是:
udpBw := (float64(bandwidth) / 8.0) / float64(1538) * (1500 - 28)
udpPackPerSec := udpBw * 1000000 / float64(udpPackSize)
因为网络上跑的是以太网的帧,所以要算出每秒可以发送多少个以太网帧,然后再乘以mtu为1500时udp负载的容量,当然这算法也是近似的,没有考虑到ip分片的情况,有分片的时候从第二个分片开始是没有udp头的,所以不需要减去28,减20就行。然后由于我们说的带宽多少MB,都是1K=1000的,所以这儿