当前位置: 首页 > news >正文

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 模块的报文根据「端口号」确定送给哪个应用程序处理

相关文章:

  • 关于“你对 Spring Cloud 的理解”
  • SpringBoot 中的 Redis 序列化
  • 【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建
  • DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略
  • 微信小程序细小知识累计记录
  • 1. HTTP 数据请求
  • 期权帮|国内期权交易投资人做卖出期权价差交易收取的保证金是单边的还是双向的?
  • SpringBoot3—快速入门
  • 大白话css第三章实践与提升
  • seacmsv9报错注入管理员账号密码,order by 注入,如何解决 information_schema关键字被过滤掉了
  • AF3 _make_msa_df函数解读
  • Java语言Leetcode中常用的一些基础语法
  • 【洛谷贪心算法题】P1094纪念品分组
  • (八)Java-Collection
  • Ray生产集群配置
  • 图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)
  • 目标检测YOLO实战应用案例100讲-面向无人机图像的小目标检测
  • 1.2.2 使用Maven方式构建Spring Boot项目
  • GPT1 与 GPT2 的异同
  • 数字内容体验案例分析的核心优势是什么?
  • 俄乌代表团抵达谈判会场
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 泰山、华海、中路等山东险企综合成本率均超100%,承保业务均亏损
  • 以军向也门3个港口的居民发布撤离令
  • 首次采用“顶置主星+侧挂从星”布局,长二丁“1箭12星”发射成功
  • 专访|茸主:杀回UFC,只为给自己一个交代