  Routers have packet buffers to reduce packet drops during times of
congestion. It is important to correctly size the buffer: make it too small,
and packets are dropped unnecessarily and the link may be underutilized; make
it too big, and packets may wait for a long time, and the router itself may be
more expensive to build. Despite its importance, there are few guidelines for
picking the buffer size. The two most well-known rules only apply to long-lived
TCP Reno flows; either for a network carrying a single TCP Reno flow (the
buffer size should equal the bandwidth-delay product, or $BDP$) or for a
network carrying $n$ TCP Reno flows (the buffer size should equal
$BDP/\sqrt{n}$). Since these rules were introduced, TCP Reno has been replaced
by newer algorithms as the default congestion control algorithm in all major
operating systems, yet little has been written about how the rules need to
change. This paper revisits both rules. For the single flow case, we generalize
the $BDP$ rule to account for changes to TCP, such as Proportional Rate
Reduction (PRR), and the introduction of new algorithms including Cubic and
BBR. We find that buffers can be made 60-75% smaller for newer algorithms. For
the multiple flow case, we show that the square root of $n$ rule holds under a
broader set of assumptions than previously known, including for these new
congestion control algorithms. We also demonstrate situations where the square
root of $n$ rule does not hold, including for unfair flows and certain settings
with ECN. We validate our results by precisely measuring the time series of
buffer occupancy in a real network, and comparing it to the per-packet window
size.
