UDP协议介绍

2023-11-17

UDP 是一个简单地面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。

UDP 不提供可靠性,它把应用程序传给 IP 层的数据发送出去,但是并不保证他们能到达目的地。

UDP数据报封装成一份IP数据报的格式:
UDP封装.png
UDP封装.png
UDP首部:
UDP首部.png
UDP首部.png
端口号表示发送进程和接收进程,TCP端口号与UDP端口号是相互独立的。(不过有时候TCP和UDP同时提供某种致命服务的时候,两种协议通常选择相同的端口号,纯粹是为了方便。)
UDP长度字段指的是UDP首部和UDP数据报的字节长度,该长度最小值为8字节(发送一分0字节的UDP数据报是OK),这个UDP长度是有冗余的。
IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP首部的长度
UDP检验和:
UDP检验和是一个端到端的检验和,它由发送端计算,然后由接收端验证,其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。
UDP检验和覆盖UDP首部和UDP数据。而IP首部的检验和,它只覆盖IP的首部—并不覆盖IP数据报中的任何数据。
UDP和TCP在首部中都有覆盖它们首部和数据的检验和,UDP的检验和是可选的,而TCP的检验和是必需的。
UDP检验和的计算方法与IP首部检验和计算法法类似,但也有不同
1、UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16bit字节相加。解决方式是必要时在最后增加填充字节0,这只是为了检验和的计算
2、UDP和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。
伪首部包含IP首部一些字段。其目的是让UDP两次检查数据报是否已经正确到达目的地。
UDP校验和计算.png
UDP校验和计算.png

注意:UDP数据报的长度在检验和计算过程中出现了2次
如果检验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的,如果传送的检验和为0,说明发送端没有计算检验和。
如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做)

校验和计算:
发送方的UDP对报文段中的所有16比特字对和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。

比如,假定有下面三个16比特的字:
0110011001100000
0101010101010101
1000111100001100

这些16比特字的前两个之和是:
1011101110110101

再将该和与第三个16比特字相加,得出:
10100101011000001

发现溢出了,该和就要被回卷,即把首位的1加到最后一位去,得出:
0100101011000010

然后对其进行反码运算,所谓反码运算,即是将所有的1换成0,0换成1
1011010100111101

这就是得出的检验和。而在接收方,全部的4个16比特字(包括检验和)加在一起。如果分组中没有引入差错,显然在接收处该和将是1111111111111111。而如果这些比特之一是0,那我们就知道该分组中出现了差错。
UDP在端到端基础上在运输层提供差错检测,这就是在系统设计中被称颂的端到端原则
而UDP虽然提供差错检测,但它对差错恢复无能为力。这就需要用到可靠数据传输–TCP了

IP分片:
物理网络层一般都要限制每次发送数据帧的最大长度,任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU,IP把MTU与数据报长度进行比较。如果需要则进行分片,分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一份IP数据报分片后,只有到达目的地才进行重新组装。
重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP、UDP)是透明的。
对于发送端发送的每份IP数据报来说:
其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。
标志字段用其中一个比特来表示“更多的片”,除最后一片外,其他每个组成数据报的片都要把该比特置1
片偏移字段指的是该片偏移原始数据报开始处的位置。
当数据报被分片后,每个片的总长度值要改为该片的长度值
最后,标志字段中有一个比特称作“不分片”位,如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)给起始端。
当IP数据报被分片后,每一片都称为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片
UDP分片举例:
UDP_IP分片.png
UDP_IP分片.png

ICMP 不可达差错:
发生ICMP不可达差错的另一种情况是,当路由器受到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。
这个差错可以用来判断到达目的端路途中最小MTU是多少,也称其为路径MTU发现机制。

