为什么Windows/Linux 的端口数量最大限制为65535?

news2024/11/24 3:46:14

端口0:一般是用来表示所有端口,即1–65535。另外其他答主也提到1–1024是知名端口号,但那是很久以前数据,是该更新了。举几个大于1024的知名端口号:1614/1615:思科ISE用于AAA的端口号1812/1813:Radius服务器使用的端口号3306:数据库mysql使用的端口号3389:微软Windows远程桌面使用的端口号8080:一般的应用服务器使用的端口号,例如tomcat因此,还觉得知名端口号,范围是1–1024吗?在实际使用中,对于tcp,客户端使用的临时端口号,一般都是大于10000的。对于udp,客户端使用的临时端口号,可以从大于10000中选,也可以使用跟服务器一样的端口号。

TCP 连接数量最大不能超过 65535。这是因为 TCP 协议头中的端口号是 16 位的,因此最大只能表示 65535 个端口号。
在理解如何处理大量并发连接之前,我们需要了解为什么 TCP 连接数量最大不能超过 65535。在 TCP 协议中,每个连接都需要一个唯一的端口号和 IP 地址来标识。由于 TCP 协议头中的端口号只有 16 位,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,因此最多只能表示 65535 个端口号。因此,TCP 连接数量也被限制在 65535 个。

需要注意的是,这个限制是针对每个 IP 地址的。也就是说,每个 IP 地址最多只能有 65535 个 TCP 连接。如果有多个 IP 地址,则可以建立更多的连接。这也是为什么现代服务器通常都会有多个网卡和 IP 地址的原因之一。
65535是指可用的端口总数,并不代表服务器同时只能接受65535个并发连接。
举个例子:

我们做了一个网站,绑定的是TCP的80端口,结果是所有访问这个网站的用户都是通过服务器的80端口访问,而不是其他端口。可见端口是可以复用的。
即使Linux服务器只在80端口侦听服务, 也允许有10万、100万个用户连接服务器。Linux系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。

端口最多只有65535个,为什么服务器能承受百万并发

一个进程绑定一个端口号”,这是显而易见的原则

当客户端要向服务器建立TCP连接时,会随机选择一个空闲端口,我们现在假设所有TCP都是长连接,那么当空闲端口被占用完后,自然无法创建更多的TCP连接,此时会报Cannot assign requested address的错误。我们都知道,端口号的取值范围是0~65535,既然端口号这么有限,服务器又是如何承受百万级甚至更高的并发量的?队列?缓存?多路复用?其实都没说到点子上

想象一下,一个nginx服务只占用一个80端口,难道它同时只能支撑一条TCP连接吗,显然不是的。那它又是如何区分到达同一端口的不同请求的呢?
TCP四元组
TCP四元组,简单来说,就是

<源IP地址,目标IP地址,源端口号,目标端口号>

在linux源码中,使用结构体sock_common表示

include/net/sock.h

struct sock_common {
    /* skc_daddr and skc_rcv_saddr must be grouped on a 8 bytes aligned
     * address on 64bit arches : cf INET_MATCH()
     */
    union {
        __addrpair        skc_addrpair;
        struct {
            __be32        skc_daddr;                // 外部/目的IPV4地址
            __be32        skc_rcv_saddr;        // 本地绑定IPV4地址
        };
    };
    // ...
    /* skc_dport && skc_num must be grouped as well */
    union {
        __portpair        skc_portpair;        //
        struct {
            __be16        skc_dport;            // inet_dport占位符
            __u16        skc_num;            // inet_num占位符
        };
    };
    // ...
} 

真实的sock_common比上面展示的要复杂的多,但要理解四元组,看这些部分就足够了

网络连接

在连接建立之初,服务器会根据四元组信息为每条不同的TCP连接建立socket,并保存在内存中。当客户端向服务端发送数据包时,会将四元组信息携带在ip头信息当中,服务端收到数据包之后,解析四元组信息,在内存中查找对应的socket。服务器使用不同的socket和不同的客户端进行通信,也就是说,只要四元组中有任意元素不相同,服务器就能判断出这是一个不同的连接,会使用不同的socket与其通信,而socket和端口并不是一一绑定的关系,只要资源充足,一个服务器进程可以创建出几百万条socket连接。
在这里插入图片描述

