[linux] tc netem 模拟网络丢包

      linux下的tc可以操纵网络,比如分配带宽给不同的应用、模拟网络时延、模拟糟糕网络环境下的丢包等。

      但在实际使用模拟丢包时,我们 发现了问题:两台服务器,一台跑tcp的server,一台跑tcp的client,client只send,server只recv(并打印出来),在 网络环境正常时,发送100万条消息只要40秒,但如果我们在两台服务器的任一台设上 " tc qdisc add dev eth0 root netem loss 1% " (在eth0设上1%的丢包率),消息的收发就戛然而止,strace发现时client阻塞在sendto上了(并没有发生我们送想象的“重传”机 制),把丢包率改回来(即恢复成正常网络),程序还是阻塞在sendto上。我们程序没写好?仔细检查,程序没问题(代码),而且我们发现,scp也会受同样的影响,表现和我们自己写的程序一样。难道tcp不可靠?

      结果发现时tc的用法不对。tc不是这样用的。中间需要用一个路由器。

      于是我们拿一台linux机当router,单网卡,两个虚拟ip,让它连接两台服务器再试。更滑稽了,tc不起作用,两台服务器间的流量刷刷的走,tc却显示没有多少packet经过。tc不能用于router吗?
后来看了tc的详细手册(注意4.1节),终于知道了:tc标准用法是两台服务器中间一个双网卡的router,在router上用tc。

       最后测试成功。丢包率越高,tcp传输的速度越慢;如果丢包率很高,tcp可能会顿住,但是只要改回去(去掉tc的netem配置),传输就会恢复。
       TCP很可靠。

相关文章

分类

8 Comments

zm said:

那个“tc的详细手册”有没有其他的链接啊?国内连不上docs.google.

DongHao Author Profile Page said:

访问docs.google需要“方法”....也罢,再给个链接 http://tcn.hypert.net/tcmanual.pdf

peter said:

您好,我最近在做流量控制的研究,这篇文章中说TC只能使用在路由中,那您的意思是在普通PC(linux系统)上启用tc没有效果吗?我在做实验的过程总是出现问题,看到这篇文章就怀疑是不是TC只能用于Router的原因。麻烦您解释一下,多谢!

DongHao Author Profile Page said:

我只是在tc的manual上看到它自己说只能用于router,至于为什么,manual上没写,我也无法解释。。。。

peter said:

多谢您的回复!您能简单的描述如何在Router上使用TC吗?需要在Router中安装Linux还是通过Router相关命令配置呢?本人刚开始做这方面的东西所以很多基础还不了解,麻烦您解答一下我的疑惑。多谢!

DongHao Author Profile Page said:

其实这个router就是随便找一台linux机器就行,配置方法就在tc manual (http://tcn.hypert.net/tcmanual.pdf)里的4.1节,有详细的说明。

peter said:

但是机器必须有双网卡吧?我看您说的单网卡,虚拟两个IP是不行的.多谢!

DongHao Author Profile Page said:

是的,要双网卡,单网卡虚拟两个ip不行

留言:

关于文章

This page contains a single entry by DongHao published on 12 29, 2009 2:28 PM.

我的奥林匹克 was the previous entry in this blog.

[linux-kernel] 进程死后,OS会flush吗? is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.