当前位置: 首页 > news >正文

【网络】UDP协议

【网络】UDP协议

文章目录
  • 一. 初识UDP
    • 1. UDP简介
    • 2. UDP协议的特点
      • 特点一:无连接
      • 特点二:不可靠
      • 特点三:面向数据报
    • 3. UDP报文的格式
    • 4. UDP的缓冲区
    • 5. 基于UDP实现的用户层协议
  • 二. UDP报文中各个字段
    • 1. 原端口号与目的端口号(16位)
      • 1.1 认识端口号
      • 1.2 端口号范围划分
      • 1.3 UDP中端口号字段的作用
    • 2. UDP长度(16位)
    • 3. UDP校验和(16位)
      一. 初识UDP

1. UDP简介

UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。
UDP 提供了不面向连接的通信,且不对传送的数据报进行可靠的保证,适用于一次传送少量的数据,不适用于传输大量的数据。
UDP属于网络协议栈中的传输层协议,直接负责数据的传输和接收:

2. UDP协议的特点

特点一:无连接

两台主机在使用UDP进行数据传输时,不需要建立连接,只需知道对端的IP和端口号即可把数据发送过去。

特点二:不可靠

UDP协议没有没有确认重传机制,如果因为网络故障导致报文无法发到对方,或者对方收到了报文,但是传输过程中乱序了,对方校验失败后把乱序的包丢了,UDP协议层也不会给应用层任何错误反馈信息。
PS:在网络中,“不可靠”是个中性词,因为可靠就意味着要付出更多的代价去维护可靠,实现起来会复杂很多;而“不可靠”的话,实现起来会更简单。

特点三:面向数据报

UDP传输数据时,是以数据报文为单位一个个地发出去,然后一个个地接收的,这导致上面应用层无法灵活控制数据数据的读写次数和数量。

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

3. UDP报文的格式

具体每个字段的细节会在下文中介绍

理解报头
UDP协议属于内核协议栈,而内核是用C语言写的,在底层UDP的报头是一个位段类型的结构体

4. UDP的缓冲区

  • UDP没有真正意义上的发送缓冲区。调用sendto会直接把数据交给内核,简单包装后由内核将数据传给网络层协议进行再后续的传输动作。
  • UDP具有接收缓冲区
    • 这个接收缓冲区不能保证收到的UDP报文顺序和发送时UDP报文的顺序一致。比如我们网购多件商品,不是说谁先发货就先收到那个包裹,这些包裹运输途中的路径、运输方式、中转时间等都是不一样和不确定的;UDP发出去的报文也要经过各种路由转发,每个报文选择的路径并非是一样的,这也导致了UDP报文实际发的顺序和最终收的顺序不一定一致。
    • 如果接收端来不及收或收的慢的话,会导致UDP的接收缓冲区存满,之后到达的UDP报文因为无法存下而只能把它丢弃。

5. 基于UDP实现的用户层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议
    二. UDP报文中各个字段

1. 原端口号与目的端口号(16位)

1.1 认识端口号
  • IP:32位无符号整数,用来标识公网中唯一的一台主机
  • 端口号:16位无符号整数,标识了主机中唯一的一个进程
    在TCP/IP协议中,用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信

netstat命令介绍
功能:查看当前主机下的网络状况
语法:netstat[选项]
常用选项

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在 Listen(监听)的服务状态
  • p 显示建立相关链接的程序名
  • t (tcp)仅显示tcp相关选项
  • u (udp)仅显示udp相关选项
  • a (all)显示所有选项,默认不显示Listen相关
    示例

端口号和进程的关系

  • 一个进程可以绑定多个端口号
  • 一个端口号只能被一个进程绑定
    实际需要:通过端口号来找进程,所以要确保端口号到进程的唯一性;而实际中不会有通过进程来找端口号的情况,所以不关心进程绑定了多少个端口号
1.2 端口号范围划分

端口号一共有 2^16 = 65536 个,其中前面的端口号被分配给了一些常用的协议。

  • 知名端口号(0 - 1023): HTTP、FTP、SSH等这些广为使用的应用层协议,它们的端口号都是固定的
  • 其他端口号(1024 - 65535): 这个范围内的端口号是在我们使用时,由操作系统从动态配的

认识知名端口号
在网络中,有些服务器是经常被大家都用到的,这时为了使用方便,人们给这些服务器约定俗成地绑定了一些特定的端口,之后大家使用这些服务时,通过端口号就能直接知道你所使用的服务类型是什么。
下面是一些知名端口及其所对应的服务类型,我们自己写程序需要设置端口号时,注意避开这些知名端口号:

  • ssh服务器,使用22端口
  • ftp服务器,使用21端口
  • telnet服务器,使用23端口
  • http服务器,使用80端口
  • https服务器,使用443端口
    我们可以通过命令:less /etc/services来查看所有知名端口和它们对应的服务:
1.3 UDP中端口号字段的作用

有了目的端口号,就能找到对应的服务器进程,然后在这个进程上获取服务,此外还可以把自己的端口号(源端口号)告诉服务器,服务器得到后也可以向源客户端进程发送数据,这样双方就能全双工的通信了。

问题:UDP如何决定,将自己的有效载荷交付给上层的那个进程呢?

  1. 分割8字节的定长报头,然后拿到里面的16位目的端口号
  2. 系统中有一个长度为65536的数组hash,根据下标(端口号)直接定址法存储对应进程的PCB(进程控制快)
  3. 通过hash[目的端口号]直接可以找到对应的服务进程

2. UDP长度(16位)

UDP协报头中有一个16位的最大长度的字段,也就是说一个UDP报文能传输的数据最大长度是64K(包含UDP首部)
然而64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

