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

UDP与TCP

用UDP一定比用TCP快吗?

假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。

对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到,就像打电话一样,只要“喂喂"两下对方就能回你个"hi hi"你就知道对方有没有在听

UDP就像是给邮政的信箱寄信一样,你寄出去的信根本就不知道对方有没有正常收到丢了也是有可能的

可以通过创建socket的方式来选择使用TCP还是UDP 

fd = socket(AF_INET,SOCK_STREAM,0):是指使用字节流传输数据,就是TCP协议

fd = socket(AF_INET,SOCK_DGRAM ,0):是指使用数据报传输数据,就是UDP协议

返回的FD是指socket句柄,可以理解为socket的身份证号,这时候根据协议的不同还要执行一些操作,如果一切顺利就可以开始传输消息,如果不顺利,比如消息发到一半丢包了,那UDP和TCP的态度就不太一样了。

  • UDP:管我什么事
  • TCP(可靠性):是不是发的太快了,是不是链路太堵了,不过放心会重发的。

TCP为了保证可靠性:

重传机制:TCP会给发出的消息打上一个编号,也就是sequence,接收方收到后回一个确认ack包,发送方可以通过ack的数值知道接收方收到了哪些sequence的包,如果长时间等不到对方的确认TCP就会重新发送消息这就是所谓的重传机制,重传对性能影响比较严重,是下下策。

TCP就需要思考怎么尽量避免重传,因为数据发送方和接收方处理数据能力可能不同,以此可以根据双方的能力去调整发送的数据量就好了,就有了发送和接收窗口

接收方当前能接收的数据量大小TCP根据窗口的大小去控制自己发送的数据量,这样就能大大减少丢包的概率比如一开始窗口大小为2。

收到一个数据包之后窗口就变成了1,此刻只能再收一个数据包。

当接收窗口变为0时,也就是所谓的0窗口,此时发送端停止发送数据接收方接收到数据之后会不断处理,处理能力也不是一成不变的,有时候处理的快一些就可以多收点数据,处理的慢点,就希望对方能少发点数据,像这种根据自身能力不断调整窗口的机制就是所谓的滑动窗口机制

通过滑动窗口机制TCP实现了流量控制,但这还不够,有时候发生丢包并不是因为发送方和接收方的处理能力问题导致的而是跟网络环境有关,将网络想象为一条公路,马路上可能堵满了别人家的车只留下三辆车的空间,你也没办法同时上路

TCP希望能感知到外部网络环境根据网络环境及时调整自己的发包数量,但外部环境这么复杂,TCP是怎么感知到的呢?

TCP会先慢慢试探的发数据,不断加码,数据量越发越多,先发一个,再发两个,再发四个,直到出现丢包,这样TCP就知道当前网络大概吃得消几个包了,这就是所谓的拥塞控制机制

流量控制和拥塞控制的关系

  • 流量控制:针对的是单个连接数据处理能力的控制
  • 拥塞控制:针对的是整个网络环境数据处理能力的控制

都是怎么降低重传的概率,降低带来的影响

当我们需要发送一个超大的数据包时,如果数据包丢了就得重传同样大的数据包

但如果将其分成一小段一小段,就算丢了也就只需要传那一小段就好了,大大减少了重传的压力

这就是TCP的分段机制

所谓一小段的机制在传输层叫MSS(maximum segment size),数据包长度大于MSS,则会分成n个小于等于MSS的包

如果数据包还大于MTU(maximum transmit unit):还会继续分包

一般情况下MSS等于MTU减去40 byte

所以TCP分段后到了IP层大概率就不会再分片了,既然数据包会被分段,链路又这么复杂还会丢包,那么数据包乱序也就显得不奇怪了。

乱序的问题TCP也考虑到了:依靠数据包的sequence,接收方就能知道数据包的先后顺序,后发的数据包先到就先放到专门的乱序队列中等数据都到齐后 重新整理好数据包顺序后再给到用户,这就是乱序重排机制

网络环境列路很长还复杂,数据丢包是很常见的,平常用TCP做各种数据传输完全对这些事情无感知

TCP三大特性:

UDP没有这么多复杂的特性所以很快

这就是大部分人认为UDP比TCP快的原因,实际大部分情况下确实是这样

有没有用了UDP但却比TCP慢的情况

UDP的用途,大部分人不会尝试直接拿裸UDP放到生产环境中去做项目

UDP的价值:本质是内核提供的一个最小网络传输功能,很多时候,都号称自己用了UDP,但实际上都很忌惮他的丢包问题,所以大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证,某些游戏为了追求低延迟,不同程度使用了UDP,比如王者农药(KCP)

适合用于音视频传输,因为这些场景允许丢包

虽然选择了使用UDP,但是还是会在这一基础上做一些重传机制

如果现在需要传一个特别大的数据包,在TCP内部会根据MSS的大小分段这时候进入到IP层之后每个包大小都不会超过MTU,因此IP层一般不会再进行分片,这时候发生丢包只需要重传每个MSS分段就够了。

但对于UDP本身并不会分段,如果数据过大到了IP层就会进行分片,此时发生丢包再次重传就会重传一整个大数据包,对于上面这种情况使用UDP就比TCP慢

解决起来也不复杂:如果使用UDP的应用层也实现了分段机制就不会出现上述的问题。

相关文章:

UDP与TCP

用UDP一定比用TCP快吗? 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。 对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到,就像打电话一样,只要“喂喂"两下对方就能回你个…...

Web开发技术概述

Web开发技术涵盖了前端和后端开发,以及数据库技术。前端开发包括使用HTML、CSS、JavaScript等原生技术,以及jQuery、Bootstrap、AngularJS、React、Vue等框架。后端开发则涉及ASP.NET、PHP、Python Web(Flask、Django)、Java Web&…...

