首页 > 系统相关 >Linux SO_REUSEPORT与SO_REUSEADDR

Linux SO_REUSEPORT与SO_REUSEADDR

时间:2023-03-02 21:56:48浏览次数:37  
标签:捆绑 REUSEADDR 端口 REUSEPORT SO IP地址

SO_REUSEADDR

一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。
TCP先调用close()的一方会进入TIME_WAIT状态。

SO_REUSEADDR提供如下四个功能:
1) 允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
2) 允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
3) 允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
4) 允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)

SO_REUSEPORT

Linux Kernel 3.9引入了最新的SO_REUSEPORT选项,
此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行,如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。
使得多进程或者多线程创建多个绑定同一个ip:port的监听socket,提高服务器的接收链接的并发能力,程序的扩展性更好,此时需要设置SO_REUSEPORT(注意所有进程都要设置才生效)。

reuseport的原理
在3.9内核以前,为了支持多进程模型像haproxy,nginx等,大家不约而同的采用的fork的做法,即在父进程里,监听一个IP+port。
然后fork出N个子进程,子进程天然继承了父进程的listen socket的句柄,即可以执行accept操作了。

 

但因为是fork出来的,所以在kernel里,仍然是一个句柄,多个进程执行accept还是有竞争关系,所以nginx需要配置accept_mutex这样的开关,当开启reuseport后,每个监听地址将会有多个句柄,具体来说是一个worker一个,这样每个worker关心的listen socket就独立开了,自己搞定自己的事,避免了多进程的竞争。

 

标签:捆绑,REUSEADDR,端口,REUSEPORT,SO,IP地址
From: https://www.cnblogs.com/zhanggaofeng/p/17173696.html

相关文章

  • 学习操作系统P4 理解并发程序执行 (Peterson算法、模型检验与软件自动化工具)
    啊 多一个线程,在状态机里也可以理解为多一个栈帧啊啊啊错误如下图所示啊啊  当只有一个人想上厕所时,只有一个旗子被举起来,因此举旗的人可以直接进厕所......
  • Solidity极简入门#27. ABI编码解码
    ABI(ApplicationBinaryInterface,应用二进制接口)是与Ethereum智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。Soli......
  • sublime 3 离线安装xml、json格式化插件
    sublime3离线安装xml、json格式化插件插件地址: https://shanle.lanzout.com/iVwrZ0p1pqdg下载后:preference--browsePackage-丢到弹出的文件夹里使用:slection-f......
  • windows 使用 supervisor
    安装pip包playwright_spider.py生成主conf文件2.1 在对应的python环境的Scripts下,使用echo_supervisord_conf.exe>supervisord.conf,可以指定路径,不指定则生成在该......
  • TensorDataset和DataLoader
    一、TensorDataset语法:classtorch.utils.data.TensorDataset(data_tensor, target_tensor)作用:包装数据和目标张量(类似Python中的zip()函数),可通过第一维度索引两个张量恢......
  • SD12T1G 静电保护ESD二极管 SOT-23 SOD-323
    静电保护器件(ESD二极管)选型选用过程中,重点需要关注的参数有:反向截止电压、击穿电压、钳位电压、峰值脉冲电流、结电容等等。静电保护元件选型第一步需要确认的就是反向截止......
  • Linux操作命令(八)1.sort命令 2.uniq命令 3.join命令
    1、sort,排序常用参数参数描述-n基于字符串的长度来排序,使用此选项允许根据数字值排序,而不是字母值-k指定排序关键字-b默认情况下,对整行进行排序,从每行的......
  • Excel 数据转二维数组 JSON
    问题描述:偶尔会遇到读取Excel数据的场景如果是在网页中,可以上传文件然后处理(可借助js-xlsx等插件)如果有node服务,也可以使用类似的操作不过如果是在应用外,只是临......
  • KingbaseES V8R3 集群运维案例 --操作系统‘soft lockup’引起的failover切换
    案例说明:在国产中标麒麟系统生产环境中,监控发现KingbaseESV8R3集群发生了failover的主备切换,客户需要给出分析报告,说明此次集群发生failover切换的原因,本次文档通过分析......
  • Solon2 的 Bean 生命周期
    Solon框架的Bean是被容器托管的,所以它的生命周期只限定在容器内部:时机点说明补充AopContext::new()是在应用初始化时执行::new()AopContext::beanSca......