Monday, May 25, 2009

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. 

No comments:

Post a Comment