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

部分内容来源:小林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 模块的报文根据「端口号」确定送给哪个应用程序处理

相关推荐
马优晨4 分钟前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
是真的小外套7 分钟前
第9章:网络层安全协议 IPSec 学习笔记
网络·网络协议·tcp/ip
熊哈哈O_o9 分钟前
260+异构同步链路:DDL语法自动翻译在大规模数据同步中的实现原理
后端
Baron X28 分钟前
Eclipse Temurin 21 (JRE) Alpine 镜像获取、离线导入与推送操作
java·docker·eclipse·temurin
云梦谭32 分钟前
WebSocket 协议详解:从 HTTP 握手到全双工通信
websocket·网络协议·http
用户98883218717437 分钟前
别把 IOptionsSnapshot 注入单例:从生命周期看 .NET 配置读取
后端
姜鱼问生38 分钟前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构
孙浩君41 分钟前
我用 Spring Boot + xterm.js 写了个终端风格互动叙事游戏引擎:游戏即文件,上传一个 JSON 就能玩
java
仿生joe会梦见漫天的大雪吗42 分钟前
CTF Misc 工具选型指南:按题型分类的工具、原理与限制
后端·安全
南丘山43 分钟前
一个 VARCHAR(1) 的字段,卡住了整条 DTU 数据链路
后端