传输层协议UDP

news2024/11/10 10:55:36

        本篇将主要介绍 UDP 协议,介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项,以及有关 UDP 的 Socket 编程程序,同时重点介绍了操作系统对于 UDP 协议报文的管理。

        接着介绍了有关端口号的映射。

目录

UDP协议

1. UDP协议报头

2. UDP协议特点

3. UDP的缓冲区

4. OS对UDP报文的管理

4. UDP 使用的注意事项

5. 基于UDP的应用层协议

6. 基于UDP协议的程序 

端口号的映射

1. 端口号范围划分

2. 端口号与进程的映射

UDP协议

        对于 UDP 报文的格式如下:

1. UDP协议报头

        对于如上 UDP 报文,分别由 16 位的源端口,目的端口,UDP 长度以及 UDP 校验和组成,这样的一个组成在 Linux 源码其实也已经将其抽象为了一个结构体,如下:

        对于 16 位 UDP 长度,表示整个数据报(首部 + 数据)的最大长度;若校验和出错,就会直接将该 UDP 数据包给丢弃。

        通过如上的 UDP 报文结构我们也可以得出,若我们想要将报头和有效载荷进行分离,只需要将前 8 个字节截断即可,因为这是固定长度的报头。当需要将数据向应用层进行分用的时候只需要通过 16 位目的端口和进程的映射就可以直接将数据传输上去。

        那么我们在接收对应的 UDP 报文数据之后,如何轻易的拿到首部中的四个数据呢?我们只需要使用一个 struct udphdr * 一样的指针接收对应的报文,然后就可以拿出对应的四个首部数据了,通过该方法拿出数据,我们只需要注意网络序列的转化,不用担心在不同的操作系统下不兼容的情况,因为所有的操作需求都是由 C 语言写的。

2. UDP协议特点

        UDP 传输协议一共有以下 3 个特点:

无连接:只要知道对方的 IP 和 PORT 就可以直接进行传输,不需要双向进行连接

不可靠:没有数据确认机制,没有数据丢失后的重传机制,如果因为网络故障该段无法发送到对方,UDP 协议层也不会给应用层返回任何的错误信息

面向数据报:不能够灵活的控制读写数据的次数和数量

         对于以上的不可靠并不能代表这是 UDP 协议的一个缺点,最好将其认识为 UDP 数据报的一个特点,因为不可靠的同时,带来的是传输速率的提高。

        对于面向数据报而言,每一个数据报都是独立的个体,也就是应用层向下发送多大的数据,UDP 就包装多大的数据,并不会将传下来的数据拆分或者合并后在封装(同时,如果在发送端调用 sendto 发送了 100 个字节,那么接收端也必须使用 recvfrom 一次接收 100 个字节的数据,不能分多次来接收)。

3. UDP的缓冲区

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

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

4. OS对UDP报文的管理

        我们的传输层是属于操作系统内核中的,同时说明对于 UDP 协议的接收缓冲区也是在 OS 中的,在操作系统中可能有着很多的 UDP 数据报在其中,有的数据报存储在缓冲区中准备向上交付,有的数据报正从上层向下传输,这个时候 OS 中充满了 UDP 数据报,这个时候 OS 就会对其进行管理,使用 struct sk_buff 结构体对 UDP 数据报进行管理,管理方法如下:

        在操作系统内会存在一个管理 UDP 数据报的一个结构体 struct sk_buff,同时这个结构体还有一个缓冲区,结构体中的 head 和 data 指针起初都是指向缓冲区的中间,当有数据从应用层向下交付的时候,先将数据拷贝到缓冲区,然后 head 指针向前移动 8 个字节,接着将 UDP 首部的四个数据给填充即可,同时这样的 sk_buff 结构体不止一个,每个结构体之间使用指针相连接,如下:

4. UDP 使用的注意事项

        我们在 UDP 报头中有一个 16 位的报文长度,也就是说对于一个 UDP 能传输的数据最大长度为 64K(包含首部)。但是在当今的互联网环境下,64K 的数据是一个很小的数据量,所以当我们需要传输的数据超过 64K 的时候,就需要在应用层将数据手动分包,分多次发送,并在接收端手动拼装。

5. 基于UDP的应用层协议

        常见的基于 UDP 协议的应用层协议如下:

NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议

        同时还包括自己写的基于 UDP 协议的程序。

6. 基于UDP协议的程序 

        如下是一个基于 UDP 协议写的三个程序:UDP/TCP --- Socket编程-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_74830524/article/details/141218715?spm=1001.2014.3001.5501        以上链接便是写的三个程序。

端口号的映射

        对于端口号而言,它标识了一个主机上进行通信的不同的应用程序。特别是在 TCP/IP 协议中,用:源 IP + 源端口号 + 目的 IP + 目的端口号 + 协议号 这五元组来标识一个通信,如下:

1. 端口号范围划分

        对于端口号而言都是 16 位的一个数据,所以一个端口号的范围为:0 ~ 65535,但是其中也分为知名端口号和普通端口号。如下:

0 - 1023:知名端口号,HTTP、FTP、SSH 等这些广为使用的应用层协议,他们的端口都是固定的
1024 - 65535:操作系统动态分配的端口号,客户端程序的端口号,就是操作系统从这个范围分配的

        对于知名端口号而言,我们平时写的程序并不能绑定这些端口号,如下:        

        当想要绑定知名端口号的时候,就会显示权限不够,只有当使用 root 权限才能绑定知名端口。

        其中常见的知名端口号有以下这些:

