本文內容主要是對 SO_REUSEADDR和SO_REUSEPORT異同 的理解和總結,重點記錄linux下SO_REUSEADDR和SO_REUSEPORT的作用和區別
SO_REUSEADDR和SO_REUSEPORT主要是影響socket綁定ip和port的成功與否。先簡單說幾點綁定規則
規則1 :socket可以指定綁定到壹個特定的ip和port,例如綁定到192.168.0.11:9000上;
規則2 :同時也支持通配綁定方式,即綁定到本地"any address"(例如壹個socket綁定為 0.0.0.0:21,那麽它同時綁定了所有的本地地址);
規則3 :默認情況下,任意兩個socket都無法綁定到相同的源IP地址和源端口。
在了解了上述背景後下面簡單說明壹下linux中SO_REUSEADDR和SO_REUSEPORT對綁定的影響。由於大多數平臺對SO_REUSEADDR和SO_REUSEPORT的實現都是BSD上的衍生版本,因此的先介紹BSD中這兩個參數的作用。
SO_REUSEADDR的作用主要包括兩點
1、改變了通配綁定時處理源地址沖突的處理方式 ,其具體的表現方式為:未設置SO_REUSEADDR時,socketA先綁定到0.0.0.0:21,後socketB綁定192.168.0.1:21將失敗,不符合規則3。但在設置SO_REUSEADDR後socketB將綁定成功。並且這個設置對於socketA(通配綁定)和socketB(特定綁定)的綁定是順序無關的。下表總結了BSD在各個情況下的綁定情況
對於linux,要使這個設置達到預期效果,對於綁定的順序的有要求的,即在設置了SO_REUSEADDR,須先進行特定綁定,後進行通配綁定,後者才能成功;如果先進行通配綁定,後面的綁定(端口相同情況下)地址只要和通配綁定中的壹個相同都將失敗。
2、改變了系統對處於TIME_WAIT狀態的socket的看待方式 ,要理解這個句話,首先先簡單介紹以下什麽是處於TIME_WAIT狀態的socket?
在未設置SO_REUSEADDR時,內核將壹個處於TIME_WAIT狀態的socketA仍然看成是壹個綁定了指定ip和port的有效socket,因此此時如果另外壹個socketB試圖綁定相同的ip和port都將失敗(不滿足規則3),直到socketA被真正釋放後,才能夠綁定成功。如果socketB設置SO_REUSEADDR(僅僅只需要socketB進行設置),這種情況下socketB的綁定調用將成功返回,但真正生效需要在socketA被真正釋放後。(這個地方的理解可能有點問題,待後續驗證壹下)。總結壹下: 內核在處理壹個設置了SO_REUSEADDR的socket綁定時,如果其綁定的ip和port和壹個處於TIME_WAIT狀態的socket沖突時,內核將忽略這種沖突,即改變了系統對處於TIME_WAIT狀態的socket的看待方式。
SO_REUSEPORT作用就比較明顯直觀,即打破了上面的規則3
1、允許將多個socket綁定到相同的地址和端口,前提每個socket綁定前都需設置SO_REUSEPORT 。如果第壹個綁定的socket未設置SO_REUSEPORT,那麽其他的socket無論有沒有設置SO_REUSEPORT都無法綁定到該地址和端口直到第壹個socket釋放了綁定。
2、attention:SO_REUSEPORT並不表示SO_REUSEADDR ,即不具備上述SO_REUSEADDR的第二點作用(對TIME_WAIT狀態的socket處理方式)。因此當有個socketA未設置SO_REUSEPORT綁定後處在TIME_WAIT狀態時,如果socketB僅設置了SO_REUSEPORT在綁定和socketA相同的ip和端口時將會失敗。解決方案
(1)、socketB設置SO_REUSEADDR 或者socketB即設置SO_REUSEADDR也設置SO_REUSEPORT
(2)、兩個socket上都設置SO_REUSEPORT
Linux 內核3.9加入了SO_REUSEPORT。除上述功能外其額外實現了
1、為了阻止port 劫持Port hijacking,限制所有使用相同ip和port的socket都必須擁有相同的有效用戶id(effective user ID)。
2、linux內核在處理SO_REUSEPORT socket的集合時,進行了簡單的負載均衡操作,即對於UDP socket,內核嘗試平均的轉發數據報,對於TCP監聽socket,內核嘗試將新的客戶連接請求(由accept返回)平均的交給***享同壹地址和端口的socket(監聽socket)。
理解可能有誤,可參考原文 /questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t