解压rar格式的软件有哪些?8种方法(Win/Mac/手机/网页端)

RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而&#xf…...

uniapp开发:首次进入 App 弹出隐私协议窗口

前言:在移动应用开发中,隐私协议弹窗是一个非常重要的功能。它不仅符合法律法规的要求(如 GDPR、CCPA 等),还能增强用户对 App 的信任感。本文将介绍如何在 Uniapp 开发的 App 中实现“首次进入弹出隐私协议窗口&#…...

执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案

vite搭建的vue项目,使用pnpm包管理工具,执行pnpm run dev,报如下错误: 报错原因: pnpm依赖安装不完整,缺少esbuild.exe文件,导致无法执行启动命令。 解决方案: 根据错误提示中提到…...

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分,它提供了实现 k-近邻算法(k-Nearest Neighbors, KNN)的…...

JVM中的线程池详解:原理→实践

一、为什么需要线程池? 在多线程编程中,频繁地创建和销毁线程会带来显著的性能开销。 想象一下,如果你经营一家西餐厅,每次有顾客到来你都雇佣新的服务员,顾客吃完结账后就解雇——这种模式是不是非常效率低下且成本高…...

SNARKs 和 UTXO链的未来

1. 引言 SNARKs 经常被视为“解决”扩容问题的灵丹妙药。虽然 SNARKs 可以提供令人难以置信的好处,但也需要承认其局限性——SNARKs 无法解决区块链目前面临的现有带宽限制。 本文旨在通过对 SNARKs 对比特币能做什么和不能做什么进行(相对&#xff09…...

JavaScript设计模式 -- 外观模式

在实际开发中,往往会遇到多个子系统协同工作时,直接操作各个子系统不仅接口繁琐,还容易导致客户端与内部实现紧密耦合。**外观模式(Facade Pattern)**通过为多个子系统提供一个统一的高层接口,将复杂性隐藏…...

百达翡丽(Patek Philippe):瑞士制表的巅峰之作(中英双语)

百达翡丽(Patek Philippe):瑞士制表的巅峰之作 在钟表界,百达翡丽(Patek Philippe) 一直被誉为“世界三大名表”之一,并且常被认为是其中的至高存在。一句“没人能真正拥有一枚百达翡丽&#x…...

阿里云一键部署DeepSeek-V3、DeepSeek-R1模型

目录 支持的模型列表 模型部署 模型调用 WebUI使用 在线调试 API调用 关于成本 FAQ 点击部署后服务长时间等待 服务部署成功后,调用API返回404 请求太长导致EAS网关超时 部署完成后,如何在EAS的在线调试页面调试 模型部署之后没有“联网搜索…...

分享一款AI绘画图片展示和分享的小程序

🎨奇绘图册 【开源】一款帮AI绘画爱好者维护绘图作品的小程序 查看Demo 反馈 github 文章目录 前言一、奇绘图册是什么?二、项目全景三、预览体验3.1 截图示例3.2 在线体验 四、功能介绍4.1 小程序4.2 服务端 五、安装部署5.1 快速开始~~5.2 手动部…...

【练习】【双指针】力扣热题100 283. 移动零

题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出…...

QT 互斥锁

一、概述 1、在多线程编程中,为了防止多个线程同时访问共享资源而导致的不确定性和错误,经常会使用互斥锁(Mutex)进行保护。 2、QMutex是Qt提供的一个互斥锁类,用于确保在同一时间只有一个线程访问共享资源。 3、QM…...

什么是算法的空间复杂度和时间复杂度,分别怎么衡量。

1. 时间复杂度 时间复杂度衡量的是算法运行时间与输入规模之间的关系。它通常用大O记号(Big O Notation)表示,例如 O(1)、O(n)、O(n2) 等。 衡量方法: 常数时间复杂度 O(1):无论输入规模如何,算法的执行时…...

VMware Workstation 17.0 Pro创建虚拟机并安装Ubuntu22.04与ubuntu20.04(双版本同时存在)《包含小问题总结》

目录 一、创建虚拟机 二、下载安装22.04 三、一些配置问题总结(小屏,网络,复制贴贴等) 1、网络问题 2、sudo apt install net-tools出现无法定为软件包 3、小屏与ubuntu虚拟机与windows系统之间复制粘贴 4、安装终端:Termi…...

Windows 10 ARM工控主板CAN总线实时性能测试

在常规的Windows系统中支持CAN总线应用,需要外接CAN总线适配器,通常为USB转CAN模块或PCI接口CAN卡。实时性本身是CAN总线的显著特性之一,但由于Windows并非实时操作系统,应用程序容易受到系统CPU负载影响,导致调度周期…...

如何在不依赖函数调用功能的情况下结合工具与大型语言模型

当大型语言模型(LLM)原生不支持函数调用功能时,如何实现智能工具调度?本文通过自然语言解析结构化输出控制的方法来实现。 GitHub代码地址 核心实现步骤 定义工具函数 使用tool装饰器声明可调用工具: from langcha…...

【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。

AnolisOS 8中使用Docker部署(全)_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了,我重点讲述我解决文章里面问题一些的方法。 问题1: docker: Get https://registry-1.docker.io/v2/: net/h…...

【Elasticsearch】Mapping概述

以下是Elasticsearch中提到的关于Mapping的各模块概述: --- 1.Dynamic mapping(动态映射) 动态映射是指Elasticsearch在索引文档时,自动检测字段类型并创建字段映射的过程。当你首次索引一个文档时,Elasticsearch会根…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...