【网络基础】深入理解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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关