TCP ECN patch for review

Rui Paulo rpaulo at FreeBSD.org
Mon Nov 26 06:44:27 PST 2007


Ok, after two changes, the implementation seems ready.

You can grab the new diff at the same location:
	http://people.freebsd.org/~rpaulo/tcp_ecn.diff

I tested this on the netperf cluster using pf/altq as the "congested"  
router. The following configuration was used:
	altq on em0 bandwidth 3Mb cbq queue { dflt }
	queue dflt bandwidth 100% cbq(default,ecn)
	pass in on em0 from any to any keep state queue dflt
	pass out on em0 from any to any keep state queue dflt

In theory, this should give us max 384KB/s, but 360KB/s was observed  
both with ECN enabled and without ECN (which shows that basically our  
TCP stack is aggressive enough). The gain with ECN was not in  
throughput (as it was with NetBSD) but in the number of lost packets  
and retransmissions (both 0 when ECN was enabled.)

If you like throughput graphs :-),
	http://people.freebsd.org/~rpaulo/throughput-withecn.png
	http://people.freebsd.org/~rpaulo/throughput-withoutecn.png
(generated by wireshark)

As you can see, with ECN, the connection throughput seems to stabilize  
much more earlier than without ECN.
tcpdumps are available on request.
Next follows the tcptrace -lrW output for both scenarios.

Regards.


WITH ECN:
-------------------------------------------------------------------------
1 arg remaining, starting with 'tcpdump-withecn'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov  4, 2004

29646 packets seen, 29646 TCP packets traced
elapsed wallclock time: 0:00:00.075908, 390551 pkts/sec analyzed
trace file elapsed time: 0:00:56.917292
TCP connection info:
1 TCP connection traced:
TCP connection 1:
	host a:        192.168.5.108:57760
	host b:        192.168.5.109:22
	complete conn: yes
	first packet:  Mon Nov 26 09:46:29.787719 2007
	last packet:   Mon Nov 26 09:47:26.705011 2007
	elapsed time:  0:00:56.917292
	total packets: 29646
	filename:      tcpdump-withecn
    a->b:			      b->a:
      total packets:         18642           total packets:          
11004
      ack pkts sent:         18641           ack pkts sent:          
11004
      pure acks sent:           21           pure acks sent:         
10661
      sack pkts sent:            0           sack pkts  
sent:            0
      dsack pkts sent:           0           dsack pkts  
sent:           0
      max sack blks/ack:         0           max sack blks/ 
ack:         0
      unique bytes sent:  19993839           unique bytes sent:      
17903
      actual data pkts:      18619           actual data pkts:         
341
      actual data bytes:  19993839           actual data bytes:      
17903
      rexmt data pkts:           0           rexmt data  
pkts:           0
      rexmt data bytes:          0           rexmt data  
bytes:          0
      zwnd probe pkts:           0           zwnd probe  
pkts:           0
      zwnd probe bytes:          0           zwnd probe  
bytes:          0
      outoforder pkts:           0           outoforder  
pkts:           0
      pushed data pkts:         25           pushed data pkts:         
341
      SYN/FIN pkts sent:       1/1           SYN/FIN pkts sent:        
1/1
      req 1323 ws/ts:          Y/Y           req 1323 ws/ts:           
Y/Y
      adv wind scale:            3           adv wind  
scale:            3
      req sack:                  Y           req  
sack:                  N
      sacks sent:                0           sacks  
sent:                0
      urgent data pkts:          0 pkts      urgent data  
pkts:          0 pkts
      urgent data bytes:         0 bytes     urgent data  
bytes:         0 bytes
      mss requested:          1460 bytes     mss requested:           
1460 bytes
      max segm size:          1448 bytes     max segm size:            
736 bytes
      min segm size:             1 bytes     min segm size:             
32 bytes
      avg segm size:          1073 bytes     avg segm size:             
52 bytes
      max win adv:           66608 bytes     max win adv:            
66608 bytes
      min win adv:           65872 bytes     min win adv:            
