// Testing DSACK --tolerance_usecs=2000000 // Load and enable DCTCP module and flush hostcache 0.0 `sync` // in case of crash //+0.1 `tcpdump -i tun0 -w dsack-test.trc tcp &` +0.1 `sysctl net.inet.tcp.cc.algorithm=newreno` +0.1 `sysctl net.inet.tcp.initcwnd_segments=10` +0.1 `sysctl net.inet.tcp.ecn.enable=1` +0.1 `sysctl net.inet.tcp.hostcache.purgenow=1` // Create a listening TCP socket. +0.50 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0.01 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0.01 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1048576], 4) = 0 +0.01 setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4) = 0 +0.01 bind(3, ..., ...) = 0 +0.01 listen(3, 1) = 0 // Establish a TCP connection. +0.04 <[noecn] SEW 0:0(0) win 65535 +0.00 >[noecn] SE. 0:0(0) ack 1 win 65535 +0.00 <[noecn] . 1:1(0) ack 1 win 65535 +0.00 accept(3, ..., ...) = 4 +0.01 setsockopt(4, SOL_SOCKET, SO_DEBUG, [1], 4) = 0 // Send IW plus 1 segment, check ECN bits +0 <[ect0] . 1:1001(1000) ack 1 win 65535 +0 <[ect0] . 1:1001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 1001 // DSACK +0 <[ect0] . 2001:3001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 1001 // SACK +0 <[ect0] . 2001:3001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 1001 //DSACK +0 <[noecn] . 1001:2001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 3001 +0 <[ect0] . 3001:4001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[ect0] . 2001:3001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 //DSACK +0 <[noecn] . 1001:2001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 //DSACK +0 <[ect0] . 5001:6001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[ect0] . 6001:7001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[noecn] . 1001:2001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[ect0] . 7001:8001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[ect0] . 8001:9001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[noecn] . 4501:5501(1000) ack 1 win 65535 // |---| +0 >[noecn] . 1:1(0) ack 4001 // |---| +0 <[noecn] . 8501:9501(1000) ack 1 win 65535 // |---| +0 >[noecn] . 1:1(0) ack 4001 // |---| +0 <[noecn] . 5001:6001(1000) ack 1 win 65535 // |-| +0 >[noecn] . 1:1(0) ack 4001 // |---| +0 <[ect0] . 9001:10001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 4001 +0 <[ect0] . 3801:4801(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 10001 +0 <[noecn] . 1001:2001(1000) ack 1 win 65535 +0 >[noecn] . 1:1(0) ack 10001 +0 <[ect0] . 10001:11001(1000) ack 1 win 65535 +0.1 >[noecn] . 1:1(0) ack 11001 +0.1 read(4, ..., 11000) = 11000 +0.1 `pkill -SIGINT tcpdump` +1.00 close(4) = 0 +0.01 >[noecn] F. 30001:30001(0) ack 1 <...> +0.10 <[noecn] F. 1:1(0) ack 30002 win 65535 +0.02 >[noecn] . 30002:30002(0) ack 2 <...>