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

【传输层协议】UDP/TCP结构特点与原理(详解)

文章目录

  • 1. UDP
    • 1.1 UDP结构
    • 1.2 UDP特点
      • 1. 无连接
      • 2. 不可靠
      • 3. 面向数据报
      • 4. 缓冲区
      • 5. 大小受限
      • 6. 无序性
  • 2. TCP
    • 2.1 TCP结构
    • 2.2 TCP特点
      • 1. 有连接
      • 2. 可靠性
      • 3. 面向字节流
      • 4. 拥塞控制
      • 5. 头部开销
    • 2.3 TCP原理
      • 1. 确认应答(安全机制)
      • 2. 超时重传(安全机制)
      • 3. 连接管理(安全机制)
      • 4. 滑动窗口(效率机制)
      • 5. 流量控制(安全机制)
      • 6. 拥塞控制(安全机制)
      • 7. 延迟应答(效率机制)
      • 8. 捎带应答(效率机制)
    • 2.4 粘包问题

1. UDP

1.1 UDP结构

UDP

  • 2字节的长度表示整个数据报的最大长度(UDP首部+UDP数据)。
  • 校验和用来验证数据是否出错,出错就摒弃。
  • 首部8个字节。
  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
  • 校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。

1.2 UDP特点

1. 无连接

知道对方的端口和IP就可以直接传输不用建立连接。
这使UDP更加的轻量级,适用于一些实时性高的应用。

2. 不可靠

UDP没有任何安全机制,发送端发送数据报以后,如果因为网络错误发生错误,UDP协议层也不会给应用层返回任何错误信息。

3. 面向数据报

应用层给UDP多长的报文,就会发送多长的报文,并不会拆分合并。

4. 缓冲区

UDP并没有真正的发送缓冲区,具有接受缓冲区。
UDP的scoket既能读,又能写,所以是全双工

5. 大小受限

UDP协议首部有个16位的最大长度,所以一次最多传输64Kb,包括UDP首部。

6. 无序性

UDP不保证数据包的传输顺序,这对某些应用来说可能是一个缺点,但对其他应用来说,这样的特性可以提高性能。

2. TCP

2.1 TCP结构

TCP

  • 6位标志位:
    URG:紧急指针是否有效
    ACK:确认号是否有效
    PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
    FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段。

2.2 TCP特点

1. 有连接

通信双方通信前需要建立连接,知道对方的端口号和IP。

2. 可靠性

TCP提供可靠的数据传输,确保数据的完整性和顺序。主要通过确认应答。

3. 面向字节流

TCP是面向字节流的协议,而不是面向消息的。这意味着应用程序需要负责将数据分割为适当的消息或数据块,以便进行传输。

4. 拥塞控制

TCP拥有拥塞控制机制,它可以调整发送速率以避免网络拥塞。通过监控网络的延迟和丢包情况,TCP可以自动适应不同的网络条件。

5. 头部开销

TCP头部较大,包含序号、确认号、窗口大小等字段,因此在某些情况下可能引入较高的开销。

2.3 TCP原理

TCP相对UDP安全性提高,但是效率却降低了,所以TCP中引入了很多在保证安全的情况下提高传输效率。

1. 确认应答(安全机制)

TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。
确认应答就是对方收到消息后,给出回应,让对方知道你收到了。
每当一方收到数据包时,它会发送一个确认应答,通常包含了已经成功接收的数据的序号。这确保了数据的可靠传输,因为发送方会等待确认应答,以确定数据已经到达并且没有丢失。确认应答

2. 超时重传(安全机制)

当对方的回应你迟迟没有收到,当到达一定时间,可以重新发送一次。
当一方的数据包或者对方的确认应答在传输途中丢失,一定时间后会重新发送相同的数据包,直到收到确认应答。累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。
超时重传

3. 连接管理(安全机制)

正常情况下TCP要经过三次握手建立连接,四次挥手断开连接。

三次握手

