【网络基础】深入理解UDP协议:从报文格式到应用本质

2024-04-28 06:12

本文主要是介绍【网络基础】深入理解UDP协议:从报文格式到应用本质,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • Udp协议段格式
    • 1. 几乎所有协议首要解决的两个问题:
      • a) 如何分离(封装)
      • b) 如何进行向上交付
    • 2. 理解报文本身
    • 3. 对Udp报文字段的解释
    • 4. Udp的特点
      • 如何理解 面向数据报:
    • 5. IO类接口的本质:sento、recvfrom
      • UDP的缓冲区
    • 6. UDP全双工 vs 半双工
    • 7. UDP的使用注意事项
    • 8. 基于UDP的应用层协议

前言

首先我们知道,什么是Udp协议

  • UDP(User Datagram Protocol)是一种无连接的传输协议,它位于OSI模型的传输层,用于在计算机网络上发送数据。

在之前所写的进程间通信套接字编程 的代码都是在应用层的,接下来的Udp、Tcp协议在传输层
在这里插入图片描述


Udp协议段格式

下图为UDP的协议段的格式:

在这里插入图片描述

1. 几乎所有协议首要解决的两个问题:

a) 如何分离(封装)

在这里插入图片描述
如图所示,通过固定长度的报头,将报头有效载荷分离。


b) 如何进行向上交付

分离后,将报头的 16位(目的)端口号向上交付 给进程,因为进程bind(绑定)了端口号

  1. 为什么在应用层编写代码写端口号时,使用 uint16_t:根据Udp协议,端口号是16位的。
  2. UDP是如何正确提取报文的:
    • 同样的,因为Udp协议段是 固定长度的报头 + 16位Udp长度
    • 由上可以知道Udp是能正确的接收报文的,即:Udp是面向数据报

2. 理解报文本身

有了之前的Udp协议图,如何具体的理解报文本身,实际上报头本身是一个 结构体,我们可以表示为:

struct udp_htr
{uint32_t src_port:16;	uint32_t dst_port:16;uint32_t udp_len:16;	uint32_t udp_check:16;
}
  • (基本上所有的报头都是如上的结构体),该结构体实际上也是C语言学习过程中的 位段

因此,上层应用层向内核层传输数据的过程,可以具象化为:

在这里插入图片描述
而后可以通过(struct udp_hdr*)start->src_port...取得每个内容,实现分离。


3. 对Udp报文字段的解释

UDP(用户数据报协议)报文包含以下字段:

  1. 源端口(Source Port) 16位字段,指定发送端的端口号。

  2. 目标端口(Destination Port) 16位字段,指定接收端的端口号。

  3. 长度(Length)16位字段,指定UDP报文的长度,包括UDP首部和数据。

  4. 校验和(Checksum)16位字段,用于验证UDP报文在传输过程中的完整性。


4. Udp的特点

  • 无连接
    • 通信的双方在发送数据之前不需要建立连接,知道对端的ip和端口号可以直接进行传输。
  • 不可靠
    • UDP不保证数据包的可靠传输。
    • 没有确认、重传机制,如果由于网络故障导致无法发送给对端,Udp协议层不会给应用层返回错误信息。
  • 面向数据报
    • 每个UDP数据包(数据报)都是一个独立的数据单元,不依赖于之前或之后的数据包
    • 不能够灵活的控制读写数据的次数和数量

如何理解 面向数据报:

  • 应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并
  • 比如使用Udp传输100个字节:
    • 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个 字节; 而不能循环调用10次recvfrom, 每次接收10个字节
    • 所以Udp的传输过程类似送信,不需要提前连接,且发送时需要一整段数据发过去,接收也整段接收。

5. IO类接口的本质:sento、recvfrom

在我们使用如sendtorecvfromread等函数时,我们可能以为是在网络中进行的数据收发,实际并非如此,本质是:

在这里插入图片描述


UDP的缓冲区

因此:

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

6. UDP全双工 vs 半双工

UDP协议下进行通信时有两种模式:

  1. UDP全双工

    • 在UDP全双工通信中,两个通信实体(通常是两台计算机或两个进程)之间可以 UDP有 同时发送和接收数据
    • UDP全双工通信的特点是通信双方之间的数据传输是独立的,互不影响。
  2. UDP半双工

    • 在UDP半双工通信中,通信双方只能在同一时间内进行发送或接收操作,不能同时进行。
    • UDP半双工通信的特点是通信双方之间的数据传输是交替进行的,无法同时进行发送和接收。

7. UDP的使用注意事项

  1. 我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
  2. 显然64K在当今的互联网环境下, very small。
  3. 如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。

8. 基于UDP的应用层协议

  1. DNS(域名解析协议):DNS使用UDP协议来进行域名解析,将域名映射到IP地址。

  2. DHCP(动态主机配置协议):DHCP用于自动配置网络设备的IP地址、子网掩码、网关等信息,并且可以通过UDP进行通信。

  3. TFTP(简单文件传输协议):TFTP用于在网络上传输文件,它基于UDP进行通信。

  4. SNMP(简单网络管理协议):SNMP用于网络设备之间的管理和监控,它的一些版本使用UDP作为传输协议。

  5. NTP(网络时间协议):NTP用于同步计算机的时间,它可以使用UDP来传输时间信息。

  6. VoIP(网络电话):许多VoIP应用程序使用UDP来传输音频和视频数据,因为UDP的低延迟和实时性对于语音通信非常重要。

  7. NFS(Network File System)是一种用于在网络上共享文件系统的协议。

这篇关于【网络基础】深入理解UDP协议:从报文格式到应用本质的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942481

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em