UDP把数据包交给应用层后,应用层如何让报头和有效载荷分离?
先读取8字节的定长报头,在读取里面的16位UDP长度字段,减去8字节后得到的就是有效载荷的长度,知道了报头和有效载荷的大小就能把二者明显地区分开了。

3. UDP校验和(16位)

报文在进行网络传输时,会经过各种传输线、路由器、信号放大器等传输介质,且随着网络的状况不同,每个包具体选择的路径也不一样。在网络传输中,受到外界干扰,数据可能会出错,比如某几个位置的数据发生了乱序,0变成1,1变成0;因此,在接收方收到数据后,就需要先确认一下,这个报文数据是否在传输过程中发送了乱序。校验和就是简单有效的方式。

实际的校验和,不仅仅是一个”长度“,而是根据数据的内容来生成的。当内容发生改变的时候,就能感知出错误。
UDP的校验和具体是怎么实现的呢?使用了一种简单粗暴的循环冗余校验(Cyclic Redundancy Check, CRC)算法:

加着加着,可能就溢出了~~溢出也无所谓。所有字节都加了一遍,最终就得到了校验和。传输数据的时候,就会把原始数据和校验和一起传递过去。接收方收到数据,同时也收到了发送端送过来的校验和(旧的校验和)。接收方按照同样的方式再算一遍,得到新的校验和。如果旧的校验和和新的校验和相同,就可以认为数据传输过程中是正确的。如果不同,则视为传输过程中数据出错了。
但是,有时候会出现,校验和相同,但是传输的数据和发送时候的数据不同,也就是数据发生了乱序,但校验和是对的。
比如:好巧不巧,某个字节,多了1。某个字节,少了1。二者相加,正好抵消。
此校验和方法并不是那么严谨,但在工程上,也是够用的。

《网络安全从零到精通全套学习大礼包》

96节从入门到精通的全套视频教程免费领取

如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。

网络安全学习路线图

想要学习 网络安全,作为新手一定要先按照路线图学习方向不对,努力白费。对于从来没有接触过网络安全的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线,大家跟着这个路线图学习准没错。

配套实战项目/源码

所有视频教程所涉及的实战项目和项目源码

学习电子书籍

学习网络安全必看的书籍和文章的PDF,市面上网络安全书籍确实太多了,这些是我精选出来的

面试真题/经验

以上资料如何领取?

g.cn/direct/92a6ab8e26034045b97ae8ac36b2a650.png)

以上资料如何领取?

http://www.jsqmd.com/news/682533/

相关文章:

  • WeChatPad终极指南:免Root实现微信平板模式与双设备登录
  • 2026数字水帘行业发展现状与优质厂家推荐 - 深度智识库
  • ACE-Step使用技巧:掌握这几个参数,让你的AI音乐更专业
  • 剖析2026年安宁二手房改造专业公司,欢乐百佳装饰价格透明选哪家 - 工业设备
  • 终极Beyond Compare 5密钥生成指南:快速激活与完全使用教程
  • 74HC595芯片手册没细讲的事:级联驱动点阵屏时的时序与消隐问题实战
  • 仅剩3%团队真正启用镜像签名!深度拆解Docker Content Trust弃用后,Cosign替代方案的5层可信验证架构
  • 解决 apt 安装报错后,我顺手整理了这份 Linux 包管理器的‘避坑’备忘录
  • 2026雾森系统哪家好?喷雾造景优质厂家推荐指南 - 深度智识库
  • 研发场景十大热门 Skill 推荐
  • 云原生时代的智能告警治理:Keep构建企业级可观测性平台
  • 2025届毕业生推荐的十大降AI率助手推荐
  • 2026年口碑不错的全案装修品牌企业,安宁选购要点有哪些 - 工业品网
  • FLUX.1-Krea-Extracted-LoRA基础教程:Streamlit session_state状态管理技巧
  • 别再空谈概念了!用Python+Unity3D,手把手教你搭建一个简易的智慧交通数字孪生Demo
  • 估值70亿的工业AI独角兽,正在造工厂的AI大脑 - 品牌企业推荐师(官方)
  • 国际商务舱及团队多人机票省钱预订实操指南 - 品牌企业推荐师(官方)
  • 【征稿启事】2026年航空航天电子信息与智能系统国际学术会议(AEIIS 2026)
  • 从腾讯云镜的Agent脚本,我学到了Go程序内存回收和保活的实战技巧
  • 从txt点云到3D可视化:用VS2019+PCL 1.12.0跑通你的第一个点云程序
  • Docker低代码配置安全红线(CNCF认证工程师紧急预警:3个高危默认值正在泄露你的K8s集群)
  • VS2019编译Qt报错:clxx: fatal error C1083:无法打开源文件 A.cpp
  • 5分钟掌握AI语音克隆:GPT-SoVITS零基础入门完全指南
  • 如何快速解密JSXBIN:面向开发者的完整反编译指南
  • 分享2026年安宁装修实力公司,好用的装修公司这样选 - 工业推荐榜
  • MySQL配置优化:为Qwen3-ASR-0.6B日志与结果存储数据库调优
  • 3步实现本地分屏游戏:NucleusCoop让单机游戏变多人同屏神器
  • 【独家首发】基于eBPF的Docker AI容器实时监控配置模板(附Grafana看板+Prometheus告警规则YAML包)
  • 2026泥浆泵厂家权威推荐:山东中探领跑矿山疏浚核心设备标杆榜 - 品牌企业推荐师(官方)
  • 3分钟让你的Mac鼠标滚动像触控板一样丝滑:Mos使用全攻略