[gPXE] any negative implications of setting TCP window size to (65536 - 4) ?

Glenn Brown glenn at myri.com
Thu Feb 18 12:55:27 EST 2010


Oops: I accidentally posted before providing details:

If gPXE TCP advertises a large window but the Ethernet driver only 
provides a little buffering and cannot keep up with receives, dropping 
when overwhelmed, this is no problem.  This case is handled by TCP 
congestion control by design: It is merely a case of a slow link with 
little buffering.

Similarly, the limited buffering is not a problem for multiple TCP 
connections, because TCP congestion control will dynamically slow the 
TCP senders to share the limited resources.

In fact, huge Ethernet receive buffers can actually hurt TCP performance 
when they fill, because they increase the end-to-end latency of the 
connection, increasing the round-trip-time measured by TCP, increasing 
TCP's retransmission delay, slowing lost-packet-recovery... and 
lost-packet recovery is especially important in gPXE where out-of-order 
receives are not supported.

Ideally, one wants to keep the Ethernet buffering just large enough to 
smooth over transient spikes in the packet arrival rate and to smooth 
over transient delays in received packet processing, such as interrupt 
coalescing.  For gPXE you probably want just a few MTUs worth of 
Ethernet buffering.  If TCP wants to support out-of-order receives, it 
can provide its own buffering for this, dropping frames when buffering 
is not available.  (Good driver<->TCP interfaces avoid copying 
out-of-order receives to TCP storage by swapping buffers with the 
Ethernet driver.  I do not know if gPXE can do this.)  This way, TCP can 
drop-or-NACK based on buffer availability, speeding recovery when frames 
are dropped by TCP instead of by Ethernet.  This approach also allows 
large amounts of TCP buffering without the buffering increasing the TCP 
connection round trip time, speeding recovery when frames are dropped in 
the Internet or by the Ethernet driver.

So, IMHO, it would be nice to see gPXE support large dynamic TCP window 
sizes without increasing buffering at the Ethernet level.  It should 
work fine with gPXE's current no-out-of-order implementation, and 
keeping the Ethernet buffering independent of TCP max window size is the 
right thing to do even if gPXE later supports out-of-order receives.

FWIW,
--Glenn


More information about the gPXE mailing list