学无先后,达者为师

网站首页 编程语言 正文

socket:REUSEADDR与REUSEPORT选项

作者:skysky97 更新时间: 2022-08-13 编程语言

SO_REUSEADDR是创建socket时比较常用的选项,通过该选项让多个socket可以
bind相同的端口。

具体来说SO_REUSEADDR带来2个功能:

  • 允许多个socket同时bind到相同的地址(IP+PORT)。
  • 允许bind处于TIME_WAIT状态的端口。

开启这个选项,对于TCP而言,不同的socket可以bind到相同的地址,然后connect
不同的目标地址。如果试图连接相同的目标地址,则会报错,因为五元组都相同
时无法区分不同的连接。如果执行listen操作,同样会报错,因为SO_REUSEADDR
不能用于listen,也就是说不能在相同地址上启动多个tcp server。

UDP不需要listen,开启SO_REUSEADDR使得UDP类型的socket可以重复bind相同的地址。
但是绑定成功并不意味着能正常接收数据。

UDP广播和组播

  • 所有socket都能收到数据。

UDP单播

  • 总是最新创建的socket收到数据。
  • 新创建的socket在close后,次新创建的socket开始接收数据。

REUSEPORT功能基本与REUSEADDR相似,不同点在于:

  • tcp使用REUSEPORT选项可以bind并listen相同的端口,多个listen以负载均衡的方式
    接收新连接。但是连接创建后,数据接收是固定的。

  • udp使用REUSEPORT选项bind到相同地址,多个socket以负载均衡的方式接收数据。

  • REUSEPORT要求进程属于相同的user,而REUSEADDR没有这个要求。

参考链接:https://medium.com/uckey/so-reuseport-addr-2-2-how-packets-forwarded-to-multiple-sockets-ce4b83cd0fd2

原文链接:https://blog.csdn.net/skysky97/article/details/126252236

栏目分类
最近更新