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

news2024/11/19 9:29:06

文章目录

  • 前言
  • 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)是一种用于在网络上共享文件系统的协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RS0102YH8功能和参数介绍及如何计算热耗散

RS0102YH8功能和参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0102YH8 是一款电平转换芯片,由润石(RUNIC)公司生产。以下是关于RS0102YH8的一些功能和参数的介绍: 电平转换功能: RS0102YH8旨在提供电平转换…

k8s学习(三十七)centos下离线部署kubernetes1.30(高可用)

文章目录 准备工作1、升级操作系统内核1.1、查看操作系统和内核版本1.2、下载内核离线升级包1.3、升级内核1.4、确认内核版本 2、修改主机名/hosts文件2.1、修改主机名2.2、修改hosts文件 3、关闭防火墙4、关闭SELINUX配置5、时间同步5.1、下载NTP5.2、卸载5.3、安装5.4、配置5…

PyQt5如何在Qtdesigner里修改按钮形状、大小、按钮颜色、字体颜色等参数,尤其是如何将按钮修改成圆形。

步骤如下: 1、右键选中你要修改的按钮,此处以Pushbutton为例,选择“改变样式表”,打开编辑样式表对话框,如下图所示 2、在编辑样式表对话框中输入如下代码: QPushButton{ border:1px solid red; /*边框…

rabbitmq下载安装最新版本--并添加开机启动图文详解!!

一、简介 RabbitMQ是一个开源的遵循AMQP协议实现的消息中间件支持多种客户端语言,用于分布式系统中存储和转发消息, 这是 Release RabbitMQ 3.13.0 rabbitmq/rabbitmq-server GitHub 二、安装前准备 1、查看自己系统 确认操作系统版本兼容性 uname -a2、下载Erlang依赖包…

Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读

Flutter笔记 DefaultTextStyle和DefaultTextHeightBehavior解读 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

上位机图像处理和嵌入式模块部署(树莓派4b下使用sqlite3)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 嵌入式设备下面,有的时候也要对数据进行处理和保存。如果处理的数据不是很多,一般用json就可以。但是数据如果量比较大&…

GPT学术优化推荐(gpt_academic )

GPT学术优化 (GPT Academic):支持一键润色、一键中英互译、一键代码解释、chat分析报告生成、PDF论文全文翻译功能、互联网信息聚合GPT等等 ChatGPT/GLM提供图形交互界面,特别优化论文阅读/润色/写作体验,模块化设计,支持自定义快捷按钮&…

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题:动态规划是什么?解决动态规划问题有什么技巧?如何学习动态规划? 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多&#xff…

【vscode】2024最新!vscode云端配置同步方案:code settings sync

小tian最近对电脑进行了系统重装,结果vscode相关配置和插件都没有保存记录,还好公司电脑里还有。痛定思痛,决定写一篇vscode云端同步配置方案,以作记录和分享~ 步骤一:安装vscode插件:code settings sync …

根据标签最大层面ROI提取原始图像区域

今天要实现的任务是提取肿瘤的感兴趣区域。 有两个文件,一个是nii的原始图像文件,一个是nii的标签文件。 我们要实现的是:在标签文件上选出最大层面,然后把最大层面的ROI映射到原始图像区域,在原始图像上提裁剪出ROI…

CSS3(响应式布局)

#过渡# 属性连写: transition: width 2s linear 1s; //前一个时间用于表示过渡效果持续时间,后一个时间用于表示过渡效果的延迟。 #转换# #2D转换# 和 #3D转换# 注意:其中angle对应单位为:deg #圆角# #边框# …

基于区间预测的调度方法

《基于区间预测的光伏发电与蓄电池优化调度方法》 为了应对县级市光伏发电与用电需求之间的最优调度问题,提出一种面向蓄电池和光伏发电机的区间预测调度优化方法。该方法分别对发电功率调度、充电/放电功率调度和荷电状态调度进行决策从而获得最优调度的精确范围。…

ReactJS中使用TypeScript

TypeScript TypeScript 实际上就是具有强类型的 JavaScript,可以对类型进行强校验,好处是代码阅读起来比较清晰,代码类型出现问题时,在编译时就可以发现,而不会在运行时由于类型的错误而导致报错。但是,从…

区块链与Web3.0:区块链项目的推广

数字信息时代,一场革命正在酝酿中,那就是区块链与Web3.0的结合。这种结合将会改变我们对于信息传输、存储和使用的方式,并有可能推动媒体行业向新的高度发展。这种转变不仅关系到我们如何获取和使用信息,也涉及到如何用创新的方式…

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈,可实现网络数据包和串口数据的双向透明传输,具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式,串口波特率最高可支持到…

java-springmvc 01 补充 javaweb 三大组件(源码都是tomcat8.5项目中的)

01.JavaWeb三大组件指的是:Servlet、Filter、Listener,三者提供不同的功能 这三个在springmvc 运用很多 Servlet 01.Servlet接口: public interface Servlet {/*** 初始化方法* 实例化servlet之后,该方法仅调用一次 * init方法必须执行完…

vue如何发送请求给后端(包括前后端跨域)

目录 有哪些方法可以发送请求要请求先解决跨域问题代理服务器后端解决跨域问题 axios发送请求vue-resource发送请求 有哪些方法可以发送请求 以前可能了解过: xhr 即:new XMLHttpRequest()jQuery 即:$.get $.postaxios fetch 在vue中特有的…

27.统一网关Gateway-路由断言工厂

在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件。 例如:Path /user/** 是按照路劲匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRouteP…

数据库锁介绍

数据库锁是一种同步机制,用于控制多个事务对共享资源的访问,防止并发操作造成的数据不一致。在数据库中,锁通常分为两种基本类型:排他锁(Exclusive Locks)和共享锁(Shared Locks)。排…

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换

什么是图像的log变换? 总的来说,对数变换是一种常用的图像增强技术,可以改善图像的视觉质量、减少噪声以及突出图像中的细节,从而提高图像在视觉感知和分析中的效果和可用性。 图像的对数变换(log transformation&am…