三次握手
第一次握手:客户端向服务器发送一个特殊的TCP报文,这个报文中的SYN标志位被置为1,这个报文表示客户端希望建立连接。
第二次握手:服务器收到客户端的SYN报文后,需要确认建立连接。服务器会响应一个包含SYN和ACK标志位的报文。这个报文表示服务器同意建立连接。
第三次握手:客户端收到服务器的确认后,也要发送一个确认报文ACK。这个报文告诉服务器它已经收到了服务器的确认,连接建立完成。

四次挥手

四次挥手
第一次挥手:关闭方(通常是客户端)向另一方发送一个TCP报文,带有FIN标志位,表示它已经没有数据要发送,但仍愿意接收数据。这个报文开始了连接的关闭过程。
第二次挥手:接收方收到第一次挥手的报文后,它会发送一个ACK确认报文作为响应。表示接收方已经收到并确认了关闭方的FIN报文。
第三次挥手:接收方(通常是服务器)在确定没有更多数据要发送后,也会发送一个FIN标志的报文,通知对方它准备关闭连接。
第四次挥手:关闭方收到第三次挥手的报文后,也要发送一个ACK确认报文作为响应,以确认接收方的关闭请求。

4. 滑动窗口(效率机制)

上述传输数据时,每次发送一个数据,都需要等待ACK才能发送下一段数据,这样的效率并不高,性能较差,所以引入了滑动窗口。
如图:滑动窗口
我们可以一次发送多条数据,这样就能才等待时间重叠在一起,提高性能。
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节(四个段)。
发送前四个段的时候,不需要等待任何ACK,直接发送;
收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;
操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;
窗口越大,则网络的吞吐率就越高;
丢包处理

  1. 丢了ACK
    这种情况下,如果前面的部分ACK丢失,只要接受到后面的ACK,依然可以确认应答。
    丢ACK
  2. 丢了数据包
    当某一段报文段丢失之后,发送端会一直收到 1001 这样的ACK,就像是在提醒发送端 “我想要的是 1001” 一样;
    如果发送端主机连续三次收到了同样一个 “1001” 这样的应答,就会将对应的数据 1001 - 2000 重新发送;
    这个时候接收端收到了 1001 之后,再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中;
    这种机制被称为 “高速重发控制”(也叫 “快重传”)。
    丢数据包

5. 流量控制(安全机制)

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制
TCP通过流量控制机制来管理数据传输,以确保发送方不会发送过多的数据,从而导致接收方无法处理或网络拥塞。流量控制的主要目标是防止数据包的丢失和网络拥塞。以下是TCP流量控制的关键概念和工作原理:

  1. 窗口机制:TCP使用窗口机制来进行流量控制。接收方会告诉发送方它可以接收多少数据,这个信息被称为"接收窗口大小"(Receiver
    Window Size)。

  2. 滑动窗口:发送方维护一个发送窗口,它表示当前可以发送的数据量。这个窗口的大小受到接收方的接收窗口大小和网络条件的影响。

  3. 通告窗口大小:接收方会在TCP报文中通告当前的接收窗口大小,发送给发送方。这告诉发送方可以发送多少数据,以避免过载接收方。

  4. 动态调整窗口大小:接收方可以根据自身处理能力和可用内存动态调整接收窗口大小。如果接收方无法及时处理数据,它可以减小窗口大小,通知发送方降低发送速率。

  5. 流量控制的目的:流量控制的主要目的是防止发送方发送过多数据,从而导致接收方缓冲区溢出,数据丢失,或网络拥塞。通过维护适当的接收窗口大小,TCP可以确保发送和接收之间的数据传输协调顺畅。

  6. 自适应机制:TCP的流量控制是自适应的,它可以根据网络状况进行调整。如果网络拥塞,接收方可以减小窗口大小,发送方会相应降低发送速率,从而减轻网络负担。

6. 拥塞控制(安全机制)

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。
因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。
TCP引入慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

拥塞控制

