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 (firstname.lastname@example.org):
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 (email@example.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