计算机网络——UDP

1. UDP的背景

  1)先有TCP,后觉笨重

  • 在TCP被首次提出后,将“可靠传输,流量控制,拥塞控制”全做在一个协议里
  • 随着应用增多 ——> 很多场景(语音,视频)并不需要万无一失 ——> 更注重 “低延迟,低开销”

  2)拆分与诞生

后来将 TCP 中 “不可靠,无连接” 的那部分功能剥离出来,形成了独立的 UDP 这样

    这样就出现了两条传输层路线:

  • 需要可靠、顺序交付 ——> 用TCP(面向链接,重传,拥塞控制)
  • 只需要快速,尽力投递 ——> 用 UDP (无连接,几乎不增加额外机制)

2. UDP的简介

   ①  UDP 是一种在网络通信中使用的传输层协议,是一个简单的、面向无连接的协议,

   ②  UDP用于将数据从一个应用进程发送到另一个应用进程,并在此过程中不提供可靠的数据传输保障

无连接:

    1. 通信之前不建立,通信之后也不释放任何连接(专属通道):把每个数据包当独立快递包裹,直接扔出去就算完成任务,不建立,不维护,也不拆除任何长连接

不可靠:

     2 发送端发出去的消息在网络传输中一旦丢失,接收端将收不到这个消息

                                  引入问题:为什么TCP就比UDP可靠?请看下文

3. 对比 TCP 和 UDP

① 数据传输之前会有三次握手来进行连接

  •    第一次: 服务端确认client发送与自己接收正常
  •    第二次:client确认双方发送接收正常
  •    第三次: 服务端确认双方发送接收正常

②在数据传输时候,有确认、滑动窗口、超时重传、拥塞控制之类机制

  •   确认:接收方用来告诉发送方数据已经成功接收
  •   滑动窗口:双方各维护一个滑动窗口,发送方根据接收方的确认信号和窗口大小调整自己窗口
  •   超时重传:发送方在发送数据后启动一个计时器,超时之前没有收到确认信号,发送方会重传该数据包
  •   拥塞控制机制:动态调整发送速率,防止网络拥塞,优化网络性能。

③数据传输之后进行四次挥手断开连接来节约系统资源。  

  •      第一次:client告知服务端自己要关闭数据传送  
  •      第二次:服务端告知client自己收到了    
  •      第三次:服务端告诉client自己也没话说了准备关闭       第四次:client告知服务端自己收到了,然后完全关闭TCP连接

4. UDP 特点

①无连接性    

   这意味着通信的双方不需要在通信之前建立连接。每个UDP数据报都是独立的,它们可以单独发送,没有依赖关系。

②不可靠性    

   这意味着如果发送的数据丢失或者损坏,UDP不会自动重新发送,需要应用层自行处理。

③速度与低延迟    

   由于没有连接状态维护和复杂的确认机制,UDP的开销比TCP小,因此在速度和延迟方面表现更好。这使得它适用于实时应用,如语音通话和在线游戏。

④  数据报格式    

    UDP数据报包含了目标端口号和源端口号,这些信息用于将数据传递给正确的应用程序。但是,数据报本身没有保证按顺序到达或完整到达

⑤  无拥塞控制    

   UDP不具备TCP的拥塞控制机制,因此在网络拥塞的情况下,UDP数据报可能会丢失或延迟增加

⑥  广播和多播支持    

  UDP可以像特定组中的多个主机发送数据(多播),也可以将数据广播到网络中的所有主机

⑦  使用场景

   需要快速传输和实时性要求较高的应用

5. UDP 数据报的报文格式

6. UDP 多播广播 代码演示

① 广播:

②多播:

7. 如何基于 UDP 实现可靠传输

QUIC协议,已经应用在了HTTP/3 要基于 UDP 实现的可靠传输协议, 那么就要在应用层下功夫,也就是要设计好协议的头部字段。

接下来给大家逐个介绍一下各个头部:

① Packet Header

两部分组成:

1)Long Packet Header = “首次握手时的完整自我介绍”,大而全,用来交换连接 ID、版本、密钥。

2)Short Packet Header = “日常对话的名片”,极简,只保留 Destination Connection ID,实现低延迟传输 + 连接迁移。

