先梳理两个概念:
什么是高时延带宽乘积的网络环境(带宽(Byte/s)* 时延 > 64k 字节):
1)卫星传输(时延 550ms), 带宽 1Mbps 以上.(1024*1024)/8 *0.6=72090 字节.
2)跨国 internet 访问或国际电路(时延 200ms), 带宽超过 2.6Mbps 以上.
3)千兆网络已经很流行了, 时延>=1ms, 都算. 更不要说万兆网络
TCP 滑动窗口如何进行流量控制及 64K 概念.
TCP 是一种可靠的面向连接的协议, TCP 滑动窗口两作用: 提供可靠性, 流量控制. 这里我们关心的是流量控制. tcp 滑动窗口控制在收到确认包前能够最大发送多少字节的 TCP 数据包, 如果收到了将再发送下一组数据. 在 TCP 包头里描述 TCP 滑动窗口占了 16 位, 刚好是 65535 也就是 64K. 默认最大允许发送 64K 字节的数据包就必须有回应包, 否则就等.
在高时延带宽的网络环境下, 会有什么问题, 如何解决?
TCP 这样的特点就导致, 虽然带宽富裕, 但是单个 TCP 线程不能把带宽占满.
解决办法: TCP 包头里最后一部分是选项字段, 当 kind=3 时, 用来给出 TCP 窗口扩大因子. 当新建立 TCP 连接时, 会查找这个选项参数, 如果设置了 TCP 窗口因子 (取值范围 0~14), 就可以突破默认 TCP 窗口限制, 使其支持更大的窗口. 相当于 2 的(16 + 扩展值) 次方, 最大 2 的 30 次方.
这样在高带宽时延的网络环境下, 单 TCP 会话对带宽利用率将明显改善.
测试环境 A 端 103.38.X.X 主机
B 端 103.16.X.X 主机
两主机之间的带宽大于 100M, 时延 200ms 左右
UDP 100M 测试: 达到预期结果
服务端 iperf-u -s
客户端 iperf -c 103.16.X.X -b 100M -i 5 -t 60
TCP 单线程测试: 默认 64K 窗口, 只能达到 2.5Mbps
服务端 iperf-s
客户端 iperf -c 103.16.X.X -i 5 -t 60
TCP 单线程测试: 默认 2M 窗口, 可达到 70Mbps
服务端 iperf-s -w 2M
客户端 iperf -c 103.16.X.X -w 2M -i 5 -t 60
利用 TCP 扩大因子, 不光系统要支持, 应用软件也要给力.
Linux 2.6.9 以上内核, Windows vista/2008 以上默认支持, 只需要关心应用软件即可.
早期版本系统优化:
- Linux
- echo 'net.ipv4.tcp_window_scaling = 1'>>/etc/sysctl.conf
- sysctl -p
Windows XP/2003 优化
打开注册表, 进入如下位置
添加键值
实例
带宽测试通常采用 UDP 模式, 因为能测出极限带宽, 时延抖动, 丢包率. 在进行测试时, 首先以链路理论带宽作为数据发送速率进行测试, 例如, 从客户端到服务器之间的链路的理论带宽为 100Mbps, 先用 - b 100M 进行测试, 然后根据测试结果(包括实际带宽, 时延抖动和丢包率), 再以实际带宽作为数据发送速率进行测试, 会发现时延抖动和丢包率比第一次好很多, 重复测试几次, 就能得出稳定的实际带宽.
UDP 模式
服务器端:
iperf -u -s
客户端:
iperf -u -c 192.168.1.1 -b 100M -t 60
在 udp 模式下, 以 100Mbps 为数据发送速率, 客户端到服务器 192.168.1.1 上传带宽测试, 测试时间为 60 秒.
iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60
客户端同时向服务器端发起 30 个连接线程, 以 5Mbps 为数据发送速率.
iperf -u -c 192.168.1.1 -b 100M -d -t 60
以 100M 为数据发送速率, 进行上下行带宽测试.
TCP 模式
服务器端:
iperf -s
客户端:
iperf -c 192.168.1.1 -t 60
在 tcp 模式下, 客户端到服务器 192.168.1.1 上传带宽测试, 测试时间为 60 秒.
iperf -c 192.168.1.1 -P 30 -t 60
客户端同时向服务器端发起 30 个连接线程.
iperf -c 192.168.1.1 -d -t 60
进行上下行带宽测试.
来源: http://www.bubuko.com/infodetail-3457072.html