ssh 服务器:使用22号端口
ftp 服务器:使用21号端口
telnet 服务器:使用23号端口
http 服务器:使用80号端口
https 服务器:使用443号端口

        使用命令 cat /etc/services 就可以看见知名端口号:

2. 端口号与进程的映射

        一个端口号只可以绑定一个进程,但是一个进程可以绑定多个端口,如下:

        如上所示,对于端口号而言其实就像一个已经安排的 hash 表,在表中存储着对应的进程,当传输信息向上传递的时候,找到对应的端口之后就可以直接找到与端口绑定的进程。

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

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

相关文章

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。 在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中…

哲学概述2(马克)

三、哲学的基本问题 思维是主观的(对应意识) 存在是客观的,不以人的意志为转移(对应物质) 恩格斯说:“全部哲学,特别是近代哲学的重大的基本问题,是思维和存在的关系问题” 哲学的基…

HTML生日蛋糕

目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽&#xff0c;小编亲测&#xff0c;发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福&#xff0c;快拿去送给你的好朋友吧&#xff01; 完整代码 <!DOCTYPE html>…

Python中的位运算-从入门到精通

你是否曾经好奇过计算机是如何在底层处理数据的?或者,你是否想知道为什么有些程序员总是津津乐道于位运算的强大?如果是,那么你来对地方了!今天,我们将深入探讨Python中的位运算,揭示它们的神奇之处,以及如何利用它们来优化你的代码。 目录 位运算:计算机的秘密语言为什么位…

JavaScript Web API入门day6

目录 1.正则表达式 1.1 什么是正则表达式 1.2 语法 1.3 元字符 1.3.1 边界符 1.3.2 量词 1.3.3 字符类 1.4 修饰符 1.5 案例 2.综合案例 2.1 小兔鲜页面注册 2.2 小兔鲜登录页面 2.3 小兔鲜首页页面 1.正则表达式 1.1 什么是正则表达式 正则表达式&#xff08;Re…

Chapter 12 Vue CLI脚手架组件化开发

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一&#xff0c;Vue CLI为开发者提…

会声会影哪个版本最新

会声会影2023永久免费版能通过多种不同的特效的添加和项目的编辑和处理&#xff0c;能迅速的帮助用户能实现多种不同格式下的结果的提升&#xff0c;让用户能直接的完成相应的帮助和完善提升。 会声会影2023永久免费版简介&#xff1a; 会声会影2023永久免费版是一款简单的视频…

多模态在京东内容算法上的应用

多模态在京东内容算法上的应用 作者&#xff1a;京东零售技术 2024-09-04 北京 本文字数&#xff1a;5226 字 阅读完需&#xff1a;约 17 分钟 本文作者唐烨参与 DataFunsummit2024&#xff1a;推荐系统架构峰会&#xff0c;在专题【多模态推荐论坛】中分享了多模态算法在京…

如何在Word中插入复选框

如何在Word中插入复选框&#xff1a;详细教程与技巧 在Word中插入复选框是一项非常实用的技巧&#xff0c;尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时&#xff0c;复选框不仅能提高文档的功能性&#xff0c;还能显得更加专业。本文将详细讲解…

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…

各类AI工具编程能力测试对比

各类AI工具编程能力对比 现在各类AI工具火爆&#xff0c;擅长各类问题解决&#xff0c;闲来无事&#xff0c;验证下各类AI工具的编程能力如何。问题&#xff1a;c 实现杨辉三角&#xff0c;并main函数测试 kimi 对话窗口输入问题&#xff0c;得到了c的完整程序&#xff1a; …

JS面试真题 part2

JS面试真题 part2 6、typeof 与 instanceof 区别7、JavaScript原型&#xff0c;原型链&#xff1f;有什么特点8、说说你对作用域链的理解9、谈谈this对象的理解10、说说new操作符具体干了什么 6、typeof 与 instanceof 区别 自己回答&#xff1a; typeof&#xff1a;用来判断数…

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

数字证书与公钥基础设施

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;数字证书 数字证书是由第三方可信机构&#xff08;一般是证书服务器&#xff09;颁发的数字证书&#xff0c;可以证明身份的可信度。 数字证书具有以下特点以及性质&#xff1a…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式&#xff08;一&#xff09;程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例…

树状数组记录

树状数组&#xff08;Fenwick Tree&#xff09;是一种用于维护数组前缀和的数据结构&#xff0c;支持高效的单点更新和区间查询操作。它的查询和更新时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;适用于需要频繁更新和查询的场景。 树状数组的基本操作 单点更…

HCIA--实验五:静态路由综合实验

静态路由综合实验 一、实验内容&#xff1a; 1.需求/目的&#xff1a; 在ensp模拟器中使用四个路由器&#xff0c;并且在路由器上创建loopback接口&#xff0c;相当于连接了一台主机&#xff0c;通过配置静态路由的方式实现全网通。 二、实验过程 1.道具&#xff1a; 4个…

基于 AC 驱动的电容结构 GaN LED 模型开发和应用

随着芯片尺寸减小&#xff0c;微小尺寸GaN 基 Micro LED 显示面临着显示与驱动高密度集成的难题&#xff0c;传统直流&#xff08;DC&#xff09;驱动技术会导致结温上升&#xff0c;降低器件寿命。南京大学团队创新提出交流&#xff08;AC&#xff09;驱动的单电极 LED&#x…

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类 class User(UserMixin):def __init__(self, id):self.id idapp.route(/login) def login():# 模拟用户登录过程user User(1)login_user(user)from flask…