當前位置:編程學習大全網 - 遊戲軟體 - SO_REUSEADDR和SO_REUSEPORT作用

SO_REUSEADDR和SO_REUSEPORT作用

本文內容主要是對 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

  • 上一篇:操場埋屍案校長獄中懺悔,他是真心悔悟還是鱷魚的眼淚?
  • 下一篇:“圖靈機”由哪幾部分組成
  • copyright 2024編程學習大全網