TCP 和 UDP 的区别:解析网络传输协议
引言
在计算机网络的世界中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种极为重要且应用广泛的传输层协议。它们在功能、特性以及适用场景等诸多方面存在着明显的区别,下面我们就来详细探讨一下这两者之间的差异。
一、基本概念
TCP
TCP 是一种面向连接的、可靠的、基于字节流的传输层协议。它就如同在网络通信的两端建立起了一条虚拟的 “管道”,在数据传输之前,需要先通过三次握手来建立连接,确保通信双方都已经准备就绪,能够进行稳定的数据交互。在传输过程中,TCP 会对发送的数据进行编号、确认、重传等一系列操作来保证数据能够准确无误地从发送端到达接收端。而且,数据是按照顺序依次接收的,接收端会将接收到的数据按照发送的顺序重新组装起来,就好像把打乱的拼图块按正确顺序拼接完整一样。当数据传输完毕后,还会通过四次挥手来优雅地断开连接。
UDP
UDP 则是一种无连接的、不可靠的、基于数据报的传输层协议。它不需要像 TCP 那样事先建立连接,发送端可以随时向网络中发送数据报,就好比在人群中随意喊话,并不提前确认对方是否在听或者准备好了接收信息。UDP 也不会对数据报进行编号、确认和重传等操作,数据报有可能会在传输过程中丢失、重复或者乱序到达接收端,接收方收到的数据报就是发送方发送时的原样,并不会去整理顺序等,所以使用 UDP 传输数据时并不能保证数据一定能完整无误地被接收。
二、可靠性对比
TCP 的可靠性保障
- 确认机制:TCP 每发送一段数据,都会等待接收方发送回确认信息(ACK),只有收到了对应的数据确认,发送方才会继续发送下一部分数据,这样能确保每一个字节的数据都被对方正确接收了。例如,你发送一份重要文件,接收方每收到一部分都会回复说 “这部分我收到了,可以发下一部分了”,这样就保证了文件完整传输。
- 重传机制:如果发送方在一定时间内没有收到接收方的确认消息,就会认为该部分数据可能丢失了,进而会重新发送这部分数据,以此来应对网络中可能出现的数据丢失情况,最大限度地保证数据的完整性。
- 顺序保障:接收端会按照数据的编号顺序来整理接收到的数据,保证数据是按照发送的顺序依次排列的,不会出现混乱的情况,就像我们按照页码顺序阅读一本书一样,保证内容的连贯性。
UDP 的不可靠性表现
由于 UDP 没有上述的确认、重传以及顺序保障机制,所以它无法确保数据一定能准确无误地到达接收端。例如,在实时视频流传输中使用 UDP 时,偶尔出现一两个画面的数据丢失,可能只是画面短暂的卡顿或者花屏,但后续的数据依然在继续传输,它更注重实时性而不是数据的绝对完整可靠。
三、连接特性对比
TCP 的面向连接特性
TCP 在通信之前,必须通过三次握手的过程来建立连接。发送方首先发送一个带有 SYN(同步序列号)标志的数据包,表示希望建立连接;接收方收到后回复一个 SYN + ACK 的数据包,表示同意建立连接并对发送方进行确认;最后发送方再回复一个 ACK 数据包,至此连接正式建立。在通信结束后,还需要经过四次挥手来断开连接,整个过程就像是打电话,先拨号建立通话线路(三次握手),通话结束后挂断电话(四次挥手),这种面向连接的方式使得通信过程更加有序和可靠,但同时也带来了一定的开销,比如建立和断开连接时占用的时间和网络资源。
UDP 的无连接特性
UDP 不需要建立连接就可以直接发送数据,就像发传单一样,不管对方有没有准备好,直接把传单(数据报)发出去就行。这种方式使得 UDP 在发送数据时非常迅速,能够快速地将数据投送到网络中,尤其适用于那些对实时性要求极高、偶尔丢失一点数据也不影响整体功能的应用场景,比如实时的在线游戏操作指令发送等,操作指令更注重快速送达让游戏及时响应,而不是绝对保证每个指令都一定被接收。
四、数据传输形式对比
TCP 的字节流传输
TCP 把要传输的数据看作是一连串的字节,这些字节按照顺序依次传输,接收端也是按照字节流的顺序来进行组装和解读数据。例如,发送端发送一段文字信息,接收端会根据字节的先后顺序完整地还原出这段文字内容,就像用线穿珠子一样,珠子按照顺序串起来形成完整的一串项链(完整的数据)。
UDP 的数据报传输
UDP 是以数据报为单位来进行传输的,每个数据报都是独立的个体,有自己固定的格式和大小限制等,发送端发送的数据报在网络中是各自独立传输的,接收端收到的数据报也是独立存在的,不会像 TCP 那样将它们组装成连续的字节流,更像是一个个单独的包裹被分别投递和接收。
五、首部开销对比
TCP 首部
TCP 的首部相对比较长,一般为 20 字节(如果有选项字段会更长),它包含了很多用于实现可靠传输、流量控制、连接管理等功能的字段,比如源端口、目的端口、序列号、确认号、首部长度、标志位(如 SYN、ACK、FIN 等)、窗口大小、校验和、紧急指针等。这些字段虽然有助于保证数据传输的质量和连接的有效管理,但也使得 TCP 首部在传输时占用了一定的网络带宽和资源。
UDP 首部
UDP 的首部则比较简洁,仅仅只有 8 个字节,包含源端口、目的端口、长度和校验和这几个基本字段。因为 UDP 不需要像 TCP 那样复杂的功能支持,所以其首部开销很小,能更高效地利用网络带宽来传输数据本身,尤其适合那些对数据量传输效率要求较高且对可靠性要求不是特别严格的场景。
六、适用场景对比
TCP 的适用场景
- 文件传输:例如通过 FTP(文件传输协议)来传输大文件时,需要确保文件的每一个字节都准确无误地到达目的地,TCP 的可靠性保障能很好地满足这一需求,避免文件出现损坏、丢失数据等情况。
- 网页浏览:当我们在浏览器中访问网页时,浏览器使用 HTTP(超文本传输协议),而 HTTP 通常是基于 TCP 协议的,这样能保证网页的 HTML、CSS、图片等各种资源完整且有序地传输过来,让我们看到完整、正确的网页页面。
- 电子邮件传输:像 SMTP(简单邮件传输协议)、POP3(邮局协议版本 3)等用于电子邮件收发的协议大多也是基于 TCP 的,保证邮件内容准确地从发件人发送到收件人的邮箱中,不会出现邮件内容丢失或者错乱的情况。
UDP 的适用场景
- 实时视频和音频流传输:如在线直播、视频会议等场景,虽然偶尔丢失一些视频帧或者音频片段可能会稍微影响观看体验,但更重要的是要保证实时性,让画面和声音能够及时传递给观众,UDP 的快速传输和低延迟特性就很适合这类应用,即使有少量数据丢失也不会对整体的实时播放造成严重破坏。
- 实时在线游戏:在游戏中玩家发送操作指令时,需要指令能快速送达服务器以便游戏能立即做出响应,稍微的指令丢失可以通过游戏自身的一些机制来弥补(比如角色位置的快速调整等),所以 UDP 能更好地满足游戏对实时操作响应的要求。
- 域名系统(DNS)查询:当我们在浏览器中输入网址后,计算机需要通过 DNS 来查询对应的 IP 地址,这个查询过程一般使用 UDP,因为 DNS 查询通常数据量较小,而且更注重快速得到结果,偶尔的查询失败可以通过再次发起查询来解决,UDP 的高效传输能加快查询速度。
综上所述,TCP 和 UDP 作为网络传输层的两大重要协议,各有其独特的优缺点和适用场景。在实际的网络应用开发和部署中,需要根据具体的业务需求来选择合适的协议,以便在可靠性、实时性、资源利用等多个方面达到最佳的平衡,确保网络通信的高效与顺畅
相关文章:
TCP 和 UDP 的区别:解析网络传输协议
引言 在计算机网络的世界中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种极为重要且应用广泛的传输层协议。它们在功能、特性以及适…...

