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

【计算机网络】详解UDP协议格式特点缓冲区

一、UDP 协议端格式

        16 位 UDP 长度, 表示整个数据报(UDP 首部+UDP 数据)的最大长度;如果16位UDP检验和出错,报文会被直接丢弃。

1.1、检验和出错的几种常见情况

  1. 数据传输过程中的比特翻转:在数据传输过程中,由于物理介质或网络设备的故障,可能导致数据中的某些比特位发生翻转,即0变为1或1变为0。这种变化会破坏数据的完整性,从而导致UDP报文的检验和错误。
  2. 数据包丢失或损坏:UDP协议是一种无连接的、不可靠的传输协议,它不保证数据包的顺序传递和完整性。因此,在传输过程中,数据包可能会丢失或损坏,这也会导致UDP报文的检验和错误。
  3. 伪头部信息错误:在计算UDP检验和时,通常会包括一个伪头部,该伪头部包含了源IP地址、目的IP地址、协议类型等额外信息。如果这些信息在计算或传输过程中出现错误,也会导致最终的检验和错误。
  4. 发送端和接收端计算不一致:发送端在发送UDP数据包之前会计算校验和,并将其放置在UDP数据报的校验和字段中。接收端在接收到UDP数据包后,也会进行校验和的计算。如果发送端和接收端的计算过程或算法存在差异,或者接收端在计算过程中使用了错误的数据(例如,数据在传输过程中已被篡改),那么两者计算出的校验和可能不一致,从而导致检验和错误。

二、UDP的特点

 UDP 传输的过程类似于寄信

  1. 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接。UDP是无状态的,这意味着它不会跟踪或维护任何连接状态。每次发送数据都是独立的,不受之前或之后发送的数据的影响。这种无状态特性使得UDP在处理大量短消息或实时数据时非常高效。UDP的无连接特性简化了协议栈的实现。与TCP相比,UDP不需要维护连接状态、处理连接超时或重传机制等复杂功能。这使得UDP在处理实时性要求较高、对丢包不敏感的应用场景如视频流、音频流、在线游戏等时更加高效。
  2. 不可靠: 没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息;UDP也不保证数据包的到达顺序。由于网络传输的复杂性,数据包可能会以不同的顺序到达接收方。UDP不会对这些数据包进行排序或重组,而是直接将它们传递给应用程序。这意味着应用程序需要自己处理数据包的顺序问题。UDP也不会根据网络的拥塞程度来调整发送速率。这可能导致在网络拥塞时,UDP数据包大量丢失或延迟增加。UDP的头部包含一个简单的校验和字段,用于检测数据在传输过程中是否发生了错误,但这个校验和是可选的。发送方可以选择关闭校验和,以提高传输效率。如果关闭了校验和,那么UDP将不会对数据进行任何形式的错误检测,这进一步增加了数据传输的不可靠性。
  3. 面向数据报: 不能够灵活的控制读写数据的次数和数量;应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并;用 UDP 传输 100 个字节的数据为例子:如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收10个字节。

 三、UDP的缓冲区

         UDP 没有真正意义上的 发送缓冲区 。调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP 具有接收缓冲区。但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃。

四、UDP注意事项

        我们注意到, UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部)。然而 64K 在当今的互联网环境下, 是一个非常小的数字。如果我们需要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。
http://www.lryc.cn/news/453119.html

相关文章:

  • 网络安全cybersecurity的几个新领域
  • android 原生加载pdf
  • MAE(平均绝对误差)和std(标准差)计算中需要注意的问题
  • 03实战篇:把握667分析题的阅读材料、题目
  • C++系列-多态
  • 基于C++和Python的进程线程CPU使用率监控工具
  • fish-speech语音大模型本地部署
  • 如何写出更牛的验证激励
  • EasyCVR视频汇聚平台:解锁视频监控核心功能,打造高效安全监管体系
  • 面对大文件(300G以上)如何加速上传速度
  • 基于 Redis 实现消息队列的深入解析
  • C++(string类的实现)
  • nrf 24l01使用方法
  • C语言普及难度三题
  • 10.4每日作业
  • 日常工作记录:服务器被攻击导致chattr: command not found
  • 多线程-初阶(1)
  • Spring Boot集成encache快速入门Demo
  • 【C语言】数组练习
  • 微服务实战——ElasticSearch(保存)
  • leetcode练习 路径总和II
  • 使用Three.js库创建的简单WebGL应用程序,主要用于展示具有不同透明度和缩放比例的圆环列
  • Redis: 集群架构,优缺点和数据分区方式和算法
  • 负载均衡可以在网络模型的哪一层?
  • YOLOv11改进 | 上采样篇 | YOLOv11引入CARAFE上采样
  • 【Linux运维】grep命令粗浅学习
  • 【Godot4.3】匀速和匀变速直线运动粒子
  • 基于Hive和Hadoop的用电量分析系统
  • 一个简单的摄像头应用程序4
  • SpringBoot使用EasyPoi根据模板导出word or pdf