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

计算机网络 — UDP协议(看这一篇就可以

UDP协议

UDP是传输层的重要协议之一,另一重要协议为TCP协议。两者对比:TCP协议复杂,但传输可靠。UDP协议简单,但传输不可靠。

UDP协议全称为:User Datagram Protocol(用户数据报协议)。

它是一个简单的面向数据报的传输层协议。提供的是无连接的、不可靠的数据流传输。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP是传输层协议,这意味着UDP的数据包需要经过IP协议的封装,然后通过IP协议传输到目的电脑。随后UDP包在目的电脑拆封,并将信息送到相应端口的缓存中。

UDP的特点

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

无连接

无连接指的是:UDP传输知道对应的IP和端口号就可以直接进行传输,不需要建立连接。

理解“无连接”特性:

因为使用UDP协议的发送方和接受方之间不需要存在长期的联系。它们没有建立连接这个过程,整个消息传输过程简单来说就是“发送即结束”。在UDP协议传输的过程中,可以向某一个服务器端口发起接收数据申请,然后在下一次再向另外一个端口发起申请。

这样一来,一个UDP服务器接口可以在一段时间内接受多个客户端发送的请求,同样的一个UDP服务器可以从若干个不同的客户接收数据报。

不可靠

不可靠指的是UDP协议没有任何安全机制,发送端发送数据报后,如果出现丢包等现象,UDP协议层也不会给应用层返回任何错误信息。

只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。

面向数据报

应用层交给UDP多长的报文,UDP会将其原样发送,既不会拆分,也不会将其合并。

如果,发送端一次性发送1000个字节,那么接收端也必须一次性接收1000个字节,不能将其拆为100份,每份10字节,每次接收一份。

缓冲区

UDP只有接收缓冲区,没有发送缓冲区。

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

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

大小受限

UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据的最大长度是64K(包含了UDP的首部)。

这是UDP在使用中的一个致命缺陷,也就是说UDP无法直接表示一个比较大的数据报。

解决方法:

可以在应用层,针对大的数据报进行分包(拆分成多个部分),然后再通过多个UDP数据报分别发送(但是这样子无法保证顺序)接收方再将收到的几个包拼接成完整的数据。

上述这种方式是下策。

上策是:将其改成TCP协议,TCP协议没有这样的长度限制。

基于UDP的应用层协议

  • NFS:网络文件系统

  • TFTP:简单文件传输协议

  • DHCP:动态主机配置协议

  • BOOTP:启动协议

  • DNS:域名解析协议

......

UDP协议报文格式

实际格式:

源端口号和目的端口号

用来标记发送和接受的应用进程。因为UDP不需要应答,所以源端口是可选的,如果源端口不用,那么置为零。

当运输层从IP层收到UDP数据报时,就是根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点--应用程序。

UDP长度

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

UDP校验和

校验和用来验证网络传输的这个数据是否是正确的,本质上是光信号和电信号(会被外界因素干扰,导致信号出错)。

校验和正确,不能保证数据100%是对的,但校验和不正确,数据100%是不对的。

UDP网络编程模型

http://www.lryc.cn/news/19779.html

相关文章:

  • Pikachu靶场(暴力破解)
  • 浅谈script,link,import,@import引入
  • 【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )
  • 12.STM32系统定时器-SysTick
  • 28张图讲解支付系统的通用设计,漂亮!
  • 【5】linux命令每日分享——touch创建文件
  • TypeScript快速上手语法+结合vue3用法
  • 一,下载iPerf3最新源代码
  • keithley6487/吉时利6487皮安表
  • sql命令大全
  • Ubuntu 定时执行脚本
  • Python带你制作一个属于自己的多功能音乐播放器
  • Redis 被问麻了...
  • 使用JavaScript+Selenium玩转Web应用自动化测试
  • [架构之路-119]-《软考-系统架构设计师》-计算机体系结构 -1- 基本原理(体系结构、指令系统与流水线、层次存储)
  • 【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】
  • 你知道Java架构师学习路线该怎么走吗?你所缺少的是学习方法以及完整规划!
  • 华为OD机试用Python实现 -【查找树中的元素 or 查找二叉树节点】(2023-Q1 新题)
  • MyBatis——创建与使用
  • 【涨薪技术】0到1学会性能测试 —— 参数化关联
  • go进阶(2) -深入理解Channel实现原理
  • 数组(二)-- LeetCode[303][304] 区域和检索 - 数组不可变
  • 22-基于分时电价条件下家庭能量管理策略研究MATLAB程序
  • “XXX.app 已损坏,打不开。您应该将它移到废纸篓”,Mac应用程序无法打开或文件损坏的处理方法(2)
  • flask入门-3.Flask操作数据库
  • STM32 使用microros与ROS2通信
  • 51单片机入门 - 测试:SDCC / Keil C51 会让没有调用的函数参与编译吗?
  • 【计算机网络】计算机网络
  • 【java web篇】项目管理构建工具Maven简介以及安装配置
  • springboot笔记