套接字选项:SO_REUSEADDR与SO_REUSEPORT


SO_REUSEADDR

通常,SO_REUSEADDR套接字选项用在以下情景:

重启TCP监听服务器

1)        启动一个监听服务器

2)        连接请求到达,派生一个子进程来处理这个客户

3)        监听服务器终止,但子进程继续为现有连接上的客户提供服务

4)        重启监听服务器

通常在这种情况下,由于子进程中正在处理的连接仍然使用着这个服务端口,将造成4)的bind到此端口的操作失败;然而开启SO_REUSEADDR选项后,则可以成功。

所以,通常TCP服务器都会开启此选项。

在同一个端口上启动同一个TCP服务器的多个实例

1)        第一个服务器bind第一个IP地址(10.82.15.100)和服务端口

2)        第二个服务器bind第二个IP地址(10.82.16.100)和服务端口

3)        第三个服务器bind第三个IP地址(通配IP地址INADDR_ANY)和服务端口

通常在这种情况下,只有1)的bind会成功,后续的bind都将失败;然而开启SO_REUSEADDr选项后,则都可以成功,也即允许“不完全重复”的捆绑。

这样,目的地址为第一个IP地址(10.82.15.100)和服务端口的TCP连接请求将被递送给第一个服务器实例;同样地,目的地址为第二个IP地址(10.82.16.100)和服务端口的TCP连接请求将被递送给第二个服务器实例;第三个服务器实例则作为“默认”的服务器,将接收其他的外来TCP连接请求。

单个进程捆绑同一个端口到多个套接字

这种情况和上面2中类似,只不过是在单个进程中,并且适用于TCP和UDP两种情况。

不过,通常不使用这种方式,而是采用以下的方式。

如果是TCP服务器,可以通过单个服务器实例处理所有请求。并通过getsockname来确定客户请求的目的地址(本地协议地址)。getpeername来确定源地址(对端协议地址)。

如果是UDP服务器,可以通过recvmsg(使用IPPROTO_IP与IP_RECVDSTADDR)告知内核将目的地随数据报一起返回。或者通过recvfrom可以得知数据报的源地址。

允许UDP进行“完全重复”的捆绑

当一个UDP数据报需有这些重复捆绑的UDP套接字接收时,内核依据以下规则:

1)        如果该数据报的目的地址是一个广播地址或者多播地址,那就给每个匹配的套接字递送一个该数据报的副本

2)        如果该数据报的目的地址是一个单播地址,那么就给其中一个匹配的套接字递送,具体的选择规则取决于不同实现。

 

SO_REUSEPORT

1.      通常,此套接字只用在UDP套接字上。

2.      并非所有系统都支持此选项,并且不如SO_REUSEADDR常用。

3.      本选项允许UDP进行“完全重复”的绑定。不过,SO_REUSEADDR只需要在后面bind的套接字开启即可;而SO_REUSEPORT需要在每个重复的套接字上都开启。

4.      如果被捆绑的IP地址是一个多播地址,那么SO_REUSEADDR与SO_REUSEPORT等效。

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告