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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]