一台主机上只能保持最多 65535 个 TCP 连接吗?

大家好,我是老杨。

在知乎上刷到一个问题,叫做“一台主机上只能保持最多 65535 个 TCP 连接吗?”

关注度极高,想着咱们粉丝也一定有兴趣,就展开聊一聊。

对技术感兴趣,是做我们这一行必须要有的品质之一,但对技术有执念,想要一个个学深学透,是优秀的网工才会有的特点。

如果你对技术有着无限热情,建议看一看我专门为我的粉丝整理过的网络技术图谱。

其中包括了网络技术必学的技术方向和细分类目,告诉你一个技术得学,还告诉你要从哪几个方面学。

私信我,发送暗号“网络技术”,即可获取,算是福利一波。

01 趣说TCP那些事

说回正题,在聊这个问题之前,我需要先给小白们搞定一下基础概念。

到底什么是TCP?

你去随便百度一下,你就会收获到这一段话:

“TCP传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。”

看的云里雾里不要紧,我们转换成人话就能听上一听。

如果你想要和女朋友24小时联系,永远不分开,你就需要一个东西把你俩千里姻缘一线牵起来。

这个东西,可能是麻绳,可能是月老的红绳,可能是电话线,也可能是TCP协议。

TCP是面向连接的,也就是说,TCP的目的就是为了连接A和B,在这个层面上,它起到了“连接”作用。

如果仅仅是“连接”,还不能满足你和你女朋友“24小时联系,永远不分开”的要求。

毕竟,可能这绳子质量不好给整断了,月老一个不开心把你俩红绳给拆了,又或者是电话没信号了,都会影响你的稳定性需求。

那这时候,用TCP连接,就不会有这个问题,因为TCP连接的过程很坎坷,正因为坎坷,所以十分“可靠”。

这就是被人耳熟能详的“三次握手”、“四次挥手”。

网络环境十分复杂,接受的是来自四面八方全方位的包,将其送到准确的目的地,还要保证稳定的连接,是件很难的事情。

为了实现这个愿望,TCP不得不煞费苦心的经过3+4的握手挥手,保证一个数据顺利传递到对方那里。

从某个层面来说,山盟海誓都不如TCP传输的可靠性来的有价值。

最后,TCP的连接传输是基于字节流的,这句话怎么理解?

要知道哈,通过TCP发送出去的消息,是被操作系统拆分成一个一个的报文来发送的。

报文的内容不是完整的,要等所有的报文都到位,进行组装后,你才能收到一个完整的信息,最后让女朋友看到那句:“我好想你啊,出来吃饭吧!”

那么,TCP连接如此复杂,一台主机上真的能保持最多 65535 个 TCP 连接吗?

继续往下看。

02 TCP连接到底有啥弯弯绕绕的?

简单介绍完了TCP,你或许对TCP和他的连接方式产生了兴趣。

这里需要再给你延展两个概念,一个是第一点提及的“三次握手”,第二个“TCP四元组”,帮助我们更好回答文章开头的技术问题。

01 三次握手,怎么握的?

TCP的“三次握手”你可以理解为是TCP发功时所需要的仪式。

因为TCP常常用来发送大批量的数据,所以,为了提供可靠的的传送服务,TCP在发送数据之前,都需要用一种特定的顺序将数据包编号,并将这些数据包传送给目标,再确认消息。

当对应的程序收到数据后,确认收到也需要用到TCP。

其实,三次握手就是为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

那说了半天,到底握手是怎么握?

Step 1

TCP客户端准备发送一个syn段,用来指明客户打算链接的服务器端口以及isn(初始序号)。那么这个syn就被称为“报文段1”。

Step 2

那么,接下来,TCP服务端就会发回包含TCP服务端isn的syn段(即报文段2)作为回应。与此同时,TCP服务端会将确认序号设置为TCP客户端的isn+1,以对TCP客户端的s y n报文段进行确认。

Step 3

最后,TCP客户端也必须将确认的序号设置为TCP服务端的isn+1,作为对TCP服务端syn报文段的确认(即报文段3)这三个报文段就代表了连接的建立,而这个过程,就是TCP的三次握手(three-wayhandshake)。

谢希仁版的《计算机网络》里说过,TCP的握手,其实是为了保证双方互相明确对方收发能力的最低值。两次太少,四次太多,三次正正好。

而且啊,其实不论握手多少次都不能确认一条信道是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数,其实就不过是提高“它是可用的”这个结论的可信程度。

而且严格来说,三次握手其实是双方各握手一次,然后各确认一次,其中,一次握手+确认是合并在一起的,这才是“三次”的由来。

02 TCP四元组