52128 bytes
      zero win adv:              0 times     zero win  
adv:              0 times
      avg win adv:           66607 bytes     avg win adv:            
65010 bytes
      max owin:               2897 bytes     max owin:                 
769 bytes
      min non-zero owin:         1 bytes     min non-zero  
owin:         1 bytes
      avg owin:               1621 bytes     avg owin:                  
15 bytes
      wavg owin:              1289 bytes     wavg  
owin:                 6 bytes
      initial window:           39 bytes     initial window:            
39 bytes
      initial window:            1 pkts      initial  
window:            1 pkts
      ttl stream length:  19993839 bytes     ttl stream length:      
17903 bytes
      missed data:               0 bytes     missed  
data:               0 bytes
      truncated data:     19440399 bytes     truncated data:          
7673 bytes
      truncated packets:     18247 pkts      truncated packets:        
341 pkts
      data xmit time:       56.875 secs      data xmit time:        
56.875 secs
      idletime max:         1673.5 ms        idletime max:          
1779.3 ms
      throughput:           351279 Bps       throughput:               
315 Bps

      RTT samples:            9559           RTT samples:              
322
      RTT min:                 0.0 ms        RTT min:                  
0.2 ms
      RTT max:                99.8 ms        RTT max:                 
99.6 ms
      RTT avg:                 0.0 ms        RTT avg:                 
46.4 ms
      RTT stdev:               1.5 ms        RTT stdev:               
11.3 ms

      RTT from 3WHS:           0.0 ms        RTT from 3WHS:            
0.2 ms

      RTT full_sz smpls:      5140           RTT full_sz  
smpls:         1
      RTT full_sz min:         0.0 ms        RTT full_sz min:          
0.3 ms
      RTT full_sz max:         2.3 ms        RTT full_sz max:          
0.3 ms
      RTT full_sz avg:         0.0 ms        RTT full_sz avg:          
0.3 ms
      RTT full_sz stdev:       0.0 ms        RTT full_sz stdev:        
0.0 ms

      post-loss acks:            0           post-loss  
acks:            0
      segs cum acked:         9062           segs cum acked:            
21
      duplicate acks:            1           duplicate  
acks:            1
      triple dupacks:            0           triple  
dupacks:            0
      max # retrans:             0           max #  
retrans:             0
      min retr time:           0.0 ms        min retr time:            
0.0 ms
      max retr time:           0.0 ms        max retr time:            
0.0 ms
      avg retr time:           0.0 ms        avg retr time:            
0.0 ms
      sdv retr time:           0.0 ms        sdv retr time:            
0.0 ms


WITHOUT ECN:
-------------------------------------------------------------------------
1 arg remaining, starting with 'tcpdump-withoutecn'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov  4, 2004

26429 packets seen, 26429 TCP packets traced
elapsed wallclock time: 0:00:00.070504, 374858 pkts/sec analyzed
trace file elapsed time: 0:00:56.651240
TCP connection info:
1 TCP connection traced:
TCP connection 1:
	host a:        192.168.5.108:50080
	host b:        192.168.5.109:22
	complete conn: yes
	first packet:  Mon Nov 26 09:55:28.595502 2007
	last packet:   Mon Nov 26 09:56:25.246743 2007
	elapsed time:  0:00:56.651240
	total packets: 26429
	filename:      tcpdump-withoutecn
    a->b:			      b->a:
      total packets:         14948           total packets:          
11481
      ack pkts sent:         14947           ack pkts sent:          
11481
      pure acks sent:           15           pure acks sent:         
11168
      sack pkts sent:            0           sack pkts  
sent:            0
      dsack pkts sent:           0           dsack pkts  
sent:           0
      max sack blks/ack:         0           max sack blks/ 
ack:         0
      unique bytes sent:  19992591           unique bytes sent:      
16367
      actual data pkts:      14931           actual data pkts:         
311
      actual data bytes:  19992591           actual data bytes:      
