socket选项SO_REUSEADDR和SO_REUSEPORT对比

首先,TCP/UDP连接是一个五元组(protocal, src addr, src port, dst addr, dst port)

BSD是其它socket实现标准的鼻祖,这里以BSD为例:


SO_REUSEADDR:
允许两个socket绑定(bind)到不完全相同的(ip, port)二元组
该选项有两个作用:
1. 允许前后两个socket绑定到通配地址(0.0.0.0)和具体的本地地址(192.168.1.102),未设置的话则通配地址和本地地址矛盾,第二次bind失败
2. 首先理解什么是timewait?
当调用close关闭socket的时候,内核发送缓冲区中可能还有数据未发送出去,
为了保证TCP的可靠性,在timewait时间内会继续发送数据,直到发完或超时。超时则强制关闭。
同时在timewait状态下,socket不会被释放,socket绑定的ip:端口也未释放
timewait默认是两分钟

SO_REUSEPORT:
运行任意数量的socket绑定到相同的(ip,port)二元组
前提是:每个socket都必须先设置SO_RESUSEPORT。
而SO_REUSEADDR只需要后面一个socket设置SO_REUSEADDR就能绑定成功。

windows平台只有SO_REUSEADDR,作用相当于(SO_REUSEADDR+SO_REUSEPORT)
设置了SO_REUSEADDR的socket即使其它的socket未设置SO_REUSEADDR也能绑定到其它socket已绑定的(ip,port)
为了避免安全问题,windows还提供了SO_EXCLUSIVEADDRUSE,让一个socket独占(ip,port)

个人理解:

linux下:SO_REUSEADDR主要用来解决timewait导致的绑定问题。SO_REUSEPORT也能解决timewait问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值