SO_REUSEADDR & SO_REUSEPORT

SO_REUSEADDR

  1. 當有一個有相同本地地址和端口的socket1處於TIME_WAIT狀態時,而你啓動的程序的socket2要佔用該地址和端口,你的程序就要用到該選項。
  2. SO_REUSEADDR允許同一port上啓動同一服務器的多個實例(多個進程)。但每個實例綁定的IP地址是不能相同的。在有多塊網卡或用IP Alias技術的機器可
    以測試這種情況。
  3. SO_REUSEADDR允許單個進程綁定相同的端口到多個socket上,但每個socket綁定的ip地址不同。這和2很相似,區別請看UNPv1。
  4. SO_REUSEADDR允許完全相同的地址和端口的重複綁定。但這隻用於UDP的多播,不用於TCP。

SO_REUSEPORT

The new socket option allows multiple sockets on the same host to bind to the same port, and is intended to improve the performance of multithreaded network server applications running on top of multicore systems.

linux kernel 3.9引入了最新的SO_REUSEPORT選項,使得多進程或者多線程可以創建多個綁定同一個ip:port的監聽socket,提高服務器的接收連接的併發能力,程序的擴展性更好;此時需要設置SO_REUSEPORT(注意所有進程都要設置才生效)。

目的:每一個進程有一個獨立的監聽socket,並且bind相同的ip:port,獨立的listen()和accept();提高接收連接的能力。(例如nginx多進程同時監聽同一個ip:port)

解決的問題:

  • 避免了應用層多線程或者進程監聽同一ip:port的“驚羣效應”。
  • 內核層面實現負載均衡,保證每個進程或者線程接收均衡的連接數。
  • 只有effective-user-id相同的服務器進程才能監聽同一ip:port (安全性考慮)

golang開源實現:https://github.com/kavu/go_reuseport

注意:SO_REUSEPORT只支持TCP和UDP。對unix domain socket不生效。

發佈了345 篇原創文章 · 獲贊 379 · 訪問量 90萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章