c++ - 多個進程同時監聽了同一端口,豈不是不同的應用可以監聽同一個端口?
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-31 10:37:23
0
3
1062

nginx的模型知道是master-worker

#
曾经蜡笔没有小新
曾经蜡笔没有小新

全部回覆(3)
黄舟

這應該是多個進程同時重複使用一個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

Ty80

pid最小的應該就是master了。

漂亮男人

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!