Sprout is a transport protocol for interactive applications that desire high throughput and low delay.
In evaluations on traces from commercial LTE and 3G networks, Sprout achieved 2–4 times the throughput of Skype, Apple Facetime, and Google Hangout, while reducing self-inflicted delay by 7–9 times.
— Keith Winstein, Anirudh Sivaraman, and Hari Balakrishnan
Stochastic Forecasts Achieve High Throughput and Low Delay over Cellular Networks, in the proceedings of the 10th USENIX Symposium on Networked Systems Design and Implementation (NSDI 2013), Lombard, Ill., April 2013.
Slides and a public summary are available on the open-access conference proceedings site.
The talk was given April 5, 2013.
The source code to Sprout (evaluated in the research paper) is available on GitHub.
Source code to Sprout Tunnel (allows TCP to be tunneled within Sprout) available on GitHub
Our "explicit-state" MPEG-2 implementation includes an encoder API (based on mpeg2enc) and a decoder API (built around libmpeg2).
Our code for saturating wireless networks and then replaying those traces on a hardware gateway is also available on GitHub.
Our implementation of the "CoDel" AQM algorithm is available in a different repository.
The page here describes a Mininet port of our trace driven emulator, cellsim, used as part of a problem set in MIT's graduate networking class (6.829).
Cellular network traces were collected while driving in Boston, Mass., and surrounding municipalities. We simultaneously saturated the uplink and downlink of an Android smartphone tethered to a Linux laptop and measured the times when packets arrived across each link. Uplink datagrams were sent to a server at MIT, generally less than 50 ms RTT from the carrier's first/last hop.
The code for the saturatr can be found on GitHub.
The Verizon LTE and 1xEV-DO (3G) traces used a Samsung Galaxy Nexus smartphone running Android Ice Cream Sandwich. The AT&T trace used a Samsung Galaxy S3 smartphone. The T-Mobile trace used a Nexus S smartphone running Android Jelly Bean.
For each network, raw traces for both the uplink and the downlink are available here
The raw data along with instructions to reproduce all of our results( Figures 7,8 and 9 and the tables in Section 5.6 and 5.7 ) from the raw data are available here. Please contact us at alfalfa at mit dot edu in case you have any questions/comments.
You will need 3 separate physical machines to reproduce our results:
sudo ifconfig ethX up promisc
sudo ethtool --offload ethX gso off tso off gro off
sudo ./cellsim uplink_trace downlink_trace client_mac loss_ratewhere :
Cellsim is designed to operate transparently. So, you should be able to run pretty much anything on the client so long as the client has a public IP. In particular, you can setup TCP connections using different congestion control algorithms on Windows and Linux. To set the congestion control algorithm in Linux on either the client or the server, run(as root). (Replace vegas with cubic for TCP cubic.)
modprobe tcp_vegas echo "vegas" > /proc/sys/net/ipv4/tcp_congestion_control
To enable, Compound TCP on Windows 7, run the following on an elevated command prompt :
netsh int tcp set global congestionprovider=ctcp
Our version of LEDBAT is taken from the libutp implementation, available here
Our version of cellsim, with CoDel integrated into it is available here . cd into codel-for-cellsim and run make cell-codel-sim ( you ll need C++11 support). Then, run :
sudo ./cell-codel-sim uplink_trace downlink_trace client_mac codel_enableSet codel_enable to 1 or 0 depending on whether you want it enabled. Running it with 0 is equivalent to running the original cellsim. uplink_trace, downlink_trace and client_mac have the same interpretations as for cellsim.
sudo apt-get install libboost-math1.50-dev libboost-math1.50.0 libprotobuf7 libprotobuf-devNext, cd into alfalfa, and run:
./autogen.sh ./configure --enable-examples makeThe Sprout executable should now available at src/examples/sproutbt2. To run the Sprout server, type :
./sproutbt2To run the Sprout client, type :
./sproutbt2 server_address 60001Sprout might need between 20 and 40 seconds to start up (to precompute Gaussian Distributions required for inference).
We used a physical gateway computer, with two Ethernet interfaces, to replay the recordings from cellular networks. The gateway queued incoming packets indefinitely, and released them to the other interface according to the schedule previously recorded in the trace.
The code for the cellsim tool (used to replay traces from the saturatr) can be found on GitHub.
We evaluated videoconferencing systems and TCP variants with one computer connected directly to a gigabit switch and to the Internet. The other computer was connected to the cellsim, whose other Ethernet interface was connected to the same gigabit switch.
We tested the following configurations:
Program | Version | OS | Endpoints |
---|---|---|---|
Sprout | "evaluated" and "ewma-evaluated" tags | Linux 3.2.0-29-generic (Ubuntu 12.04 LTS) | Intel Core i7 PC |
Skype | 5.10.0.116 | Windows 7 | Intel Core i7 PC |
Google Hangout | in Chrome 21.0.1180.89 | Windows 7 | Intel Core i7 PC |
Apple Facetime | 2.0 (1070) | OS X 10.8.1 | MacBook Pro (2.3 GHz i7), MacBook Air (1.8 GHz i5) |
TCP CUBIC | in Linux 3.2.0 | Intel Core i7 PC | |
TCP Vegas | in Linux 3.2.0 | Intel Core i7 PC | |
LEDBAT | in uTP | Linux 3.2.0 | Intel Core i7 PC |
COMPOUND TCP | in Windows 7 | Intel Core i7 PC |