设计 ① :Short Packet Header 中的 Packet Number 是每个报文独一无二的编号,是严格递增的,也就是说即使报文 N 丢失了,重传的Packet Number 也不再是N,而是比N大的值

                                     为什么要这么设计?因为TCP存在的两个问题 

一、TCP 的“歧义性 RTT”问题

      在 TCP 里,序号是「字节序号」,重传时必须复用同一个序号。

示例:

  1. 原始包 P(序号 1000)在 t₀ 发出。
  2. 丢包后,发送端重传同一个 P(序号仍为 1000)在 t₁ 发出。
  3. 接收端收到重传的 P,回 ACK=1000

发送端看到 ACK=1000,无法知道这个 ACK 是对第一次还是第二次的确认,于是 RTT = t_now - t_? 就不准了——这就是「重传歧义性」。

二、QUIC 的单调递增 PacketNumber 如何消除歧义

    QUIC不重号:

  1. 原始包 P 编号 N,在 t₀ 发出。
  2. 丢包后,发送端把要重传的数据重新封装为一个新包 Q,编号 N+1(或其他更大的号),在t₁时刻     发出

  现在 ACK 链路:

  1. 如果 ACK 的 PacketNumber = N → 说明是原始包 P 的确认 → RTT = t_now - t₀(准确)
  2. 如果 ACK 的 PacketNumber = N+1 → 说明是重传包 Q 的确认 → RTT = t_now - t₁(也准确)。

       永远一一对应,没有歧义。

三、乱序确认 & 队头阻塞问题

   TCP的滑动窗口必须顺序确认:

  1. 如果包 3 丢了,即使4、5、6已经到达,接收端也只能 ACK = 3
  2. 发送端看到ACK一直停在 3, 窗口无法右滑,整个流水线被 “队头” 堵住

QUIC由于 PacketNumber 单调递增解决上述问题:

  1. 包 3 丢了,但包4、5、6的ACK可以立即返回 PacketNumber=4、5、6。
  2. 发送端收到这些较大的 PacketNumber,就知道 “后面的数据已经到”,窗口可以右滑,继续发新数据
  3. 重传的包 3 会被重新编号(如 7),不会卡住窗口

总结:

    不重号——> ACK永远唯一 ——> RTT 精确        

    独立编号 ——> ACK 可乱序 ——> 窗口不会因为丢包停滞 ——> 解决队头阻塞

②  QUIC Frame Header

一个 Packet 报文中可以存放多个 QUIC Frame。 每一个 Frame 都有明确的类型,针对类型的不同,功能也不同,自然格式也不同。

作用:

   通过 Stream ID + Offest 让 QUIC 能在乱序世界里把数据精准拼回原来的顺序 

举个例子:

    数据包 Packet N 丢失了,后面重传该数据包的编号为 Packet N+2, 丢失的数据包和重传的数据包 Stream ID 和 Offest 都一致,说明这两个数据包的内容一致,这些数据包传输到接收端之后,能根据两者的字段信息将 二者进行去重并排序操作。

8. 关于 QUIC的四个问题

  ① QUIC 是如何做流量控制的?

QUIC 实现了两种级别的流量控制,分别为 Stream 和 Connection 两种级别

Stream 级别的流量控制:    

     可以认为就是一条 HTTP 请求,每个 Stream 都有独立的滑动窗口,所以每个 Stream 都可以做流量控制,防止单个 Stream 消耗连接(Connection)的全部接收缓冲。          

Connection 流量控制:    

   限制连接中所有 Stream 相加起来的总字节数,防止发送方超过连接的缓冲容量。

② QUIC 如何对拥塞控制进行改进?

QUIC 实现了两种级别的流量控制,分别为 Stream 和 Connection 两种级别

TCP 流量控制:    

     必须依赖端到端的网络协议栈才能实现控制效果,而内核和操作系统的部署成本非常高,升级周期很长,因此 TCP 拥塞控制算法的迭代速度很慢 。          

QUIC 流量控制:  

     QUIC 处于应用层,应用程序层面就能实现不同的拥塞控制算法,不需要操作系统,也不需要内核支持,并且可以随浏览器更新,其拥塞控制算法能够更快地迭代。

③ QUIC 如何而更快的建立连接