客户端端口复用

我们现在知道,服务器可以复用同一端口创建多条TCP连接,那另一方面,是否意味着客户端一条连接就需要占用一个端口呢?

对于客户端来说,源IP地址一定是确定的,那么如果要请求特定目标IP的特定端口,为了保证四元组中至少有一个元素不同,那么确实需要绑定多个端口才能并发创建多个连接。但这并不意味着一个客户端端口只能承载一个连接,只要目标IP和目标端口任意一个发生变化,就可以在同一端口下继续创建多条连接。同一台客户端机器有多个IP的话,也可以复用同一个端口;包括TCP和UDP也可以复用同一个端口。

理论承载量

假设有一台服务器,上面运行着Nginx服务,占用了80端口,那么它理论上的最大并发承载量是多少呢,根据四元组规则, 他的理论承载能力为:

2^32 * 2^16
其中232表示IPV4理论个数,216表示端口最大数量

当然没有哪台服务器可以承受几百万亿的并发量,究其原因,是因为每创建一个socket连接,都需要占用一定的内存。而且对于linux来说,创建连接实际上就是打开一个新文件,而为了防止打开过多文件导致系统崩溃,linux在系统层面和用户层面均设置了最大文件打开数。 作者:子非鱼nofish https://www.bilibili.com/read/cv17459503 出处:bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【腾讯云 Finops Crane 集训营】基于 Kubernetes 实现云资源分析与成本优化平台

基于 Kubernetes 实现云资源分析与成本优化平台 一、基本介绍1.主要功能2.整体架构 二、基于 Kubernetes 实现云资源分析与成本优化平台1.准备工作2.安装 Prometheus/Grafana 软件包3.安装 Crane 软件包4. 使用智能弹性 EffectiveHPA4.配置集群 三、功能验证1.成本展示2.资源推…

3分钟了解FactoryBean的作用和底层工作原理

大家好&#xff0c;我是冰点&#xff0c;本节我们通过对FactoryBean 接口源码解析&#xff0c;以及使用示例剖析&#xff0c;让大家3分钟了解FactoryBean的作用和底层工作原理。以及FactoryBean的使用场景&#xff0c;学以致用。 FactoryBean是Spring框架中的一个接口&#xf…

基于 resnet 对 CIFAR-10 图片进行分类和网络微调

本文基于李沐老师的 实战 Kaggle 比赛&#xff1a;图像分类 (CIFAR-10) 文章目录 数据格式数据加载标签转化划分数据集查看数据搭建网络主训练函数网络训练 数据格式 CIFAR-10 下载地址&#xff1a;https://www.kaggle.com/competitions/cifar-10/data 下拉到最下面有一个 Do…

JavaScript中的Event(事件)详解

Event 对象 Event 对象代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff01; 事件句柄 (Event Handlers) HTML 4.0 的新特性之一是能够使 HTML 事…

Maven uber-jar(带依赖的打包插件)maven-shade-plugin

文章目录 最基础的 maven-shade-plugin 使用生成可执行的 Jar 包 和 常用的资源转换类包名重命名打包时排除依赖与其他常用打包插件比较 本文是对 maven-shade-plugin 常用配置的介绍&#xff0c;更详细的学习请参照 Apache Maven Shade Plugin 官方文档 通过使用 maven-shade…

BetaFlight飞控启动运行过程简介疑问跟踪

BetaFlight飞控启动&运行过程简介疑问跟踪 1. 源由2. 【已解存疑】问题一&#xff1a;6.1 Why desiredPeriodCycles is so important to Betaflight task?3. 【已解】问题二&#xff1a;6.2 What root cause has made gyro task to been overrun, so scheduler has to ski…

轮式机械臂小车实现语音控制

1. 功能说明 本文实例将实现语音控制R214e样机运动&#xff08;前进、后退、左转、右转、拿起、放下&#xff09;的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#x…