如何唯一确定一个 TCP 连接,这就不得不提到TCP 四元组这个概念,它可以唯一的确定一个连接。

到底啥是TCP四元组?

四元组包括:源地址、源端口、目的地址、目的端口。

其中,源地址和目的地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。

源端口和目的端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

通过TCP四元组,你才能标识到一个TCP连接数:{localip, localport,remoteip,remoteport} = {本地ip,本地port,远程ip,远程port}

所以,整体过程应该是:

server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接。

接下来,确定了单位值,也确定了连接过程,我们就可以推算到底标题中的数字对还是不对了。

03 一台主机上只能保持最多 65535 个 TCP 连接吗?

先从这句话的字面意思去剖析,答案肯定是错误的。

因为,1个IP可能的确最多只能65535个连接,但是一台主机可以有多个IP,所以这句话本身是有一定歧义的。

再者,我们来聊这个65535次的问题。

要解释好这个问题,就要先说清楚65535这个数字到底从哪里来的。

在Linux系统中,如果两个设备要通信,相互之间就得建立TCP连接,为了让双方互相认识,Linux系统需要用TCP四元组来唯一标识一个TCP连接。

IP和端口就相当于小区地址和门牌号,只有拿到这些信息,通信的双方才能互相认知。

在Linux系统中,表示端口号(port)的变量占16位,这就决定了端口号最多有2的16次方个,即65536个,另外端口0有特殊含义不给使用,这样每个服务器最多就有65535个端口可用。

所以,65535代表Linux系统支持的TCP端口号数量,在TCP建立连接时会使用。

但是,一般的系统里 1024 以下的端口都是保留的,所以没法用。可用的大约就是64000个。

这仅仅是端口数量,和连接数是有区别的,实际上客户端可以发出的连接远远不止这个数。

Linux服务器在交互时,一般有两种身份:客户端或者服务器端。

端口port主要用在服务器和客户端的“握手认识”过程,一旦互相认识了,就会生成新的socket进行通信。

这时候port就不再需要了,可以给别的socket通信去使用,所以很明显TCP连接的数量可以大于TCP端口号的数量65,535。

客户端 IP 和 端口是可变的,理论值计算公式就是:最大TCP连接数=客户端的IP数 x 客户端的端口数

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是服务端单机最大 TCP 连接数,约为 2 的 48 次方。

当然,服务端最大并发 TCP 连接数远不能达到理论上限,会受很多因素影响,比如文件描述符限制和内存限制等。

看到这里,你是否有所收获?

如有自己的见解,也欢迎留言分享给更多网工朋友。

原创:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6大顶级团队计划目标管理软件盘点,全行业适用!

在快节奏的现代工作环境中,高效的团队计划和执行是团队取得成功的关键。然而,随着团队规模不断增大、工作任务不断增加,如何提高团队计划与效率成为了一个挑战。幸运的是,有许多先进的软件工具可以帮助团队更好地组织、协调和追踪…

【Python基础】基于UPD协议实现简易聊天室(Socket编程)

UDP通信 1.什么是 socket2. 创建 socket3.udp 网络程序-发送、接收数据(User Datagram Protocol)udp 网络程序-发送、接收数据(客户端)udp 绑定信息udp 绑定信息---服务器端总结 4.udp 聊天器 1.什么是 socket socket(简称 套接字…

遍历List集合和Map进行修改和删除报java.util.ConcurrentModificationException错误详解

一、异常产生 当我们使用foreach迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素或新增),可能会抛出java.util.ConcurrentModificationException的异常。 javapublic static void main(String[] args)…

ChatGPT显现“ Something went wrong. If this issue persists ...”什么原因?如何解决?

一、报错提示 Something went wrong. If this issue persists please contact us through our help center at help.openai.com. 二、解决方案 一般是代理节点出现问题 ChatGPT退出登录 关闭代理并重新启动代理 切换其他节点 清除浏览器缓存 重新登录ChatGPT 三、其它思路…

C# TabControl实现为每一个TabPage添加关闭按钮

默认情况下TabControl是无法通过界面关闭TabPage的 有些情况下我们需要手动关闭任意一个TabPage,如下图所示 TabControl控件自带属性是无法满足以上需求,下面简单介绍实现过程 1、首先需要对TabPage进行重绘,其目的是为了在TabPage上画出…

Linux学习第38天:Linux I2C 驱动实验(二):哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要学习I2C设备驱动编写及硬件原理图分析。 先把整个本节的思维导图贴出来: 二、I.MX6U的I2C适配器驱动分析 适配器驱动一般都是由SOC厂商提…