TCP 握手:  

       先TCP握手(1RRT),再TLS 握手(2RTT),          

QUIC 握手:        

       只需要 1RTT,确认双方的 连接ID ,所以说 QUIC建立连接会更快

④ QUIC是如何迁移连接的

TCP :  

       基于 TCP 传输协议的 HTTP 协议,通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。    

    当移动设备网络从 4G 切换到 Wi-Fi 时,IP 地址发生变化,必须断开原有 TCP 连接并重新建立新连接。          

QUIC :  

     通过 连接 ID 来标记通信的两个端点,双方可以各自选择一组 ID来标记自己,即使网络变化导致 IP 地址变化了之后,只要仍右上下文信息(连接 ID),就可以 无缝 的服用原连接,消除重连的成本

9. UDP 的应用场景

1. 实时通信:  

         视频会议、语音通信、在直播等等,需要UDP提供快速、可靠的服务,满足实时性要求。

2. 分布式系统:  

        例如在网络存储,云计算等场景中,需要实现大量数据的快速传输。

3. 大量数据传输:  

       网络爬虫、大数据分析等领域,需要频繁地发送和接收大量数。据

4. 端到端通信:  

       远程控制,智能家居等领域,UDP可以实现设备间的远程控制功能。

后续会发布相关视频在b站上,欢迎大家来看,发布时会更新贴上视频链接!乐茵linn的个人空间-乐茵linn个人主页-哔哩哔哩视频,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917489.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的深度学习模块/操作中的维度约定(系统性总结)