7. 延迟应答(效率机制)

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;
规则
数量限制:每隔N个包就应答一次;
时间限制:超过最大延迟时间就应答一次
具体的数量和超时时间,依操作系统不同也有差异;一般N取2,超时时间取200ms;

8. 捎带应答(效率机制)

在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 “一发一收” 的。意味着客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine, thank you”;
那么这个时候ACK就可以搭顺风车,和服务器回应的 “Fine,thank you” 一起回给客户端

2.4 粘包问题

首先要明确,粘包问题中的 “包” ,是指的应用层的数据包。
在TCP的协议头中,没有如同UDP一样的 “报文长度” 这样的字段,但是有一个序号这样的字段。
站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。
站在应用层的角度,看到的只是一串连续的字节数据。
那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包。
那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界。

  1. 对于定长的包,保证每次都按固定大小读取即可;例如上面的Request结构,是固定大小的,那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
  2. 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
  3. 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定的,只要保证分隔符不和正文冲突即可);

对于UDP协议来说,是否也存在 “粘包问题” 呢?
对于UDP,如果还没有上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交付给应用层。就有很明确的数据边界。
站在应用层的站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收。不会出现"半个"的情况。

相关文章:

【传输层协议】UDP/TCP结构特点与原理(详解)

文章目录 1. UDP1.1 UDP结构1.2 UDP特点1. 无连接2. 不可靠3. 面向数据报4. 缓冲区5. 大小受限6. 无序性 2. TCP2.1 TCP结构2.2 TCP特点1. 有连接2. 可靠性3. 面向字节流4. 拥塞控制5. 头部开销 2.3 TCP原理1. 确认应答(安全机制)2. 超时重传&#xff08…...

哪种网站适合物理服务器

哪种网站适合物理服务器 看到独立服务器这一词语,相信大家脑海立马就浮现出了它的种种优势,但是有优势就伴随着也有一定的弊端,比如说它的空间大、特殊的的组件配置,权限配置等,但是成本却非常的高,那么我…...

uni-app集成使用SQLite

