首页 > 其他分享 >网络原理(六): UDP 协议

网络原理(六): UDP 协议

时间:2024-12-30 20:56:46浏览次数:11  
标签:UDP 字节 数据包 报文 网络 校验 原理 数据

目录

1. UDP 协议

1.1 协议特点

1.2 协议报文格式

1.2.1 UDP 长度 

1.2.2 校验和


1. UDP 协议

在进行网络编程时, 我们已经对 UDP 协议进行了简单了解. 并且应用层的很多操作, 需要调用传输层的提供的接口, 基于 socket api 来进行完成的.

1.1 协议特点

UDP 协议具有以下特点:

  1. 面向数据报
  2. 不可靠传输
  3. 全双工
  4. 无连接

在进行网络编程使用 UDP socket api 进行数据传输时, 我们就对其中的一些特点有了一些感受:

面向数据报体现于: 每发送(send)或接收(receive)一次消息, 都是一个完整的 udp 报文.

全双工体现在: 不论是客户端还是服务器, 都可以进行 send 和 receive 操作.

无连接体现在: UDP 报文直接发送, 对端就可以接收, 并没有像 TCP 那样 accept 的过程.

不可靠传输, 是指消息发出后, 就不管了(不管数据是否成功发送到对端). 这一点并没有在编程时具体体现, 接下来我们通过 udp 协议的报文格式来了解这一特点.

1.2 协议报文格式

UDP 数据报由两个部分组成:

  1. UDP 报头
  2. 载荷(完整的应用层数据包)

其中, 载荷就是完整的应用层数据报.

报头, 大小为 64 个 bit 位, 8 个字节, 由以下四个部分组成:

  1. 源端口号
  2. 目的端口号
  3. 报文长度
  4. 校验和

其中, 每个部分都占了 2 个字节.

至于源端口号和目的端口号的作用, 这里就不再赘述了, 主要聊一聊其中的 报文长度 和 检验和.

1.2.1 UDP 长度 

UDP 报文格式中的长度这一部分, 表示的是整个 UDP 数据报的长度, 即报头 + 载荷的长度. 

由于大小为 2 字节, 也就是 16 个 bit 位, 所以 UDP 数据包长度的范围为 0~2^16-1, 也就是 0~65535, 所以一个 UDP 数据报最大只能为 65535 个字节, 也就是 64kb.

由于报头部分的大小是固定的, 8 字节, 这相对于 64kb(65535 字节) 来说是可以忽略不计的.

所以, 当我们面试表述 UDP 报文大小的上限时, 既可以说 64kb 是整个 UDP 数据包的上限, 也可以说是 UDP 携带的载荷的上限.

 64 kb, 在设计 UDP 的那个年代, 确实是一个充裕的大小, 但是放到 2024 年的今天, 就是一个非常小的数字了, 随随便便一张照片就可能是几个 MB.

所以要发送数据的大小超出 UDP 数据包可以承载的大小的情况是经常发生的, 而当发送的大小一旦超过了 64kb, UDP 数据包就会被直接截断, 对方拿到的数据就会出错, 那么如何解决这个问题呢?? 有两个方案可以选择:

  1. 方案一: 在应用层代码上进行拆包操作, 把一个大的应用层数据报拆成很多小的数据包, 再使用多个 UDP 数据包进行传输.
  2. 方案二: 使用 TCP 协议, 使用 TCP 数据包进行传输(TCP 没有长度的限制).

方案一, 是一个工作量比较大的方法, 需要对代码进行大量的修改, 写大量的逻辑来实现分包组包的工作, 并且一不小心可能就写出了隐藏 bug, 效率太低.

所以, 在工作中, 我们会优先选择简单且不易出错的方案来解决问题, 即采用方案二, 使用 TCP 来解决 UDP 数据包大小限制的问题.

可能大家心中有一个疑问: 为啥不直接修改 UDP 的报文格式, 直接把 UDP 本身改的大一点呢??

其实, 要修改 UDP 很容易, 但是难就难在, UDP 已经内置在各种的操作系统中, 一旦发生变动, 就会造成很大的影响, 比如通信双方, 一方进行了修改, 另一方没有进行修改, 那么 UDP 数据包就会传输失败, 导致不能使用 UDP 进行通信. 并且, 修改也会牵扯到系统兼容性的问题, 所以, 通信双方谁先改, 谁可能就会出现问题.

所以 UDP 可以说是积重难返了, 目前也只能这样子~~

1.2.2 校验和

UDP 报文中的校验和, 作用是为了验证传输的数据是否发生修改.

注意, 这里的校验和与 HTTPS 中数字签名的校验和不同, HTTPS 数字签名的校验和是为了反正数据被黑客篡改(防人), 但是这里 UDP 的校验和, 与安全性无关, 而是防止传输过程中出现"比特翻转".

比特翻转, 就是在传输的过程中, 由于外界的影响, 导致数据中的某些 bit 位0变1, 1变0.
(数据都是以光电信号或者电磁波的形式进行传输的, 很容易收到外界的干扰)

