ネットワークの品質を擬似的に落とす方法

リアルタイム通信のプログラムを書いていると、ネットワークに遅延やロスが発生した場合の挙動をチェックしたくなる時があります。

その場合は、tc コマンドを使うと便利。


例えば、ポート 32320に対する通信に 100ms のラグと 2%のデータロスを加えたい場合は以下のようにすると出来ます。

tc qdisc add dev ens32 root handle 1: prio
tc filter add dev ens32 protocol ip parent 1: prio 3 u32 match ip dst 0.0.0.0/0 flowid 1:3
tc qdisc add dev ens32 parent 1:1 handle 10: netem loss 1% delay 50ms
tc qdisc add dev ens32 parent 1:2 handle 20: netem loss 1% delay 50ms
tc filter add dev ens32 protocol ip parent 1: prio 1 u32 match ip dport 32320 0xffff flowid 1:1
tc filter add dev ens32 protocol ip parent 1: prio 2 u32 match ip sport 32320 0xffff flowid 1:2

元に戻す場合は

tc qdisc del dev ens32 root handle 1: prio