一、打开uni-app中SQLite 二、封装sqlite.js module.exports {dbName: chat, // 数据库名称dbPath: _doc/chat.db, // 数据库地址,推荐以下划线为开头 _doc/xxx.db/*** Description: 创建数据库 或 有该数据库就打开* author: ZXL* createTime: 2023-10-12 09:23:10* Copyr…...

Qt不能安装自己想要的版本,如Qt 5.15.2

使用在线安装工具安装Qt5.15.2时,发现没有Qt 5的相关版本,只有Qt 6的版本,这时选择右边的Archive,再点击筛选,这时就会出现之前的Qt版本。...

学信息系统项目管理师第4版系列28_组织级项目管理和量化项目管理

1. OPM 1.1. 旨在确保组织开展正确项目并合适地分配关键资源 1.1.1. 有助于确保组织的各个层级都了解组织的战略愿景、实现愿景的措施、组织目标以及可交付成果 1.2. 业务评估是建立OPM框架的必要组件 1.3. OPM3 是组织级项目管理成熟度模型,可用于评估组织项目…...

Bean实例化的三级缓存

在Spring框架中,Bean实例化的三级缓存(三级缓存也称为三级缓存机制)是用于缓存Bean定义的一种机制,用于管理和加速Spring容器中Bean的创建和初始化过程。三级缓存包括了singletonObjects、earlySingletonObjects 和 singletonFact…...

Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行 ​ 上一篇内容中使用Jenkins(运行服务器)Gitlab(代码存储库)Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。 ​ 那么假如有这样一个场景:需要把不同技术栈的项目部署到同一台服务器上运行。比如PH…...

Web前端-Vue2+Vue3基础入门到实战项目-Day4(组件的三大组成部分, 组件通信, 案例-组件版小黑记事本, 进阶语法)

Web前端-Vue2Vue3基础入门到实战项目-Day4 组件的三大组成部分(结构/样式/逻辑)scoped样式冲突data是一个函数 组件通信组件通信语法父传子子传父props详解什么是propsprops检验props与data的区别 非父子(扩展)事件总线 (event bus)provide - inject 案例 - 小黑记事本(组件版)…...

【大模型应用开发教程】01_大模型简介

C1 大模型简介 一. 什么是LLM(大语言模型)?1. 发展历程2. 大语言模型的概念LLM的应用和影响 二、大模型的能力和特点1. 大模型的能力1.1 涌现能力(emergent abilities)1.2 作为基座模型支持多元应用的能力1.3 支持对话…...

Flume 简介及基本使用

1.Flume简介 Apache Flume 是一个分布式,高可用的数据收集系统。它可以从不同的数据源收集数据,经过聚合后发送到存储系统中,通常用于日志数据的收集。Flume 分为 NG 和 OG (1.0 之前) 两个版本,NG 在 OG 的基础上进行了完全的重构…...

行业追踪,2023-10-11

自动复盘 2023-10-11 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…...

HTTP中的GET方法与POST方法

1、GET 和 POST方法之间的区别 根据 RFC 规范,GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCI…...

2023年10月16日-10月22日,(光追+ue+osg继续按部就班进行即可。)

根据月计划, 本周计划如下: 2023年10月16日-10月22日,光追10.7-10.13,ue rpg(p47-p53),ue5底层渲染01A19-01B4,osg29,osg30,filament文档每天看 落实到天就是 2023年10月16日光追10.7,ue rpg(p47),ue5底层渲染01A19,o…...

【Docker】命令使用大全

【Docker】命令使用大全 目录 【Docker】命令使用大全 简述 Docker 的主要用途 基本概念 容器周期管理 run start/stop/restart kill rm pause/unpause create exec 容器操作 ps inspect top attach events logs wait export port 容器 rootfs 命令 c…...

查找算法:二分查找、插值查找、斐波那契查找

二分查找 查找的前提是数组有序 思路分析 代码实现 # 二分查找(递归法实现) # 找到一个相等的值就返回该值的下标 def binary_search(arr: list, find_val: int, left: int, right: int):mid (left right) // 2 # 寻找数组中间位置的下标if left &…...

python+django高校教室资源预约管理系统lqg8u

技术栈 后端:pythondjango 前端:vueCSSJavaScriptjQueryelementui 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyChar…...

Potato靶机

信息搜集 设备发现 扫描端口 综合扫描 开放了80端口的HTTP服务和7120端口的SSH服务 目录扫描 扫描目录 看看这个info.php,发现只有php的版本信息,没有可以利用的注入点 SSH突破 hydra 爆破 考虑到 7120 端口是 ssh 服务,尝试利用 hydra …...

【环境搭建】linux docker-compose安装gitlab和redis

gitlab需要redis,一起安装了 新建gitlab和redis挂载目录 mkdir -p /data/docker/redis/data mkdir -p /data/docker/redis/logs mkdir -p /data/docker/redis/confmkdir -p /data/docker/gitlab/data mkdir -p /data/docker/gitlab/logs mkdir -p /data/docker/gi…...

JAVAEE初阶相关内容第十三弹--文件操作 IO

写在前 终于完成了!!!!内容不多就是本人太拖拉! 这里主要介绍文件input,output操作。File类,流对象(分为字节流、字符流) 需要掌握每个流对象的使用方式:打…...

POI报表的高级应用

POI报表的高级应用 掌握基于模板打印的POI报表导出理解自定义工具类的执行流程 熟练使用SXSSFWorkbook完成百万数据报表打印理解基于事件驱动的POI报表导入 模板打印 概述 自定义生成Excel报表文件还是有很多不尽如意的地方,特别是针对复杂报表头,单…...

【计算机毕设选题推荐】超市管理系统SpringBoot+SSM+Vue

前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的超市管理系统 技术栈 SpringBootVueMySQLMaven 文章目录 一、超市管理系统…...

【算法1-4】递推与递归-P1002 [NOIP2002 普及组] 过河卒

## 题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#…...

浅谈压力测试的作用是什么

随着现代应用程序变得越来越复杂,用户的期望也在不断提高,对性能和可靠性的要求变得更加苛刻。在应用程序开发和维护的过程中,压力测试是一项至关重要的活动,它可以帮助发现潜在的问题、评估系统的性能极限,以及确保在…...

互联网Java工程师面试题·Java 总结篇·第一弹

目录 1、面向对象的特征有哪些方面? 2、访问修饰符 public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f3.4;是否正确? 5、short s1 1; s1 s1 1;有错吗…...

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件,拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后,在你需要读取的地方进行写代码, //定义开始读取的行数 //这里设为2,是因为第一行是数据名称 int row12; //读取excel文件信…...

茶百道全链路可观测实战

作者:山猎 茶百道是四川成都的本土茶饮连锁品牌,创立于 2008 年 。经过 15 年的发展,茶百道已成为餐饮标杆品牌,全国门店超 7000 家,遍布全国 31 个省市,实现中国大陆所有省份及各线级城市的全覆盖。2021 …...

Java-JDBC

JDBC JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API 根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底…...

【ROS】Nav2源码之nav2_planner详解

【ROS】郭老二博文之:ROS目录 1、简述 nav2_planner是路径规划器,把起始位置、姿势的信息输入nav2_planner模块,将会生成可行路径。 nav2_planner路径规划器和nav2_controller控制器相似,也使用插件的形式加载不同的路径规划器。 常用的路径规划器插件有: 1)NavFn Plan…...

