【Linux】【网络】传输层协议:UDP

2023-09-20 16:55:48

UDP 协议

UDP传输的过程类似于寄信。

  • 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接。
  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量

1. 面向数据报

数据报是独立的一整个,应用层交给 UDP 多长的报文,UDP原样发送,既不会拆分,也不会合并。

例如:用 UDP 传输 100 个字节的数据:
	如果发送端调用一次 sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom,接收100字节。
	而不能循环调用10次recvfrom, 每次接收10个字节。

2. UDP 协议端格式

在这里插入图片描述

UPD 的协议报头长度是 固定的 8字节

16位 UDP 长度,表示整个数据报(UDP 首部 + UDP 数据)的 最大长度,即 216 = 64kb

如果校验和出错, 就会直接丢弃。

报头(协议)的本质其实就是:结构化数据(结构体、位段)

// 结构体实现
struct udp_header
{
	uint16_t src_port;
	uint16_t dst_port;
	uint16_t udp_len;
	uint16_t check;
};
// 位段实现
struct udp_header
{
	uint32_t src_port:16;
	uint32_t dst_port:16;
	//...
};

3. UDP 的封装和解包

🎯封装

  • 应用层将信息拷贝给传输层,用 char* p 指针指向一个缓冲区,前面放 UDP 结构报头(固定 8 字节),后面放有效载荷,对报头内容的填充就可以写作:
((struct udp_header*)p)->src_port = xx;
((struct udp_header*)p)->dst_port = xx;
((struct udp_header*)p)->udp_len = xx;
((struct udp_header*)p)->check = xx;

🎯封装

  • 应用层将信息拷贝给传输层,用 char* p 指针指向一个缓冲区,前面放 UDP 结构报头(固定 8 字节),后面放有效载荷,对报头内容的填充就可以写作:
((struct udp_header*)p)->src_port = xx;
((struct udp_header*)p)->dst_port = xx;
((struct udp_header*)p)->udp_len = xx;
((struct udp_header*)p)->check = xx;

4. UDP 的缓冲区

UDP 没有真正意义上的 发送缓冲区。调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。

UDP 具有接收缓冲区。但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致。如果缓冲区满了,再到达的UDP数据就会被丢弃。

UDP 的 socket 既能读,也能写, 这个概念叫做 全双工

更多推荐

GitHub 曝出漏洞,或导致 4000 多个存储库遭受劫持攻击

TheHackerNews网站披露,安全研究员发现GitHub中存在一个新安全漏洞,该漏洞可能导致数千个存储库面临劫持攻击的风险。据悉,在2023年3月1日漏洞披露后,微软旗下的代码托管平台已于2023年9月1日解决了安全漏洞问题。Checkmarx安全研究员EladRapoport在与TheHackerNews分享的

mysql向数据库中添加数据

要向MySQL数据库中添加数据,您可以使用INSERTINTO语句。以下是一些基本步骤和示例代码来添加数据:连接到数据库:首先,您需要使用MySQL客户端或编程语言中的MySQL连接库连接到您的数据库。编写INSERT语句:创建一个INSERTINTO语句,指定要插入数据的表名和要插入的数据列以及其值。语法如下:INS

【学习笔记】Java 一对一培训(2.1)Java基础语法

【学习笔记】Java一对一培训(2.1)Java基础语法关键词:Java、SpringBoot、Idea、数据库、一对一、培训、教学本文主要内容含Java简介、Java基础语法、Java对象和类、Java基本数据类型、Java变量类型、Java修饰符计划2小时完成,请同学尽量提前准备。这部分主要讲述Java是什么、怎么

Spring Boot的运行原理

SpringBoot的运行原理SpringBoot是一个用于快速构建独立、可独立运行的Spring应用程序的框架。它通过自动配置和约定优于配置的原则,简化了Spring应用程序的开发过程。下面将详细介绍SpringBoot的运行原理,并附上一些代码解释。1.主要组件SpringBoot的核心组件包括自动配置(Auto-

基于SpringBoot的图书商城系统

基于SpringBoot+Vue的网上书城系统、图书商城、网上书店系统,前后端分离开发语言:Java数据库:MySQL技术:SpringBoot、Vue、MybaitsPlus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven【主要功能】角色:管理员、用户管理员:用户管理、图书类型管理、图书

TCP详解之流量控制

TCP详解之流量控制发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。下面举个栗子,为了简

百度之星(夏日漫步)

夏日夜晚,小度看着庭院中长长的走廊,萌发出想要在上面散步的欲望,小度注意到月光透过树荫落在地砖上,并且由于树荫的遮蔽度不通,所以月光的亮度不同,为了直观地看到每个格子的亮度,小度用了一些自然数来表示它们的亮度。亮度越高则数字越大,亮度相同的数字相同。走廊是只有一行地砖的直走廊。上面一共有n个格子,每个格子都被小度给予了

如何给API签名

前言有时候为了保护API,需要用到API签名,使用API签名的好处:让API只能被特定的人访问防止别人抓包拿到请求参数,通过篡改参数发起新的请求客户端过程给API调用者分配一个app_id和app_secret,app_secret调用者和服务端各保存一份,不对外泄露,app_id需要在调用API时作为参数传递。除了a

分布式电源接入对配电网影响分析(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码、数据、文章💥1概述分布式电源的接入将配电系统从传统的无源放射

Qt 中多媒体模块的使用

Qt模块中类的介绍Qt中摄像头的使用是在QtMultimedia模块中。QtMultimedia是一个重要模块,它提供了一组丰富的QML类型和C++类来处理多媒体内容。它还提供了访问相机和无线电功能所需的API。随附的Qt音频引擎提供了用于3D位置音频播放和内容管理的类型。Qt中的多媒体支持由模块提供。Qt多媒体模块提

录屏没有声音怎么办,3个方法教你解决

随着科技的不断发展,人们越来越依赖电子设备进行工作和学习。在这个过程中,录屏已经成为了一种必要的技能。无论是手机还是电脑,我们都可以通过录屏来记录重要的信息。但是,有时候我们在录屏时会发现声音无法正常录制,这是一个非常令人头疼的问题。本文将详细介绍录屏没有声音怎么办,帮助大家解决录屏没有声音的问题。手机录屏没有声音方法

热文推荐