验证的过程如下:

  1. 发送之前, 会把整个数据报中的数据代入, 计算得出一个校验和, 并将数据和校验和一同发给对端.
  2. 对端收到数据后, 根据收到的数据, 再次计算校验和, 将两个校验和进行对比, 如果校验和不一致, 说明有数据发生了比特翻转, 直接丢弃.

这里 UDP 采用的 CRC(循环冗余校验) 的方式来计算校验和:

  • CRC: 把 UDP 报文中的每个字节(除了校验和位置外), 都当做整数, 进行累加, 即使溢出也没关系, 继续加, 最终得到的数据就是 CRC 校验和.

所以, 如果在传输过程中, 有 bit 位发生了翻转, 那么两次计算得到的校验和也会不同.

我们可以认为, 如果两个数据是相同的数据, 那么计算得到的校验和一定是相同的.

但是, 当两次计算的校验和相同时, 两个数据不一定是相同的.

因为, 这其中可能存在变数, 例如: CRC 是累加的方式计算的校验和, 如果第一个字节发生的翻转, 使得值变小了, 而第二个字节发生的偏转又使值变大了, 而恰恰这两次偏转各自的差值又相互抵消, 那得到的校验和依然是相同的.

虽然, 可能出现上述情况, 但是这种情况发生的概率是非常小的(发生翻转的概率本来就小, 再加上两次偏转的影响又相互抵消, 概率就小之又小了), 所以在实际开发中, 我们可以忽略这种情况的存在.

综上, 我们可以通过 UDP 报文中的校验和这一部分, 来确定数据在传输时, 是否发生了修改~ 


END

标签:UDP,字节,数据包,报文,网络,校验,原理,数据
From: https://blog.csdn.net/2401_83595513/article/details/144179267

相关文章

  • 《计算机组成及汇编语言原理》阅读笔记:p133-p159
    《计算机组成及汇编语言原理》学习第11天,p133-p159总结,总计27页。一、技术总结1.segment(1)定义Broadlyspeaking,acontiguoussectionofmemory.Morespecifically,asectionofmemoryreferencedbyoneofthesegmentregistersofthe80x86family.Theme......
  • 【Java编程】JDBC 底层原理
    概述JDBC(JavaDataBaseConnectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。JDBC由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,注意:本文中的代码都是针对MySQL数据库实现的。先看一个案例:publicclassJdbcDemo{......
  • ssm网络商城系统56077(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着互联网技术的普及和电子商务的快速发展,网络购物已成为人们日常生活的重要组成部分。网络商城系统作为电子商务的核心平台,其重要性......
  • 网络异常监控管理工具
    什么是网络监控工具?1.1网络监控工具是软件应用程序或硬件设备,旨在帮助网络管理员保持对本地、云、虚拟和边缘网络及其组件的历史和实时流量的一致可见性。1.2网络监控考虑标准网络组件的行为、流量和健康状况,例如端点设备、防火墙、路由器、交换机和服务器。管理员......
  • 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智
    【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向......
  • pytorch中神经网络的定义方法
    1.继承torch.nn.Module类(推荐方法)最常见和推荐的方式是通过继承torch.nn.Module类来创建一个自定义的神经网络模型。在这种方式下,你需要定义__init__()方法来初始化网络层,并在forward()方法中定义前向传播逻辑。示例:一个简单的全连接神经网络importtorchimpor......
  • 【JavaSE】【网络协议】HTTP 请求和响应
    一、HTTP请求1.1请求格式请求格式:首行+请求头(header)+空行+正文(body)1.2首行组成首行组成:请求方法+URL+版本号。使用“空格”将他们分隔开。1.2.1请求方法方法说明支持的HTTP版本GET获取资源1.01.1POST传输实体主体1.01.1PUT传输文件1.01.1DELETE删除文件1.01.......
  • 遥控器接收机之工作原理篇
       遥控器接收机,也称为遥控接收器或无线遥控接收机,是一种用于接收无线信号并转换为可操作设备的电信号的电子设备,其工作原理主要基于无线电波通信。一、组成部件遥控器接收机通常由以下关键组件组成:天线:负责捕捉和接收来自遥控器的无线信号。射频接收模块(高频模块):接收......
  • 北京大学2024秋季编译原理实践报告
    编译原理课程实践报告:编译好难写代码在https://github.com/parker0523/compiler一、编译器概述1.1基本功能本编译器基本具备如下功能:编译SysY文件为KoopaIR文件编译SysY文件为risc-v文件简单的寄存器分配1.2主要特点本编译器的主要特点是源文件结构精简、代码风格自......
  • 汽车打气泵方案|智能充气泵工作原理
    汽车打气泵方案最开始是机械式的开发,后来慢慢地演变成由一个气缸、压力传感器和ADC芯片以及主控芯片,就能够使得打气筒具备智能充气功能,摇身一变变成汽车打气泵方案。它具备精准压力检测以及过充过放等功能,利用ADC芯片和压力传感器的组合设计,可以感测到轮胎里面的气压从而驱使......