【Linux进阶】端口复用与SO_REUSEADDR/SO_REUSEPORT
创始人
2025-05-31 07:56:42

端口复用

端口复用真正的用处主要在于服务器编程:当服务器需要重启时,经常会碰到端口尚未完全关闭的情况,这时如果不设置端口复用,则无法完成绑定,因为端口还处于被别的套接口绑定的状态之中。

以下为个人见解,若有错误请评论区指出和讨论,会及时修改。

1、对TCP编程来说,端口复用为了解决两个问题:

  1. TIME_WAIT 状态造成的服务器无法快速重启问题。

  2. 使用多个进程/线程达到对同一个端口监听的效果。

2、UDP中一般是为了达到多播的效果。

SO_REUSEADDR

见名知意,此选项为地址复用,但其实单用于解决TCP的TIME_WAIT的重启状态

而对于UDP,SO_REUSEADDR和SO_REUSEPORT相同,都可以解决监听同一端口的问题,即达到UDP组播。

  1. SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。

  2. SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。

  3. SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。

  4. SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。

SO_REUSEPORT

此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行。

如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。

端口复用,对TCP解决多线程/进程监听的问题。

  1. 我们可以使用SO_REUSEPORT这个socket option ,创建多个listen socket 共用一个端口号

  2. SO_REUSEPORT在TCP连接中是通过内核来选取套接字来进行接受连接

  3. SO_REUSEPORT有两种模式,热备份和负载均衡模式,当然在3.9之后,全部是负载均衡模式

  4. SO_REUSEPORT当有连接到来时,用数据包的源IP/源端口作为一个HASH函数的输入,将结果对reuseport套接字数量取模,得到一个索引,该索引指示的数组位置对应的套接字便是工作套接字。

  5. 但是也有弊端,就是一个listen socket fd 被关,被分到这个listen socket fd 的accept队列上的东西会被丢弃掉

  6. SO_REUSEPORT的好处:解决了epoll惊群问题,程序有了更好的扩展性,只有在同一个用户下相同的服务器进程才能监听同一ip:port (安全性考虑)

相关内容

热门资讯

原创 为... 在当今的餐饮市场中,酸菜鱼以其独特的风味和丰富的营养价值,成为了众多食客心中的美食佳肴。然而,随着消...
原创 年... 年夜饭,是春节的重头戏。 它不只是一顿丰盛的饭菜,更是一家人围坐在一起,把对新一年的期盼和祝福,都藏...
【新春走基层】团年饭温暖开席 ... 华声在线2月15日讯(全媒体记者 李昆励 通讯员 杨莎、杨清、余晨冉)腊味合蒸、全家福、梅菜扣肉……...
【新春走基层】黔味飘香年味浓!... 年味渐浓,年夜饭预订迎来高峰。 今年,贵州饭店·贵宾楼以“让黔味登堂入室”为核心,对年夜饭进行全方位...
新春走基层丨一天卖出几千斤,“... “看我手中拿的这个螃蟹,它的品质很好吧!都很哇塞的!因为它平时喝的水呀,都是骆马湖的纯天然水,吃的呢...