搜尋

首頁  >  問答  >  主體

c++ - 多個進程同時監聽了同一端口,豈不是不同的應用可以監聽同一個端口?

nginx的模型知道是master-worker

#
曾经蜡笔没有小新曾经蜡笔没有小新2759 天前1115

全部回覆(3)我來回復

  • 黄舟

    黄舟2017-05-31 10:39:23

    這應該是多個進程同時重複使用一個socket

    不過在現代linux中,多個socket同時監聽同一個端口也是可能的,在Nginx 1.9.1以上版本也支持這一行為

    linux 3.9以上內核支援SO_REUSEPORT選項,即允許多個socket bind/listen在同一個連接埠上。這樣,多個進程就可以各自申請socket監聽同一個端口,當數據來時,內核做負載均衡,喚醒監聽的其中一個進程處理,用法類似於setsockopt(listener, SOL_SOCKET, SO_REUSEPORT, &option, sizeof (option))

    採用SO_REUSEPORT選項可以有效地解決epoll驚群問題,具體測試可以看看在下寫的例子:ThunderingHerdTest.cpp

    有關SO_REUSEPORT選項的討論可參考 The SO_REUSEPORT socket option,關於題主的疑慮,文中這句話可以作為解答:

    To prevent unwanted processes from hijacking a port that has already been bound by a server using SO_REUSEPORT, all of the servers that later bind to that port must have an effective user ID seffive ​​y user that the 000000us user ID userst 區the socket.

    即不是任意進程都可以綁定在同一個連接埠上的,只有effective user ID相同才可以

    關於NginxSO_REUSEPORT的討論可以看 We increase productivity by means of SO_REUSEPORT in NGINX 1.9.1

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-31 10:39:23

    pid最小的應該就是master了。

    回覆
    0
  • 漂亮男人

    漂亮男人2017-05-31 10:39:23

    單一應用多進程監聽同一埠, socket是共享的

    回覆
    0
  • 取消回覆