UDP 服务器的设计:
客户 IP 地址及端口号:
来自客户的 UDP 数据报,IP 首部包含源端和目的端 IP 地址,UDP 首部包含了源端和目的端的 UDP 端口号。这一特性允许一个交互 UDP 服务器对多个客户进行处理。
目的 IP 地址:
一些应用程序需要知道数据报是发送给谁的,即目的 IP 地址。这要求操作系统从接收到的 UDP 数据报中将目的 IP 地址交给应用程序,但是并非所有的实现都提供这个功能。
UDP 输入队列:
通常程序所使用的每个 UDP 端口都与一个有限大小的输入队列相联系,即来自不同客户的差不多同时到达的请求将由 UDP 自动排队。但是,排队溢出造成内核中的 UDP 模块丢弃数据报的可能性是存在的。
限制本地 IP 地址:
大多数 UDP 服务器在创建 UDP 端点时都使其本地 IP 地址具有通配符的特点,这就表明进入 UDP 数据报如果其目的地为服务器端口,那么在任何本地接口均可接收到它。
当服务器创建端点时,他可以把其中一个主机本地 IP 地址包括广播地址指定为端点的本地 IP 地址,只有当目的 IP 地址与指定的地址相匹配时,进入的 UDP 数据报才能被送到这个端点。
有可能在相同的端口上启动不同的服务器,每个服务器具有不同的本地 IP 地址,但是,一般必须告诉系统应用程序重用相同的端口号没问题,在 sock 程序中是通过 -A 选项来完成的。
限制远端 IP 地址:
UDP 服务器本身可以创建三类地址绑定:

本地地址 远端地址 描述
localIP.Iport foreignIP.fport 只限一个客户
localIP.Iport *.* 限于到达一个本地接口的数据报:localIP
*.Iport *.* 接收发送到 Iport 的所有数据报

Iport 指的是服务器有名端口号,localIP 必须是本地接口的 IP 地址。表中这三行的排序是 UDP 模块在判断用哪个端点接收数据报时所采用的顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP协议介绍 的相关文章

  • 对课程学习的期待

    我希望通过学习这门课程之后 自己可以设计出一些简单的程序 有利于之后的学习 例如 网络爬虫和一些有关于数据 图像处理的程序 我希望在理论课上老师可以通过一些有趣的示例来讲解课程内容 我认为这样可以更好的抓住学生的注意力而且可以使我们更容易理

