Is there a way to constrain the bandwidth on a NIC in linux? I'd like to be able to simulate an arbitrarily slow connection.
The netem kernel module, controlled by iproute.
You need to compile Netem with the kernel:
Networking --> Networking Options --> QoS and/or fair queuing --> Network emulator
Once the netem module loaded, iproute's tc allows you things like:
tc qdisc add dev tap0 root netem delay 50ms loss 50%
(50 % packet loss, extra delay of 50 ms)
Client side, right?
trickle should do what you want. If you're running Ubuntu (or Debian, I think), you can install it with
sudo apt-get install trickle, and then run it.
trickle -s -d 10 -u 10 firefox (or so, I haven't used it in a while) would run firefox, limiting its download and upload speed to 10 kilobytes a second.
I found a way to avoid my box from eating all the bandwidth available on network using a tool called 'wondershaper' in ubuntu. I hope it exist in other linux destros too. I can limit the bandwidth what my linux home pc can consume using following command.
sudo wondershaper eth0 1000 200
This limits the download limit to 1000 kilobits and uplaod to 200 kilobits. Refer to the man pages of wondershaper for more information/options.
NIST make a network simulator called NistNet.
http://snad.ncsl.nist.gov/nistnet/ (link seems dead)
NistNet lets you make a router that emulates a comms link of your choosing.
For simplest operation you have it on a box with two NIC's between two networks.
For example, I had an application that had to work over a satellite link.
Data could go over the a 2Mbps link with BIG latency. Control had to go over a 128kbps link, with the same latency.
NistNet helped to get it all working on 128kbps.
Using NistNet I could simulate not only the bandwidth, but also the latency, and it will also drop packets for you, simulating a busy or unreliable link.
If you want to simulate an abitrary connection, don't just constrain the bandwidth, wind the latency up too.
Don't forget to fragment packets either. You can set nice small MTU's on the phony link.
IIRC adding packet jitter will let you find out if you can cope with out-of order packets.
You can use locally installed squid proxy to limit bandwidth for example to test a web page on slow link:
Install squid proxy from your distribution — on my Fedora it was as easy as
yum install squid.
Add the following to
delay_class 1 1
delay_access 1 allow all
delay_parameters 1 16000/16000
This will limit bandwidth to about 128 kbps (16000 Bps).
Configure your browser to use proxy server
No one has yet mentioned ip_relay, named "iprelay" in the Debian repositories. It works as a TCP proxy, rather than intercepting calls the way trickle does, and will work with any application that can use a proxy (e.g. a web browser) or accept a user-defined destination port (telnet, ssh, ftp, curl, et cetera).
It's a little more difficult to set up, but often works in situations where trickle won't.