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问题。

你可能感兴趣的:(网络编程,SO_REUSEADDR,SO_REUSEPORT)