While testing ECN session setup,
a receiver could coax a passive ECN enabled
sender into running ECN, while the initial
SYN would not negotiate for ECN:
<SYN> --> <-- <SYN,ECE> : [ect0]data -->
Differential D23228
Fix passive ECN negotiation rscheff on Jan 17 2020, 10:53 AM. Authored by Tags None Referenced Files
Subscribers
Details
While testing ECN session setup, <SYN> --> <-- <SYN,ECE> : [ect0]data --> packetdrill script: // Flush Hostcache +0.00 `sysctl net.inet.tcp.ecn.enable=2` +0.02 `sysctl net.inet.tcp.hostcache.purgenow=1` // Create a connecting TCP socket. +0.010 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0.005 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +0.005 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0.005 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1048576], 4) = 0 +0 setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4) = 0 // Establish a TCP connection +0.035 connect(3, ..., ...) = -1 // EINPROGRESS +0 >[noecn] S 0:0(0) win 65535 <mss 1460, nop,wscale 6,sackOK,TS val ... ecr 0> // this may coax the sender into ECN mode +0 <[noecn] SE. 0:0(0) ack 1 win 65535 <mss 1000, sackOK, wscale 10, eol, nop, nop> +0 >[noecn] . 1:1(0) ack 1 win 1031 +0.01 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 +0.01 fcntl(3, F_SETFL, O_RDWR) = 0 // set back to blocking // Send some data from server +0.1 write(3, ..., 5000) = 5000 // if in ECN mode, the data would be sent with [ect0] here +0 >[noecn] . 1:1001(1000) ack 1 // we drop this packet +0 >[noecn] . 1001:2001(1000) ack 1 +0 >[noecn] . 2001:3001(1000) ack 1 +0 >[noecn] . 3001:4001(1000) ack 1 +0 >[noecn] P. 4001:5001(1000) ack 1 +0 <[noecn] . 1:1(0) ack 1 win 65535 <sack 1001:2001, eol, nop> +0 <[noecn] . 1:1(0) ack 1 win 65535 <sack 1001:3001, eol, nop> +0 <[noecn] . 1:1(0) ack 1 win 65535 <sack 1001:4001, eol, nop> // the retransmission +0 >[noecn] . 1:1001(1000) ack 1 +0 <[noecn] . 1:1(0) ack 1 win 65535 <sack 1001:5001, eol, nop> +0 <[noecn] . 1:1(0) ack 5001 win 65535 // Send some data to server +0.1 <[noecn] . 1001:2001(1000) ack 5001 win 65535 +0 >[noecn] . 5001:5001(0) ack 1 <nop, nop, sack 1001:2001> +0 <[noecn] . 2001:3001(1000) ack 5001 win 65535 +0 >[noecn] . 5001:5001(0) ack 1 <nop, nop, sack 1001:3001> +0 <[noecn] . 3001:4001(1000) ack 5001 win 65535 +0 >[noecn] . 5001:5001(0) ack 1 <nop, nop, sack 1001:4001> +0 <[noecn] P. 4001:5001(1000) ack 5001 win 65535 +0 >[noecn] . 5001:5001(0) ack 1 <nop, nop, sack 1001:5001> // the "re"transmission +0 <[noecn] . 1:1001(1000) ack 5001 win 65535 +0 >[noecn] . 5001:5001(0) ack 5001 +0.100 close(3) = 0 +0 <[noecn] F. 5001:5001(0) ack 5001 win 65535 +0 >[noecn] F. 5001:5001(0) ack 5001 +0 <[noecn] . 5002:5002(0) ack 5002 win 65535 +0 >[noecn] F. 5001:5001(0) ack 5002
Diff Detail
|