UDP协议基本原理

前言

        本文主要讲解传输层中的UDP协议,我准备从UDP的特点出发,深入理解UDP协议,从UDP协议的结构推出UDP协议的特点;

一、理解端口号

        前面我们总是说用IP加端口号的方式定位全网的唯一进程,通常在TCP/IP中,我们使用(源IP、源端口号、目的IP、,目的端口号、协议号)这样的一个五元组来标识一个通信;其中源IP与源端口号告诉对端发送方的主机与主机上哪一个进程,目的IP与目的端口了解我要去哪一台主机和主机上哪一个进程,协议号标识我们使用哪一种协议;

1、端口号的划分

        我们在使用端口号时,并不是所有端口号我们都可以使用,有一类端口号被称之为熟知端口号,这类端口号的范围是1~1023,我们可以在Linux机器上的 /etc/services 中查看这些端口号;

        另一类叫做登记端口号,这种端口号数值范围为1024~49151,要使用这类端口号必须在IANA按照规定的手续登记;

        最后一类就是客户端使用的端口号,数值范围为49152~65535,这类端口号就是临时端口号,因此又叫做短暂端口号,留给客户进程选择临时使用,用完后归还;

2、netstat的使用

        netstat是我们进行网络编程的一个非常重要指令,该指令可以当前机器的网络状态;

常用选项:

n:拒绝显示别名,能显示数字就显示数字

l:仅列出处于监听(listen)状态的服务状态

p:显示建立相关连接的程序名

t:显示tcp相关选项

u:显示udp相关选项

a:显示所有选项,默认不显示listen相关;

二、UDP协议

1、UDP协议的特点

        首先补充以下UDP协议的特点,以下为UDP协议特点;

(1)无连接

(2)不可靠

(3)面向数据报

        前面的文章我们也有简单提过UDP的这三个特点,下面我们来详细解剖UDP的特点;

2、UDP协议格式

        UDP报文格式如下图所示;

源端口:发送方的端口号;

目的端口:接收方的端口号;

UDP长度:包括首部长度和数据长度;

UDP校验和:判断整个报文是否正确,若报文有误则直接抛弃;

        首先我们要考虑的是如何实现UDP报文的封装和分离;仔细观察UDP报头的格式,我们发现报头的首部长度为固定的8字节,因此,我们可以首先提取出首部,然后我们再读取其中UDP长度字段,然后减去首部长度,剩下就是我们应该提取数据的长度;封装就更简单了,我们首先计算出数据长度,然后填充报头中字段;

        看了上面的内容有没有想到UDP面向数据报的特点,正是因为我们对UDP报文长度是可预知的,我们可以提取出整个报文长度,所以我们可以将整个数据报整体发送,整体接收;

3、UDP的缓冲区

        从某种意义上来说UDP协议并没有发送缓冲区,当我们上层调用sendto接口时,到了传输层这里,若为使用UDP协议,则封装完报头后直接发送了,并不需要发送缓冲区;但UDP有接收缓冲区,不过UDP的接收缓冲区一旦满了以后,收到任何UDP报文都直接丢弃;

        UDP的socket既能读也能写,且能同时进行,是全双工通信方案;

        从上面种种来看,UDP协议设计的非常简单,从校验和检测不对直接丢弃,到接收缓冲区满后也直接丢弃,种种来看,UDP是一种“不可靠”的协议;这里的不可靠千万不能理解成贬义词,这里的不可靠为中性词,也正是UDP的这种简单不可靠,免去了UDP在维护可靠性所花费的成本,如UDP无连接,而后面所学习的TCP有连接正是维护可靠性所花费的成本;

4、理解UDP报文本身

        我们可以以下面这种方式来理解UDP报文;

struct Udp_header
{uint16_t _src_port;uint16_t _dst_port;uint16_t _udp_len;uint16_t _udp_check;
};

        所谓封装就是填充上述结构体后,在加上上层该付给该层的消息;所谓分离,我们可以理解为去掉前面报头的长度,也就是8字节,然后提取内容,内容的大小为 _udp_len - 8 ;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:基础知识]

分类目录:《系统学习Python》总目录 我们在前面的文章中编写了第一个基于类的tracer函数装饰器的时候,我们简单地假设它也应该适用于任何方法一一一被装饰的方法应该同样地工作,并且自带的self实例参数应该直接包含在*args的前面。但这一假设…

在多Module项目中,给IDEA底部选项卡区域添加Services选项卡

一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时,如果要调试测需要依次启动各个项目比较麻烦。 idea其实提供了各module的启动管理工具了,可以快速启动和关闭各个服务,也能批量操作,比如一次…

简单FTP客户端软件开发——VMware安装Linux虚拟机(命令行版)

VMware安装包和Linux系统镜像: 链接:https://pan.baidu.com/s/1UwF4DT8hNXp_cV0NpSfTww?pwdxnoh 提取码:xnoh 这个学期做计网课程设计【简单FTP客户端软件开发】需要在Linux上配置 ftp服务器,故此用VMware安装了Linux虚拟机&…

普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)

简介 买了HI-LINK-V20型号的离线语音识别模块, 为了后面可以做有意思的东西, 现在先来用用, 使用USART2 串口 接收来自我在HI-LINK-V20中预设的动作, 当识别到词条时发送对应的指令到串口, HI-LINK串口接的就是STM32F03ZET6的USART2, 且往下看。 电路原理图 连线图 连线引脚表…

【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐,再见2023,加油2024,未来可期,愿新的一年带来健康、幸福和成功!💪 💪💪 多种设备之间能够实现硬件互助、资源共享,依赖的关键技术包括分布式软总线、分布式设备虚…

LM386简易OCL功放电路

LM386简易OCL功放电路是使用低功耗集成功率放大器LM386构成的OCL功放电路,电路结构简单,容易调试,非常适于自制。 电路工作原理:图中IC1和IC2是两片集成功放LM386,接成OCL电路。C1起到电源滤波及退耦作用,C…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结: 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

记一次Oracle Cloud计算实例ssh恢复过程

#ssh秘钥丢失# , #Oracle Cloud# 。 电脑上的ssh秘钥文件不知道什么时候丢失了,直到用的时候才发现没有了,这下可好,Oracle Cloud的计算实例连不上了,这个实例只能通过ssh连接上去: 以下是解决步骤&#x…

【PTA-C语言】编程练习6 - 结构体与共用体 - 函数题

如果代码存在问题,麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习6 - 结构体与共用体 - 编程题 7-1 查找书籍(分数 20)7-2 一帮一(分数 15)7-3 计算职工工资(分数 15) 7-1 查找书籍&#xff08…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行,拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些,他们两个可以相互调用,在真实情况下也是可以cs和msf同时启动的, cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件,升级AI算法,并支持多人及全身磨皮美化模式,推荐…

Python爬虫---selenium基本使用

为什么使用selenium? 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中,就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…