What is the difference between SO_REUSEADDR and SO_REUSEPORT?

What is the difference between SO_REUSEADDR and SO_REUSEPORT?

  SO_REUSEADDR allows your server to bind to an address which is in a
  TIME_WAIT state.  It does not allow more than one server to bind to
  the same address.  It was mentioned that use of this flag can create a
  security risk because another server can bind to a the same port, by
  binding to a specific address as opposed to INADDR_ANY.  The
  SO_REUSEPORT flag allows multiple processes to bind to the same
  address provided all of them use the SO_REUSEPORT option.

  From Richard Stevens (rstevens@noao.edu):

  This is a newer flag that appeared in the 4.4BSD multicasting code
  (although that code was from elsewhere, so I am not sure just who
  invented the new SO_REUSEPORT flag).

  What this flag lets you do is rebind a port that is already in use,
  but only if all users of the port specify the flag.  I believe the
  intent is for multicasting apps, since if you're running the same app
  on a host, all need to bind the same port.  But the flag may have
  other uses.  For example the following is from a post in February:

  From Stu Friedberg (stuartf@sequent.com):

       SO_REUSEPORT is also useful for eliminating the
       try-10-times-to-bind hack in ftpd's data connection setup
       routine.  Without SO_REUSEPORT, only one ftpd thread can
       bind to TCP (lhost, lport, INADDR_ANY, 0) in preparation for
       connecting back to the client.  Under conditions of heavy
       load, there are more threads colliding here than the
       try-10-times hack can accomodate.  With SO_REUSEPORT, things
       work nicely and the hack becomes unnecessary.

  I have also heard that DEC OSF supports the flag.  Also note that
  under 4.4BSD, if you are binding a multicast address, then
  SO_REUSEADDR is condisered the same as SO_REUSEPORT (p. 731 of "TCP/IP
  Illustrated, Volume 2").  I think under Solaris you just replace
  SO_REUSEPORT with SO_REUSEADDR.

  From a later Stevens posting, with minor editing:

  Basically SO_REUSEPORT is a BSD'ism that arose when multicasting was
  added, even thought it was not used in the original Steve Deering
  code.  I believe some BSD-derived systems may also include it (OSF,
  now Digital Unix, perhaps?).  SO_REUSEPORT lets you bind the same
  address *and* port, but only if all the binders have specified it.
  But when binding a multicast address (its main use), SO_REUSEADDR is
  considered identical to SO_REUSEPORT (p. 731, "TCP/IP Illustrated,
  Volume 2").  So for portability of multicasting applications I always
  use SO_REUSEADDR.



Home
FAQ