Page MenuHomeFreeBSD

rfc6675-large-window-partialack-recovery-rescue-rexmt.pkt

Authored By
rscheff
Jan 26 2019, 10:30 PM
Size
9 KB
Referenced Files
None
Subscribers
None

rfc6675-large-window-partialack-recovery-rescue-rexmt.pkt

//
// A simple test to validate RFC6582
// (minimum cwnd after loss recovery >= 2 mss)
//
// First, cwnd is built up by acking every data segment
//
// Then we "drop" one packet, and sent
// 4 dup ACKs with the appropriate SACK blocks.
//
// When the retransmission arrives, we do
// a cumulative ACK. Depending on how many
// Segements are received after that, we
// can infer the cwnd size and the behavior
// of SACK loss recovery.
--tolerance_usecs=50000
// Flush Hostcache
0.0 `sysctl net.inet.tcp.rfc6675_pipe=1`
0.1 `sysctl net.inet.tcp.hostcache.purgenow=1`
0.2 `sync` // in case of crash
// Create a listening TCP socket.
0.50 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0.005 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0.005 setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4) = 0
+0.005 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1048576], 4) = 0
+0.005 bind(3, ..., ...) = 0
+0.005 listen(3, 1) = 0
// Establish a TCP connection.
+0.035 < SEW 0:0(0) win 65535 <mss 1000, sackOK, wscale 9, nop, nop, nop >
+0.000 > SE. 0:0(0) ack 1 win 65535 <...>
+0.000 < . 1:1(0) ack 1 win 65535
+0.000 accept(3, ..., ...) = 4
// Write some data to be sent to the simulated
// packetdrill receiver.
+0.10 write(4, ..., 33000) = 33000
+0 > . 1:1001(1000) ack 1
+0 < . 1:1(0) ack 1001 win 65535 // ACKing every packet
+0 > . 1001:2001(1000) ack 1
+0 < . 1:1(0) ack 2001 win 65535 // to built up cwnd fast
+0 > . 2001:3001(1000) ack 1
+0 < . 1:1(0) ack 3001 win 65535
+0 > . 3001:4001(1000) ack 1
+0 < . 1:1(0) ack 4001 win 65535
+0 > . 4001:5001(1000) ack 1
+0 < . 1:1(0) ack 5001 win 65535
+0 > . 5001:6001(1000) ack 1
+0 < . 1:1(0) ack 6001 win 65535
+0 > . 6001:7001(1000) ack 1
+0 < . 1:1(0) ack 7001 win 65535
+0 > . 7001:8001(1000) ack 1
+0 < . 1:1(0) ack 8001 win 65535
+0 > . 8001:9001(1000) ack 1
+0 < . 1:1(0) ack 9001 win 65535
+0 > . 9001:10001(1000) ack 1
+0 < . 1:1(0) ack 10001 win 65535
+0 > . 10001:11001(1000) ack 1
+0 < . 1:1(0) ack 11001 win 65535
+0 > . 11001:12001(1000) ack 1
+0 < . 1:1(0) ack 12001 win 65535
+0 > . 12001:13001(1000) ack 1
+0 < . 1:1(0) ack 13001 win 65535
+0 > . 13001:14001(1000) ack 1
+0 < . 1:1(0) ack 14001 win 65535
+0 > . 14001:15001(1000) ack 1
+0 < . 1:1(0) ack 15001 win 65535
+0 > . 15001:16001(1000) ack 1
+0 < . 1:1(0) ack 16001 win 65535
+0 > . 16001:17001(1000) ack 1
+0 < . 1:1(0) ack 17001 win 65535
+0 > . 17001:18001(1000) ack 1
+0 < . 1:1(0) ack 18001 win 65535
+0 > . 18001:19001(1000) ack 1
+0 < . 1:1(0) ack 19001 win 65535
+0 > . 19001:20001(1000) ack 1
+0 < . 1:1(0) ack 20001 win 65535
+0 > . 20001:21001(1000) ack 1
+0 write(4, ..., 33000) = 33000 // Inject some additional data
+0 < . 1:1(0) ack 21001 win 65535
+0 > . 21001:22001(1000) ack 1
+0 < . 1:1(0) ack 22001 win 65535
+0 > . 22001:23001(1000) ack 1
+0 < . 1:1(0) ack 23001 win 65535
+0 > . 23001:24001(1000) ack 1
+0 < . 1:1(0) ack 24001 win 65535
+0 > . 24001:25001(1000) ack 1
+0 < . 1:1(0) ack 25001 win 65535
+0 > . 25001:26001(1000) ack 1
+0 < . 1:1(0) ack 26001 win 65535
+0 > . 26001:27001(1000) ack 1
+0 < . 1:1(0) ack 27001 win 65535
+0 > . 27001:28001(1000) ack 1
+0 < . 1:1(0) ack 28001 win 65535
+0 > . 28001:29001(1000) ack 1
+0 < . 1:1(0) ack 29001 win 65535
+0 > . 29001:30001(1000) ack 1
+0 < . 1:1(0) ack 30001 win 65535
+0 > . 30001:31001(1000) ack 1
+0 < . 1:1(0) ack 31001 win 65535
+0 > . 31001:32001(1000) ack 1
+0 < . 1:1(0) ack 32001 win 65535
+0 > P. 32001:33001(1000) ack 1
+0 < . 1:1(0) ack 33001 win 65535
+0 > . 33001:34001(1000) ack 1
+0 < . 1:1(0) ack 34001 win 65535
+0 > . 34001:35001(1000) ack 1
+0 < . 1:1(0) ack 35001 win 65535
+0 > . 35001:36001(1000) ack 1
+0 < . 1:1(0) ack 36001 win 65535
+0 > . 36001:37001(1000) ack 1
+0 < . 1:1(0) ack 37001 win 65535
+0 > . 37001:38001(1000) ack 1
+0 < . 1:1(0) ack 38001 win 65535
+0 > . 38001:39001(1000) ack 1
+0 < . 1:1(0) ack 39001 win 65535
+0 > . 39001:40001(1000) ack 1
+0 < . 1:1(0) ack 40001 win 65535
+0 > . 40001:41001(1000) ack 1
+0 < . 1:1(0) ack 41001 win 65535
+0 > . 41001:42001(1000) ack 1
+0 < . 1:1(0) ack 42001 win 65535
+0 > . 42001:43001(1000) ack 1
+0 < . 1:1(0) ack 43001 win 65535
+0 > . 43001:44001(1000) ack 1
+0 < . 1:1(0) ack 44001 win 65535
+0 > . 44001:45001(1000) ack 1
+0 < . 1:1(0) ack 45001 win 65535
+0 > . 45001:46001(1000) ack 1
+0 < . 1:1(0) ack 46001 win 65535
+0 > . 46001:47001(1000) ack 1
+0 < . 1:1(0) ack 47001 win 65535
+0 > . 47001:48001(1000) ack 1
+0 < . 1:1(0) ack 48001 win 65535
+0 > . 48001:49001(1000) ack 1
+0 < . 1:1(0) ack 49001 win 65535
+0 > . 49001:50001(1000) ack 1
+0 < . 1:1(0) ack 50001 win 65535
+0 > . 50001:51001(1000) ack 1
+0 > . 51001:52001(1000) ack 1
+0 > . 52001:53001(1000) ack 1
+0 > . 53001:54001(1000) ack 1
+0 > . 54001:55001(1000) ack 1
+0 > . 55001:56001(1000) ack 1
+0 > . 56001:57001(1000) ack 1
+0 > . 57001:58001(1000) ack 1
+0 > . 58001:59001(1000) ack 1
+0 > . 59001:60001(1000) ack 1
+0 > . 60001:61001(1000) ack 1
+0 > . 61001:62001(1000) ack 1
+0 write(4, ..., 33000) = 33000
+0 > . 62001:63001(1000) ack 1
+0 > . 63001:64001(1000) ack 1
+0 > . 64001:65001(1000) ack 1
+0 > P. 65001:66001(1000) ack 1
+0 > . 66001:67001(1000) ack 1
+0 > . 67001:68001(1000) ack 1
+0 > . 68001:69001(1000) ack 1
+0 > . 69001:70001(1000) ack 1
+0 > . 70001:71001(1000) ack 1
+0 > . 71001:72001(1000) ack 1
+0 > . 72001:73001(1000) ack 1
+0 > . 73001:74001(1000) ack 1
+0 > . 74001:75001(1000) ack 1
+0 > . 75001:76001(1000) ack 1
+0 > . 76001:77001(1000) ack 1
+0 > . 77001:78001(1000) ack 1
+0 > . 78001:79001(1000) ack 1
+0 > . 79001:80001(1000) ack 1
+0 > . 80001:81001(1000) ack 1
+0 > . 81001:82001(1000) ack 1
+0 > . 82001:83001(1000) ack 1
+0 > . 83001:84001(1000) ack 1
+0 > . 84001:85001(1000) ack 1
+0 > . 85001:86001(1000) ack 1
+0 > . 86001:87001(1000) ack 1
+0 > . 87001:88001(1000) ack 1
+0 > . 88001:89001(1000) ack 1
+0 > . 89001:90001(1000) ack 1
+0 > . 90001:91001(1000) ack 1
+0 > . 91001:92001(1000) ack 1
+0 > . 92001:93001(1000) ack 1
+0 > . 93001:94001(1000) ack 1
+0 > . 94001:95001(1000) ack 1
+0 > . 95001:96001(1000) ack 1
+0 > . 96001:97001(1000) ack 1
+0 > . 97001:98001(1000) ack 1
+0 > P. 98001:99001(1000) ack 1
+0.05 < . 1:1(0) ack 73001 win 65535 <sack 80001:81001, nop, nop> //sb 1000
+0.01 < . 1:1(0) ack 74001 win 65535 <sack 80001:82001, nop, nop> //sb 2000
// this next ack should trigger FastRecovery under RFC6675
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:83001, nop, nop> //sb 3000
+0 > W. 75001:76001(1000) ack 1
+0 %{ print "Partial ACK with 3 MSS SACK block entered LossRecovery" }%
+0 > . 76001:77001(1000) ack 1
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:84001, nop, nop> //sb 4000
+0 > . 77001:78001(1000) ack 1
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:85001, nop, nop> //sb 5000
+0 > . 78001:79001(1000) ack 1
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:86001, nop, nop> //sb 6000
+0 > . 79001:80001(1000) ack 1
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:87001, nop, nop> //sb 7000
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:88001, nop, nop> //sb 8000
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:89001, nop, nop> //sb 9000
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:90001, nop, nop> //sb 10000
+0.01 < . 1:1(0) ack 75001 win 65535 <sack 80001:91001, nop, nop> //sb 11000
+0.05 < . 1:1(0) ack 76001 win 65535 <sack 80001:91001, nop, nop> //sb 11000
+0 > . 99001:99001(0) ack 1
+0 %{ print "Missed Transmit opportunity, sends 'keepalive'" }%
+0.01 < . 1:1(0) ack 77001 win 65535 <sack 80001:91001, nop, nop> //sb 11000
+0 > . 99001:99001(0) ack 1
+0.01 < . 1:1(0) ack 78001 win 65535 <sack 80001:91001, nop, nop> //sb 11000
+0 > . 99001:99001(0) ack 1
+0.01 < . 1:1(0) ack 79001 win 65535 <sack 80001:91001, nop, nop> //sb 11000
+0 > . 99001:99001(0) ack 1
+0.01 < . 1:1(0) ack 91001 win 65535
+0 %{ print "Full ACK below snd_recover should trigger RescueRexmt" }%
+0 > P. 98001:99001(1000) ack 1
+0.01 < . 1:1(0) ack 91001 win 65535 <sack 98001:99001, nop, nop>
+0 %{ print "Received RescueRexmit" }%
+0 > . 91001:92001(1000) ack 1
+0 > . 92001:93001(1000) ack 1
+0.01 < . 1:1(0) ack 92001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 93001:94001(1000) ack 1
+0.01 < . 1:1(0) ack 93001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 94001:95001(1000) ack 1
+0.01 < . 1:1(0) ack 94001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 95001:96001(1000) ack 1
+0.01 < . 1:1(0) ack 95001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 96001:97001(1000) ack 1
+0.01 < . 1:1(0) ack 96001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 97001:98001(1000) ack 1
+0.01 < . 1:1(0) ack 97001 win 65535 <sack 98001:99001, nop, nop>
+0 > . 99001:99001(0) ack 1
+0.01 < . 1:1(0) ack 99001 win 65535
1.500 close(4) = 0
+0 > F. 99001:99001(0) ack 1

File Metadata

Mime Type
text/plain
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1726499
Default Alt Text
rfc6675-large-window-partialack-recovery-rescue-rexmt.pkt (9 KB)

Event Timeline