16367
      rexmt data pkts:           0           rexmt data  
pkts:           0
      rexmt data bytes:          0           rexmt data  
bytes:          0
      zwnd probe pkts:           0           zwnd probe  
pkts:           0
      zwnd probe bytes:          0           zwnd probe  
bytes:          0
      outoforder pkts:           0           outoforder  
pkts:           0
      pushed data pkts:        106           pushed data pkts:         
311
      SYN/FIN pkts sent:       1/1           SYN/FIN pkts sent:        
1/1
      req 1323 ws/ts:          Y/Y           req 1323 ws/ts:           
Y/Y
      adv wind scale:            3           adv wind  
scale:            3
      req sack:                  Y           req  
sack:                  N
      sacks sent:                0           sacks  
sent:                0
      urgent data pkts:          0 pkts      urgent data  
pkts:          0 pkts
      urgent data bytes:         0 bytes     urgent data  
bytes:         0 bytes
      mss requested:          1460 bytes     mss requested:           
1460 bytes
      max segm size:          1448 bytes     max segm size:            
736 bytes
      min segm size:             1 bytes     min segm size:             
32 bytes
      avg segm size:          1338 bytes     avg segm size:             
52 bytes
      max win adv:           66608 bytes     max win adv:            
99376 bytes
      min win adv:           65872 bytes     min win adv:            
57920 bytes
      zero win adv:              0 times     zero win  
adv:              0 times
      avg win adv:           66607 bytes     avg win adv:            
87736 bytes
      max owin:               9329 bytes     max owin:                 
737 bytes
      min non-zero owin:         1 bytes     min non-zero  
owin:         1 bytes
      avg owin:               2012 bytes     avg owin:                  
25 bytes
      wavg owin:              1830 bytes     wavg  
owin:                 6 bytes
      initial window:           39 bytes     initial window:            
39 bytes
      initial window:            1 pkts      initial  
window:            1 pkts
      ttl stream length:  19992591 bytes     ttl stream length:      
16367 bytes
      missed data:               0 bytes     missed  
data:               0 bytes
      truncated data:     19545650 bytes     truncated data:          
7037 bytes
      truncated packets:     14851 pkts      truncated packets:        
311 pkts
      data xmit time:       56.608 secs      data xmit time:        
56.608 secs
      idletime max:         1885.2 ms        idletime max:          
1991.3 ms
      throughput:           352906 Bps       throughput:               
289 Bps

      RTT samples:            7980           RTT samples:              
306
      RTT min:                 0.0 ms        RTT min:                  
0.2 ms
      RTT max:                99.7 ms        RTT max:                
175.3 ms
      RTT avg:                 0.1 ms        RTT avg:                 
97.8 ms
      RTT stdev:               1.6 ms        RTT stdev:               
46.8 ms

      RTT from 3WHS:           0.0 ms        RTT from 3WHS:            
0.2 ms

      RTT full_sz smpls:      6983           RTT full_sz  
smpls:         1
      RTT full_sz min:         0.0 ms        RTT full_sz min:          
0.2 ms
      RTT full_sz max:         3.0 ms        RTT full_sz max:          
0.2 ms
      RTT full_sz avg:         0.0 ms        RTT full_sz avg:          
0.2 ms
      RTT full_sz stdev:       0.1 ms        RTT full_sz stdev:        
0.0 ms

      post-loss acks:            0           post-loss  
acks:            0
      segs cum acked:         6953           segs cum  
acked:            7
      duplicate acks:            1           duplicate  
acks:            1
      triple dupacks:            0           triple  
dupacks:            0
      max # retrans:             0           max #  
retrans:             0
      min retr time:           0.0 ms        min retr time:            
0.0 ms
      max retr time:           0.0 ms        max retr time:            
0.0 ms
      avg retr time:           0.0 ms        avg retr time:            
0.0 ms
      sdv retr time:           0.0 ms        sdv retr time:            
0.0 ms


--
Rui Paulo



More information about the freebsd-net mailing list