港科夜闻|推进湾区产学研融合发展,香港科大(广州)—广州市属国企校企合作专题交流会圆满举行...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、推进湾区产学研融合发展&#xff0c;香港科大(广州)—广州市属国企校企合作专题交流会圆满举行。本次交流会由香港科大(广州)、广州市人民政府国有资产监督管理委员会主办&#xff0c;越秀集团协办&#xff0c;旨在充分发…

springboot+jsp网上图书商城销售系统java

开发环境 开发语言&#xff1a;Java 框架&#xff1a;springboot 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven…

ubuntu 20.04虚拟内存

ubuntu 20.04虚拟内存 1. 查看自己的虚拟内存 使用top命令或者使用free命令 2. 创建虚拟内存配置文件 # 新建文件夹 cd ~ mkdir swap cd swap# bs 为块的大小&#xff0c;count 创建多少个块 sudo dd if/dev/zero ofswapfile bs1M count2048# 修改权限 sudo chmod 0600 …

系统分析师:六、企业信息化战略与实施 练习题

目录 1、十二五的七大国家战略新兴产业体系 2、标准化的三个方面 3、信息的属性 4、电子政务描述 5、数据产品管理 6、企业门户 7、企业应用集成 8、电子商务标准体系 9、电子商务标准范畴 10、知识管理显性和隐形知识 11、决策支持系统 12、CRM解决方案 13、CRM核…

用Vue写教务系统学生管理

文章目录 一.首先创建新的Demo二.在APP里面绑定DemoStudent三.源码附上四.效果图&#xff08;新增记录还未实现&#xff09; 一.首先创建新的Demo 二.在APP里面绑定DemoStudent <template><img alt"Vue logo" src"./assets/logo.png"><!--…

华为OD机试真题 Java 实现【最小的调整次数】【2023Q1 100分】

一、题目描述 有一个特异性的双端队列&#xff0c;该队列可以从头部或尾部添加数据&#xff0c;但是只能从头部移出数据。 小A依次执行2n个指令往队列中添加数据和移出数据。 其中n个指令是添加数据 (可能从头部添加、也可能从尾部添加)&#xff0c;依次添加1到n&#xff0c…

超稳定ChatGPT镜像网站,小白适用,赶紧收藏【持续更新中】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

无代码开发引路,重塑企业数字生产力

互联网时代&#xff0c;信息的传递与共享成为企业运营的核心环节。传统的软件开发模式已经不能满足企业数字化转型的需要&#xff0c;而无代码开发平台可以在不改变底层技术架构的前提下&#xff0c;提供一种高效、低成本、灵活、易用的软件开发解决方案。相较于传统代码编写&a…

[山海关crypto 训练营 day13]

日常鼓励自己&#xff1a;世界上只有想不通的人&#xff0c;没有走不通的路。 [长安杯 2021]checkin 题目代码和数据 from Crypto.Util.number import * from secret import flag p getPrime(1024) q getPrime(16) n p*q m bytes_to_long(flag) for i in range(1,p-q):m…

事务AOP

事务&AOP 事务管理 在数据库中我们已经学过事务了。 事务是一组操作的集合&#xff0c;它是不可再分的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者撤销操作请求。所以这组操作要么是同时成功&#xff0c;要么同时失败。 事务的操作主要…

【共用体和枚举】

共用体 一种构造类型的数据结构 共用体和结构体类似&#xff0c;也是一种构造类型的数据结构。 既然是构造类型的&#xff0c;就需要先定义出类型&#xff0c;然后用类型定义变量。 定义共用体类型的方法和结构体非常相似&#xff0c;把struct 改成union 就可以了。 在进行某…

美颜SDK的应用与优化:一次全面探究

在直播过程中&#xff0c;美颜技术可以帮助主播实现更好的视觉效果&#xff0c;从而吸引更多的关注和粉丝。因此&#xff0c;直播美颜SDK的应用和优化已经成为了直播行业中的一个重要研究方向。 一、直播美颜SDK的应用 1. 美颜滤镜 美颜滤镜是直播美颜SDK中最常用的一种技术…

【Mybatis】Mybatis处理一对多、多对多关系映射-四

唠嗑部分 上篇文章我们说了Mybatis中ORM映射的几种方式&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 这篇文章我们来说说Mybatis如何处理一对一、一对多、多对多的关系映射…