TCP基本入门-简单认识一下什么是TCP

ops/2025/3/1 3:10:23/

部分内容来源:小林Coding


TCP的特点

1.面向连接

一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的

2.可靠的

无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端

3.字节流

用户消息通过 TCP 协议传输时,消息可能会被操作系统“分组”成多个的 TCP 报文,如果接收方的程序如果不知道“消息的边界”,是无法读出一个有效的用户消息的。

并且 TCP 报文是“有序的

当“前一个” TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能够给应用层去处理

同时对“重复”的 TCP 报文会自动丢弃


什么是TCP连接

简单来说就是

用于保证可靠性和流量控制维护的某些状态信息

这些信息的组合包括 Socket、序列号和窗口大小称为连接

所以我们可以知道,建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识。

  • Socket:由 IP 地址端口号组成
  • 序列号:用来解决乱序问题
  • 窗口大小:用来做流量控制

如何唯一确定一个TCP连接呢

TCP 四元组可以唯一的确定一个连接,四元组包括如下:

1.源地址

2.源端口

3.目的地址

4.目的端口

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

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


有一个 IP 的服务端监听了一个端口,它的 TCP 的最大连接数是多少? 

服务端通常固定在某个本地端口上监听,等待客户端的连接请求。

因此,客户端 IP 和端口是可变的,其理论值计算公式如下:

最大 TCP 连接数 = 客户端的 IP 数 X 客户端的端口数

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

当然,服务端单机能发 TCP 连接数能达到理论上的上限,会受以下因素影响:

文件描述符限制:每个 TCP 连接都是一个文件,如果文件描述符被占满了,会发生 Too many open files。Linux 对于打开的文件描述符数量分别作了三个方面的限制:

系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看;用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看;进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看。

内存限制:每个 TCP 连接都会占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生 OOM


UDP和TCP有什么区别?分别应用场景是?

1.连接

TCP是面向连接的传输层协议,传输数据前要先建立连接

UDP是不需要建立连接的,即刻传输数据

2.服务对象

TCP是一对一的两点服务,即一条连接只有两个端点

UDP支持一对一,一对多,多对多的交互通信

3.可靠性

TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。

UDP 是尽最大努力交付,不能保证可靠交付数据。

4.拥塞控制、流量控制

TCP 有拥塞控制流量控制机制,保证数据传输的安全性

UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率(因为根本不在意发送成功不成功,所以我们速率不用变)

5.首部开销

TCP 首部较长较复杂,会有一定的开销,首部在没有使用【选项】字段时是 20 个字节,如果使用了【选项】字段则会变长的。

UDP 首部只有 8 个字节,并且固定是不会变的,开销较小。

6.传输方式

TCP 是面向连接,没有边界,但保证顺序和可靠

UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序

7.数据分片所在的层不同

TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。

UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层


TCP和UDP可以使用同一个端口吗

可以

所以,传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包。

传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块

当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理


http://www.ppmy.cn/ops/162119.html

相关文章

冒泡排序:简单又易于实现的排序算法

大家好,今天我们来聊聊 冒泡排序(Bubble Sort)算法。听名字是不是很简单,感觉就像是水面上泡泡一样?没错,冒泡排序的名字来源于这种排序过程中,较大的元素像气泡一样逐步“冒泡”到数组的顶端。…

一文掌握ADSL拨号代理的搭建方法,及详细使用

文章目录 1. 准备工作1.1 硬件和网络要求1.2 软件要求2. ADSL 拨号配置2.1 在 Linux 系统中配置 ADSL 拨号2.2 在 Windows 系统中配置 ADSL 拨号3. 搭建代理服务器3.1 安装 Squid3.2 测试代理4. 实现 ADSL 拨号代理4.1 自动拨号脚本4.2 代理 IP 轮换5. 结合爬虫使用5.1 在 Requ…

常见后端开发面试问题(持续更新)

mysql为什么采用B+树作为索引? 首先,B+树相比于B树来说非叶子节点上只有索引没有数据,数据都在叶子节点,就使其非常适合进行范围查询。因为对于Mysql这种数量级非常大的数据来说可以减少磁盘的I/O次数,同时其在叶子节点添加的有指针,可以更加快速的进行查找。平均查找时…

HTML邮件的制作以及可能遇到的问题

HTML 邮件制作方法 规划结构:通常由头部、主体和尾部构成。头部含发件人信息、主题等元数据;主体是核心,有文本、图片、链接等;尾部有版权信息、联系方式等。编写代码: 布局:优先用 table 布局,…

算法与数据结构(二叉树中的最大路径和)

题目 思路 这道题我们可以考虑用递归来解决。 首先设计一个maxPath函数用来递归计算二叉树中一个节点的最大贡献值,具体来说,就是以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。 如果该节点为空&a…

docker和k8s

1. docker的几种网络模式 1.1. bridge模式(默认) container有自己的ip,它的ip映射到主机的docker0这个虚拟网卡上,它们能访问外网,外网不能访问它们(外网要访问,可以加通过端口映射&#xff0…

【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一)

【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一) 缓冲区是操作系统和 Java 运行时环境(JVM)内部的一个机制,你无法直接看到它,因为它是由操作系统和 JVM 管理…

Scala Trait(特征)

Scala Trait(特征) Scala 语言作为一种多范式编程语言,结合了面向对象和函数式编程的特性。在 Scala 中,Trait 是一种非常灵活的抽象机制,类似于 Java 中的接口和 C++ 中的类混合。本文将详细介绍 Scala 中的 Trait,包括其定义、使用方法以及与类的关系。 什么是 Scala…