随机推荐

  • 【无需显卡】AI绘画入门教程

    前言 Hello 各位端午节快乐呀 不好意思拖更两个月 最近实在是太忙了 也想不到有什么好玩的 之前介绍过了几个好玩的ai网站 非常适合新手尝鲜 但很多都有额度限制 而且还开始收费了 所以有了这期教程 还没看过上期可以看一下 除了ChatG
  • socks协议详解

    0x01 socks协议简介 Socks Socket Secure 协议是一种网络协议 处于会话层 用于管理网络连接并提供安全性和隐私保护 通过使用Socks代理服务器 客户端可以隐藏其真实IP地址和其他身份信息 从而匿名地访问互联网上的
  • php命令行传递参数,PHP命令行传递参数

    在以非命令行模式运行PHP的时候 我们可以通过 GET POST REQUEST来接受get或是post参数 但是以命令行方式运行的话 怎么传递参数以接受参数呢 关于命令行的特点 可以直接看官方文档 http php net manual
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • python 读写pcd

    1 读点云的3种方式 第一种 pip3 install python pcl import pcl pcd ndarray pcl load args pcd path to array 3 不要intensity pcd ndarray
  • 浏览器打开就是360导航(浏览器被360劫持)

    浏览器打开就是360导航 这个问题之前只是看别人帖子见到过 不知道出了什么问题我的edge和Chrome浏览器突然打开也成了360的导航页面 这才感觉出这个问题的恶心之处 而且顺道说一下 我电脑中也没有装任何360系的应用 但突然就被改了
  • 黑客基础知识——SYN泛洪攻击原理及防御

    拒绝服务攻击时 攻击者想非法占用被攻击者的一些资源 比如如 带宽 CPU 内存等等 使得被攻击者无法响应正常用户的请求 讲泛洪攻击之前 我们先了解一下DoS攻击和DDoS攻击 这两个攻击大体相同 前者的意思是 拒绝服务攻击 后者的意思是 分
  • docker下mysql镜像初始化

    目录 1 介绍 2 部署及验证 2 1 场景复现 2 2 创建dockerfile 2 3 初始化脚本 2 4 构建镜像并查看 2 5 创建容器并验证 2 6 完成 1 介绍 原理 当Mysql容器首次启动时 会在 docker entry
  • QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

    QT 多线程中使用QCanBusDevice进行PCAN通讯时 无法正常发出数据 前言 我一开始的代码逻辑是 PCAN开启 关闭 发送 接收这些功能整合在一个工具类中 这个工具类的对象是在主线程创建的 然后我有一个要循环定时发送的功能是独立
  • ASP.NET Core错误:Unable to cast object of type ‘System.Data.ProviderBase.DbConnectionClosedConnecting‘

    项目场景 在使用 net core开发时 经常使用数据库出现的问题 问题描述 开发ASP NET Core时遇到在经常使用数据库连接时报错误提示 Unable to cast object of type System Data Provi
  • QCefView源码优化

    QCefView项目源码的构建部分这里就不赘述了 有问题的朋友可以回到 QCefView 1 CMAKE项目 库文件生成和项目测试 查看相关介绍 本次优化主要包括以下几个部分 1 设置部分 关闭代理服务器 关闭同源策略 使用系统flash等
  • 不断完善

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 最简单的网页下载代码 import urllib2 使用urllib2模块 from sys import argv script urlo argv def down
  • 【核磁共振成像】部分傅里叶重建

    目录 一 部分傅里叶重建 二 部分傅里叶重建算法 2 1 填零 2 2 零差处理 一 部分傅里叶重建 在部分傅里叶采集中 数据并不是绕K空间中心对称收集的 而是K空间的一半是完全填充的 另一半只收集了一小部分数据 部分傅里叶采集所依据的原理
  • 公钥私钥证书与https

    公钥私钥 非对称加密 在一个过程中使用两个密钥 公共密钥用于加密信息 私用密钥用于解译加密的信息 这种加密方法称为非对称加密 也称为公钥加密 因为其中一个密钥是公开的 另一个私钥则需要自己保密 私钥签名 如果我用私钥加密一段数据 当然只有我
  • Request 获取请求数据(方法)

    1 Request 继承体系 2 Request 获取请求数据 2 1 请求行 String getMethod 获取请求方式 GET String getContextPath 获取虚拟目录 项目访问路径 request demo Str
  • java占用cpu最高的线程堆栈信息

    jstack找出占用cpu最高的线程堆栈信息 package com example demo public class Math public static final int initData 666 public int comput
  • Swagger3的使用

    本篇涉及到的swagger注解 速记 EnableSwagger2 开启swagger EnableOpenApi 开启swagger的Api功能 EnableWebMvc 是为了解决swagger和springmvc整合之后总是出现空指针
  • 解决idea打不开的两种可能性

    一 如果 IDEA 下载完成后打不开 可能是因为 dea64 exe vmoptions 文件中保留了之前版本的破译配置 注释或者删除就可以了 1 打开 C Users Administrator AppData Roaming JetBr
  • python stm32-STM32 上面跑Python

    By Derrick Wang 之前我一直在找一种方案 可以把stm32打造成一个真正的创客平台 因为传统的开发环境安装编译 眼花缭乱的工具栏和按钮并不实用于非电子类专业的爱好者设计出自己的作品 这样的高门槛把很多有兴趣者拒之门外 一个没有
  • UDP协议介绍

    UDP 是一个简单地面向数据报的运输层协议 进程的每个输出操作都正好产生一个 UDP 数据报 并组装成一份待发送的 IP 数据报 UDP 不提供可靠性 它把应用程序传给 IP 层的数据发送出去 但是并不保证他们能到达目的地 UDP数据报封装