mysql报SQLSTATE[22007]的错误的一个原因

最近在修改一个程序,打算将$video这个参数保存到数据库。修改的过程中出现错误。导致该程序不能发布新文章。在程序的一个db.php程序文件里使用var_dump($input, $stmt) ; 语句看到了错误信息,并找到了错误原因。信息里包含的错误代码是: SQ…...

毕设 做网站/上海网站排名seo公司

Gallery组件主要用于横向显示图像列表,不过按常规做法。Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了。这虽然在大多数时候没有什么关系…...

天津网站设计/google付费推广

电脑公司GhostXPSP3快速装机海量驱动2012 文件名: DNGS_GHOSTXPSP3_V201206_NTFS.iso 大小: 870.54 MB MD5: 38972d1eed6c91214e3f3607a8806c0f SHA1: f02b9980941dde06dcfb9cda635f89f7dc554b64 ghost xp sp3 纯净版 http://siaina.cn 系统格式:NTFS光盘类型&…...

图片站wordpress模板下载/免费网页在线客服系统代码

20172303 2018-2019-1 《程序设计与数据结构》第1周学习总结 教材学习内容总结 第1章 概述 1.软件工程 定义:一门关于高质量软件开发的技术和理论的学科。目标:软件工程的目标与其他工程学科类似 解决正确性问题————客户所需实现的需求按时且在预算之…...

wordpress支付配置/seo文章外包

问题:jsonsql中文排序不支持首先需要判断传入字符串是否含有中文,正则啥的,大家随便上吧然后需要对中文增加一条localeCompare的规则紧接着,高潮~需要把中文转换成拼音(要不你说怎么搞?)用拼音做排序,这里需…...

一般用什么做网站首页/中小型企业网站设计与开发

迁移表空间databump使用databump导入导出,两个库用户必须一致,否则另一个库导入的时候会报错。所以两个库都是用helei用户。给两个数据库的用户分别授予dba权限,这里只是实验更清晰而已。SQL> create user helei identified by MANAGER;Us…...

wordpress前端编辑器/网站制作推广

运行-〉regedit 打开下面两个位置,根据名称找出要删除的程序右键菜单。 1.[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers]...所有文件的右键;2.[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers]...文件夹的右键; 要是不放心可…...