【已解决】pyinstaller打包ico图片报错:OSError: [WinError 225] 无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。
起因: pyinstaller加上 --icon 参数打包时报错。 命令如下: 解决: 关闭 Windows 的病毒防护即可,步骤如下。 点屏幕右下角通知栏,进入“病毒和威胁防护”: 打开: 关闭实时保护(…...

SpringBoot项目配置文件的优先级
从外部讲 内部讲 所以优先级是:外部的config里的application.yml最高 然后是外部与jar包同目录下的application.yml 再到内部的classpath下config下的application.yml 最后到classpath下的application.yml 最后来个优先级最高的 启动时候 指定spring.config.location…...
JS中类型化数组(Typed Arrays)详解和常见应用场景
在JavaScript中,类型化数组(Typed Arrays) 是用于处理二进制数据的对象。它们允许我们以一种高效的方式操作和存储大量的数值数据,特别适合处理类似于图像、音频、视频等场景的原始二进制数据。 类型化数组的基本概念 类型化数组…...

虚幻引擎是什么?
Unreal Engine,是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计,但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏,现在也用于电影的虚拟制片…...

LabVIEW生物医学信号虚拟实验平台
介绍了一款基于LabVIEW的多功能生物医学信号处理实验平台的设计和实现。平台通过实践活动加强学生对理论的理解和应用能力,特别是在心电图(ECG)和脑电图(EEG)的信号处理方面。实验平台包括信号的滤波、特征提取和频谱分析等功能,能直观体验和掌握生物医学…...

【软件工程】十万字知识点梳理 | 期末复习专用
原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…...
Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
1.RemoteCallbackList vs ArrayList RemoteCallbackList 是一个特殊的 List,它用来管理跨进程的回调,特别是当回调对象是在不同进程中时。它在 AIDL(Android Interface Definition Language)通信中常常用来处理跨进程的通信。 Arr…...

ADC(二):外部触发
有关ADC的基础知识请参考标准库入门教程 ADC(二):外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…...

数仓开发那些事(8)
程序员圣经 为什么刚刚能运行,现在就不行 为什么刚刚不运行,现在就可以 为什么他的可以跑,我的不能跑 为什么我的可以跑,他的就不行 为什么这台电脑能,那台就不行 为什么这台电脑不行,那台就行 神州员工&a…...

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...

【连续学习之ResCL算法】2020年AAAI会议论文:Residual continual learning
1 介绍 年份:2020 会议: AAAI Lee J, Joo D, Hong H G, et al. Residual continual learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 4553-4560. 本文提出的算法是Residual Continual Learning (ResC…...
【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...

数据流图和流程图的区别
在结构化建模中,数据流图和流程图都是非常重要的工具,它们为开发人员提供了强大的手段来分析和设计系统。尽管两者在表面上看起来有些相似,但它们在功能、用途和表达方式上存在显著的区别。本文将详细探讨数据流图和流程图的区别,…...

关于内网服务器依托可上网电脑实现访问互联网
关于内网服务器依托可上网电脑实现访问互联网 背景:在实验室内网的一个服务器,没有配置 NAT ,无法使用外网,只能在局域网内进行访问,但是呢,我们自己的电脑是可以访问互联网的,那么怎么通过让自…...

期权懂|期权入门知识:如何选择期权合约?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 期权入门知识:如何选择期权合约? 一、选择月份: 通常情况下,月份的选择与期货合约的选择类似,主要关注主力合约。主力…...

如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码
如何用gpt来分析链接里面的内容,方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里:发现正确识别和分析了链接里面的内容 链接如下:https://arxiv.org/pdf/2009.1…...

Bash 脚本教程
注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…...
Pinia最简单使用(vite+vue3)
文章目录 创建项目安装Pinia包main.js注册Pinia在src下创建store/store.js文件,放入以下内容在app.vue中的使用(在其他组件也一样的) 创建项目 npm create vitelatest my-vue-app选vue 选JavaScript cd my-vue-app npm install npm run dev安装Pinia包 npm install piniamain…...

计算机网络——期末复习(4)协议或技术汇总、思维导图
思维导图 协议与技术 物理层通信协议:曼彻斯特编码链路层通信协议:CSMA/CD (1)停止-等待协议(属于自动请求重传ARQ协议):确认、否认、重传、超时重传、 (2)回退N帧协…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...