🟩 1. 数据张量(特征图)维度这是我们喂进网络或从网络中出来的“实际数据”。类型维度格式举例说明图像/特征图(B, C, H, W)(4, 3, 32, 32)PyTorch中最常用的数据布局(NCHW)图像/特征图(TensorFlow风格&…

【笔记】重学单片机(51)(上)

为学习嵌入式做准备,重新拿起51单片机学习。此贴为学习笔记,仅记录易忘点,实用理论基础,并不是0基础。 资料参考:清翔零基础教你学51单片机 51单片机学习笔记1. C语言中的易忘点1.1 数据类型1.2 位运算符1.3 常用控制语…

Arrays.asList() add方法报错java.lang.UnsupportedOperationException

1. 问题说明 记录一下遇到的这个bug&#xff0c;下面是段个简化后的问题重现代码。 public class Test {public static void main(String[] args) {List<Integer> list Arrays.asList(1, 2, 3);list.add(4);} }2. 原因分析 我们看一下Arrays.asList(…) 的源码&#xff…

克罗均线策略思路

一个基于移动平均线的交易策略&#xff0c;主要通过比较不同周期的移动平均线来生成买卖信号。该策略交易逻辑思路和特点&#xff1a;交易逻辑思路1. 多头交易逻辑&#xff1a;- 当当前周期的收盘价高于其4周期移动平均线&#xff0c;并且4周期移动平均线高于9周期移动平均线&a…

Go语言--语法基础7--函数定义与调用--自定义函数

函数是基本的代码块&#xff0c;用于执行一个任务。Go 语言最少有 1 个 main() 函数。你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称、返回类型和参数。函数三要素名称 》功能参数 》接口返回值 》结果函数分类内…

Ollama模型库模型下载慢完美解决(全平台)

前言在我们从ollama下载模型时,会发现ollama最开始下载速度很快,能达到10-20MB/s但到了后期,速度就会越来越慢,最终降低到10-20kb/s下载一个模型大多需要1到1.5小时这是因为ollama服务器负荷过大的问题思路如果在下载中终断下载,在用ollama run恢复下载,速度就会又提上去,但3-4…

web:js的模块导出/导入

一般web页面中&#xff0c;html文件通过标签script引用js文件。但是js文件之间的引用要通过import/exprot进行导入/导出&#xff0c;同时还要在html文件中对js文件的引用使用type属性标注。在下面的例子中&#xff0c;html页面<!DOCTYPE html> <html lang"en&quo…

关于Web前端安全防御之安全头配置

一、核心安全头的作用 1. X-Content-Type-Options: nosniff 该响应头用于阻止浏览器对资源的 MIME 类型进行 “嗅探”&#xff08;猜测&#xff09;&#xff0c;强制浏览器严格遵守服务器返回的 Content-Type 头部声明。 风险背景&#xff1a; 浏览器默认会对未明确声明类型…

C++ : 反向迭代器的模拟实现

一、reverse_iterator.h#pragma once namespace txf { //外界传什么类型的iteator&#xff0c;它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在这个反向迭代器中涉及到…

自动化与配置管理工具 ——SaltStack

一、SaltStack 概述1.1 核心特性SaltStack 是一款开源的自动化运维工具&#xff0c;采用客户端 - 服务器&#xff08;C/S&#xff09;架构&#xff0c;以高效、灵活和可扩展著称。其核心特性包括&#xff1a;高性能架构&#xff1a;基于 ZeroMQ 消息队列&#xff0c;支持大规模…

Rust → WebAssembly 的性能剖析全指南

一、用优化&#xff08;Release&#xff09;构建 ⚡ 务必在做性能测量前使用 优化模式 构建你的 WASM。默认情况下&#xff1a; wasm-pack build → Release 优化wasm-pack build --dev 或 cargo build → Debug&#xff0c;性能大打折扣 优化编译能开启 LLVM 的各项优化和 LT…

第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题

更多内容请查看网站&#xff1a;【试卷中心 -----> 蓝桥杯----> Python----> 国赛】 网站链接 青少年软件编程历年真题模拟题实时更新 第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题 一、单选题 第 1 题 单选题 下列运算符中&#xff0c;表示并集的…

【Django】-9- 单元测试和集成测试(上)

一、Django 项目单元 & 集成测试准备 &#x1f447;依赖安装&#xff08;给项目装 “测试小帮手”&#x1f37c;&#xff09;pdm add -d black isort flake8 pytest pytest-django pytest-coverage &#x1f449; 这行命令像在给项目 “采购” 测试工具&#xff1a;black …

VUE-第二季-01

目录 1.Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 1.5 Vue实例 和 容器 的关系是&#xff1a;一夫一妻制 2.Vue核心技术 2.0 Vue的模板语法 2.0.1 插值语法 插值语法总结&#xff1a; 2.0.2 指令语法 指…

Android 15 中禁用/启用应用的系统级方法

在 Android 15 的开发中,有时我们需要以系统级权限来控制应用的启用状态。本文将介绍如何使用 PackageManager 来实现应用的禁用和启用功能。 核心方法 在 Android 15 代码中,可以使用以下方法来禁用或启用应用: packageManager.setApplicationEnabledSetting(pkg,Packag…

2025网络工程师技能图谱(附思维导图)

------------比较全面&#xff0c;供学习参考路线图。-----------------------

【ROS2】rclcpp::Node 常用 API

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录1. 构造函数2. 节点名称相关3. 获取log对象句柄4. 回调组相关5. Topic发布与订阅6. Service服务端与客户端1. 构造函数 public:Node(const std::string & node_name, const NodeOptions & options NodeOptio…

自动驾驶:技术、应用与未来展望——从开创到全面革新交通出行

一、引言1.1 研究背景与意义在过去的几十年里&#xff0c;随着科技的飞速发展&#xff0c;自动驾驶技术逐渐从科幻小说中的概念走进了现实生活。从最初简单的辅助驾驶功能&#xff0c;到如今高度自动化的自动驾驶系统&#xff0c;这一领域的进步正深刻地改变着我们的出行方式和…

【gradle】插件那些事

文章目录 1. 前言 2. 插件相关介绍 2.1 gradle插件的apply 2.2 引入自定义插件 2.3 常见构建任务 2.4 gradle生命周期 2.5 gradle的惰性属性&可注入的服务 2.6 常见命令 检查依赖树 查看tasks 构建扫描 查看多项目构建的结构 显示所选项目的构建脚本依赖项 指定控制台模式来…

测试平台如何重塑CI/CD流程中的质量协作新范式

测试平台如何重塑CI/CD流程中的质量协作新范式 在DevOps革命席卷全球软件行业的今天&#xff0c;测试的角色正在经历前所未有的转变。传统的"测试最后"模式正在被"测试全程"的新理念所取代&#xff0c;这一转变背后是测试平台与CI/CD流程深度融合带来的质量…