socket端口复用之TCP和UDP

目录

1.什么是端口复用?

2.多个socket可以绑定同一个端口吗?

3.绑定同一端口的多个套接字如何接收数据?

4.SO_REUSEADDR和SO_REUSEPORT选项设置

5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?

5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。

5.2 程序重启后后,端口未释放导致程序重启异常。


1.什么是端口复用?

端口复用是指多个套接字绑定到同一个端口,多个套接字绑定同一个端口会涉及到多个套接字的竞争关系和合作关系。

 图 1 端口复用

竞争关系:可以理解为哪些套接字能绑定这个端口,哪些套接字则不能绑定这个端口。

合作关系:可以理解为怎样才能让更多的套接字绑定这个端口,哪些套接字有优先权等。

2.多个socket可以绑定同一个端口吗?

多个套接字默认情况是不可以绑定同一个端口。

设置过套接字选项(SO_REUSEADDR,SO_REUSEPORT)的套接字可以在某些情况下绑定同一个套接字,可以从UDP和TCP两种情况去讨论:

  • UDP情况

情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。

情况2:两个套接字源IP地址相同,如果两个套接字SO_REUSEADDR或者SO_REUSEPORT都设置为1,可以绑定同一个端口。

情况3:两个套接字源IP地址相同,除了情况2可以绑定同一个端口,其他情况都不能绑定同一个端口,通常第二个套接字会提示bind错误。

  • TCP 情况

情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。

情况2:两个套接字源IP地址相同,只要有一个套接字设置SO_REUSEPORT为0,就不能绑定同一个端口,通常第二个套接字会提示bind错误。

UDP套接字和TCP套接字可以绑定同一个端口,UDP和TCP端口号没有任何关系。

3.绑定同一端口的多个套接字如何接收数据?

UDP接收数据分析

 a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最后进行绑定操作的套接字优先收到数据。

b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。

c.都是绑定INADDR_ANY地址的套接字,最后进行绑定操作的套接字优先收到数据。

TCP接收数据分析

a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最先进行绑定操作的套接字优先收到数据。

b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。

c.都是绑定INADDR_ANY地址的套接字,最先进行绑定操作的套接字优先收到数据。

4.SO_REUSEADDR和SO_REUSEPORT选项设置

int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
  • 设置端口复用套接字选项需要在调用bind函数之前
  • SO_REUSEADDR和SO_REUSEPORT套接字选项级别(level)为SOL_SOCKET
  • 选项值:on=0 关闭选项,on:=1 开启选项 

5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?

5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。

TCP套接字处于TIME_WAIT状态,套接字资源还未释放,端口也未释放,需要设置端口复用才能进行重复绑定。

5.2 程序重启后,端口未释放,导致程序重启绑定失败,服务器程序常见。

这种情况在服务器重启时比较常见,所以需要设置端口复用来解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网心球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值