socket 端口和地址复用
https://blog.csdn.net/weibo1230123/article/details/79978745
https://blog.csdn.net/weixin_42157432/article/details/115560824
在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用:
int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *) &opt, sizeof(opt))) {perror("setsockopt");return -1;
}
端口复用可以这样理解:
在A机进行客户端网络编程,假如它使用的本地端口号为1234,如果没有开启端口复用的话,它用本地端口1234去连接B机再用本地端口连接C机时就不可以了。
若开启了端口复用的话在本地端口1234访问B机的情况下还可以用本地端口1234访问C机。
如果是服务器程序中监听的端口,即使开启了复用,也不可以用该端口向外发起连接。
接下来看看setsockopt
函数的参数意义:
/* Set socket FD's option OPTNAME at protocol level LEVELto *OPTVAL (which is OPTLEN bytes long).Returns 0 on success, -1 for errors. */
extern int setsockopt (int __fd, int __level, int __optname,const void *__optval, socklen_t __optlen) __THROW;
__optname常见的有两个:
SO_REUSEADDR
:地址复用
SO_REUSEPORT
:端口复用
一般来说,一个{addr,port}
只能被一个套接字绑定,无法重用。
不同的套接字只能绑定到不同的的{addr,port}
上
SO_REUSEADDR 和 SO_REUSEPORT
SO_REUSEADDR提供如下四个功能:
SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
SO_REUSEPORT选项有如下语义:
此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行。如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。
使用这两个套接口选项的建议:
在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;
功能如下:
- 若监听服务器进入TIME_WAIT状态,可立即重启
- 同一端口启动同一服务器的多个实例,需要每个实例socket绑定不同的ip地址,一般需要多个网卡支持
- 支持完全重复的捆绑
当一个IP地址和端口绑定到某个socket上,还允许此IP地址和端口号捆绑到另一个socket上。
一般来说,这个特性仅在支持多播的系统上才有用,而且只针对UDPsocket,TCP不支持多播
对于监听线程来说,可重用socket被称为监听桶(listener bucket),即每一个socket都是一个桶。以event模型为例,假设目前有3个子进程,吗,每个进程中都有一个监听线程和多个工作线程。
- 端口未重用情况下:
某个时刻,该监听socket仅能由某一个进程持有,当该进程接收到请求后,才让出监听权,相当于各个监听者只能轮流监听。
- 端口重用情况下
这里我们重用地址和端口两次,三个监听者都可以同时监听了。
三个监听桶下,各个进程不用让出监听权,看上去减轻了互斥锁的争用,避免了饥饿,还能更高效地监听,实现负载均衡,从而减轻了监听线程的压力,但是由于监听的过程中需要消耗CPU,若是单核CPU是无法体现出端口复用的优势的,反而会由于切换监听线程而降低性能。
所以若要使用端口复用,需要考虑几点: - 是否将监听进程/线程隔离在各自CPU中
- 重用次数
- CPU核数
socket 端口和地址复用相关推荐
- socket 编程的端口和地址复用
在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用: int opt = 1;if(setsockopt(sockfd, SOL_SOCKET,SO_REUSEA ...
- [导入]C#中实现Socket端口复用
一.什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口 ...
- 在C#中实现Socket端口复用
一.什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口 ...
- java socket 端口复用_Socket端口复用【转】
一.什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口 ...
- Accept是又产生一个Socket端口吗?
Accept是又产生一个Socket端口吗? 要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本 ...
- 阿里云socket端口不通的解决方案
阿里云socket端口不通的解决方案 1. 设置阿里云安全组规则 2. 防火墙中查询/开放/关闭端口 # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开 ...
- Nginx For Windows Socket 端口转发
Nginx For Windows Socket 端口转发 一.需求说明 二.配置文件 一.需求说明 使用Nginx进行端口转发 Socket 端口通信. 监控本地服务器的 3001 端口,转发到 1 ...
- 计组之存储系统:2、SRAM(区别、栅极电容、双稳态触发器、DRAM刷新、地址复用)和DRAM(MROM、PROM、EPROM、EEPROM)
2.SRAM和DRAM SRAM和DRAM 思维导图 SRAM与DRAM的核心区别: 栅极电容 V.S. 双稳态触发器 DRAM刷新 DRAM地址复用技术 SRAM.DRAM对比 ROM 思维导图 R ...
- Tomcat如果默认8080被占用修改端口号和查询端口号地址
一般使用80开头4位数的. 当然,随便你用什么端口,只要不被占用就OK. 范围是1~65535 查询端口号地址 在cmd 输入netstat -a 活动连接协议 本地地址 外部地址 状态TCP 0.0 ...
最新文章
- 基于 GraphQL 实践的一点思考
- upgrade mysql client_The mysql_upgrade client is now deprecated(mysql_upgrade客户机现在已经弃用)...
- 十大编程算法助程序员走上大神路
- 合并底稿分析,数据线索追溯
- 【论文解读】何恺明团队最新力作SimSiam:消除表征学习“崩溃解”,探寻对比表达学习成功之根源...
- @Deprecated使用技巧
- 微信小程序引入WeUI
- 如何从现在开始写博客?
- 修改端口_如何修改服务器的远程端口
- 开机SystemServer到ActivityManagerService启动过程分析
- Windows 系统常用工具软件
- Drool学习记录(一) 概念、Helloworld
- 京东价格监控软件开发技术探讨八:如何获取京东商品分类数据
- 下载并安装lsi MegaRAID raid卡 管理工具
- Leetcode--用两个栈实现一个队列
- google翻译退出中国后如何仍然使用windows版本
- 雷蛇键盘灯光配置文件_三模连接一步到位,游戏宅女必备的雷蛇电竞外设套装...
- 【新解】多品种小批量时代下,工业企业的成本核算方法
- 我的世界服务器皮肤文件夹在哪里,我的世界青龙皮肤文件,启动侠皮肤文件夹在哪个文件夹...
- 苹果 python蚂蚁森林自动收能量_蚂蚁森林自动收能量的最新脚本
热门文章
- matlab13节点线路模型,13节点配电网的建模与仿真.doc
- Java注释 link_Java 文档注释
- 浙江丽水学院计算机专业,2019丽水学院专业排名
- 毛绒材质渲染_学室内设计必进,建模渲染那都不是事儿
- 基于webpack搭建的vue element-ui框架
- 浅谈我所见的CSS命名风格
- 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur
- android之相机开发
- Mercurial hg web server的配置
- Response.Write具体介绍