当前位置: 首页 > 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会根…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...