乌镇峰会十年之约,为什么IBM是那颗最亮的星?

(IBM董事长兼首席执行官Arvind Krishna) 2023年处于世界互联网下一个50年开端的头五年。54年前的1969年,世界互联网诞生;同年,IBM助力“阿波罗”号登月成功、首次将人类宇航员送上了月球;当时,…

React Native适配Xcode 15 iOS 17.0+

iOS 17.0 Simulator(21A328)下载失败 App Store 更新到 Xcode15 后,无法运行模拟器和真机。需要下载iOS 17对应的模拟器。Xcode中更新非常容易中断失败,可以在官网单独下载iOS 17模拟器文件,例如:iOS_17.0.1_Simulator_Runtime.d…

WPS表格无法粘贴信息,原因是复制区域与粘贴区域形状不同

WPS表格无法粘贴信息,原因是复制区域与粘贴区域形状不同 问题描述 我是选中了一整列,复制,但是无法粘贴到另一个EXCEL表格中 原因 首先我的数据量很大,有20万行,然后需要复制的EXCEL是.xls格式的,.xls格…

ros1 基础学习07 - 模拟客户端生成小乌龟服务请求生成小乌龟

模拟客户端生成小乌龟服务请求生成小乌龟 一、话题模型二、创建功能包三 创建客户端Client代码四 配置CMakeLists.txt编译规则:五 测试启动ros 主服务启动小乌龟的服务启动模型客户端服务 一、话题模型 Sever端是海龟仿真器/turtlesim,Client端是待实现…

leetcode:2485. 找出中枢整数(python3解法)

难度:简单 给你一个正整数 n ,找出满足下述条件的 中枢整数 x : 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中…

ChatGPT和API发生重大中断!

11月9日凌晨,OpenAI在官网发布,ChatGPT和API发生重大中断,导致全球所有用户无法正常使用,宕机时间超过2小时。 目前,OpenAI已经找到问题所在并进行了修复,但仍然不稳定,会继续进行安全监控。 …

3.前端调式

1. Elements 先来看这张图最上头的一行是一个功能菜单,每一个菜单都有它相应的功能和使用方法,依次从左往右来看 箭头按钮 用于在页面选择一个元素来审查和查看它的相关信息,当我们在Elements这个按钮页面下点击某个Dom元素时,箭…

[量化投资-学习笔记008]Python+TDengine从零开始搭建量化分析平台-CCI和ATR

目录 1. 指标简介CCIATR 2. 程序编写题外话 1. 指标简介 将这两个指标放在一起,一方面是因为这两个指标都属于摆动指数,可以反应市场的活跃度。 另一方面是因为CCI和ATR与之前提到的EMA,MACD,布林带的三个指标的计算基础不同。之前的三个指标都是以收盘…

Oracle迁移(RAC变单机模式)

1.升级内核 systemctl stop firewalld systemctl disable firewalldrpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepo"elrepo-kernel" list --showduplic…

【MySQL】手把手教你centos7下载MySQL

centos7下载MySQL 前言正式开始卸载不需要的环境(如果你之前没有安装过数据库相关的东西可以跳过)下载mysql登录mysql登陆⽅法⼀【不⾏就下⼀个】登陆⽅法⼆【不⾏就下⼀个】登录方式三 前言 安装和卸载MySQL都用系统的root权限,更方便一点&…

SQL优化之MySQL执行计划(Explain)及索引失效详解

1、执行计划基础 1.1、执行计划(Explain)定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语句,从而解析MySQL 是如何处理 SQL 语句的。 1.2、MySQL查询过程 客户端向 MySQL 服务器发送一条查询请求服务器首先检查查询缓存&am…

SecoClient接收返回码超时解决

第一步,Windows键进入"设置" 第二步,进入"更新与安全" 第三步,找到恢复,点击“高级启动”下的“立即重新启动”,重启电脑:(此时要记住以下步骤) 第四步,重启后选择“疑难解…

下定决心做增长了吗 ——《增长黑客》读后感1

关注我的公众号,并回复【增长黑客】可以获取我整理的《增长黑客》书籍大纲 前言 年中就看完《增长黑客》这本书了,收获还是蛮多的,但因为各种原因,导致我都没有好好做下总结。 前阵子做完总结之后,我就第一时间给组员…

真是性价比之王,腾讯云这款88元云服务器已经圈粉无数!

你是否曾经想过拥有一台属于自己的云服务器,但是却被高昂的价格和复杂的配置吓到了?现在,腾讯云推出了一款价格亲民、简单易用的88元云服务器,让你的梦想成为现实。腾讯云88元/年云服务器配置见下图: 腾讯云88元服务器…