《计算机网络—自顶向下方法》 第五章Wireshark实验:UDP 协议分析

news2025/1/23 1:00:15

        用户数据报(UDP)协议是运输层提供的一种最低限度的复用/分解服务,可以在网络层和正确的用户即进程间传输数据。UDP 是一种不提供不必要服务的轻量级运输协议,除了复用/分用功能和简单的差错检测之外,几乎就是 IP 协议了,也可以说它仅提供最小服务。UDP 是无连接的,因此在两个进程通信前没有握手过程。UDP 协议提供一种不可靠数据传输服务,也就是说,当一个进程讲一个报文发送进 UDP 套接字时,UDP 协议并不保证该报文将到达接收进程。也正是由于 UDP 不修复错误,因此到达接收进程的报文也可能是乱序到达的。UDP 是面向报文的,这是因为 UDP 并不会对应用层传递下来的报文进行任何处理,对于报文的边界信息都会保存,向下交付时交付的是完整报文。

        UDP(User Datagram Protocol)用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:

  • UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。
  • UDP尽最大努力交付,不保证交付可靠性。
  • UDP 是面向报文的,对于从应用层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。
  • UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。

        从应用层到传输层,再到网络层的各层次封装:

1 UDP 协议分析

1.1 UDP 报文

        UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:

  1. 源端口: 源端口号,需要对方回信时选用,不需要时全部置 0 ;
  2. 目的端口:目的端口号,在终点交付报文的时候需要用到;

注:端口是用来指明数据的来源(应用程序)以及数据发往的目的地(同样是应用程序)。字段包含了 16 比特的 UDP 协议端口号,它使得多个应用程序可以多路复用同一个传输层协议及 UDP 协议,仅通过端口号来区分不同的应用程序。

  1. 长度:UDP 的数据报的长度(包括首部和数据)其最小值为 8(只有首部)。字段记录了该 UDP 数据包的总长度(以字节为单位),包括 8 字节的 UDP 头和其后的数据部分。最小值是 8(报文头的长度),最大值为 65535 字节;
  2. 校验和:检测 UDP 数据报在传输中是否有错,有错则丢弃。它的值是通过计算 UDP 数据报及一个伪包头而得到的。校验和的计算方法与通用的一样,都是累加求和。

1.2 UDP 校验和的计算

        对发送方的 UDP 报文段的所有 16 比特字的和进行反码运算,当求和遇见溢出的时候,进行回卷(回卷的补充在下面),得到的结果放在 UDP 报文段中的检验和字段。
1. UDP 校验的所需信息

  • (1) UDP 伪首部:源 IP + 目的 IP + Byte 0 + Byte17 + UDP 长度,目的是让 UDP 两次检查数据是否以及正确到达目的地,只是单纯为了做校验用;
  • (2) UDP 首部:该长度不是报文的总长度,而是 UDP(包括 UDP 头和数据部分)的总长度;
  • (3) UDP 的数据部分。

2. 计算步骤

  • (1) 把伪首部添加到 UDP 上;
  • (2) 计算初始时将校验和字段添零;
  • (3) 把所有位划分为 16 位( 2 字节)的字;
  • (4) 把所有 16 位的字相加,如果遇到进位,则将高于 16 字节的进位部分的值加到最低位上;
  • (5) 将所有字相加得到的结果应该为一个 16 位的数,将该数按位取反则可以得到校验和。

        在计算校验和的时候,需要在 UDP 数据报之前增加 12 字节的伪首部,伪首部并不是 UDP 真正的首部。只是在计算校验和,临时添加在 UDP 数据报的前面,得到一个临时的 UDP 数据报。校验和就是按照这个临时的 UDP 数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了 UDP 数据报,又对 IP 数据报的源 IP 地址和目的 IP 地址进行了检验。

        链路层已经有一定的差错检测机制了,为什么在传输层也要?这是因为我们不能保证源主机和目的主机之间的所有链路使用的链路层协议,都具备差错检验的机制,有可能中间的某一跳的链路不支持。而且当报文段存储在某一台路由器的内存时,也有可能发生比特差错。当端到端的数据传输需要差错检测时,那么 UDP 也要在运输层提供这个功能,也就是端到端原则。不过虽然 UDP 可以进行差错检验,但是它对错误的恢复无能为力。

1.3 UDP 与 TCP 对比

        UDP 和 TCP 协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP 协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息。发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与 TCP 不同,UDP 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把 UDP 协议称为不可靠的传输协议。

  1. TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务,TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;
  2. UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
  3. UDP具有较好的实时性,工作效率较TCP协议高;
  4. UDP段结构比TCP的段结构简单,因此网络开销也小;
  5. TCP协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用TCP传输数据。

        相比于 TCP 协议,UDP 协议什么都不提供,那么为什么还需要 UDP 协议呢?UDP 在以下 4 个方面具有一定的优势,对于某些应用来说更为合适。

  1. 应用层发送什么数据以及何时发送的问题,使用 UDP 协议更为精细。TCP 的传输有拥塞控制机制,会限制发送方的发送思路,同时还需要 ACK 确认。而 UDP 没有包括拥塞控制机制,只需要把数据封装好放进 UDP 报文就能进行发送,所以 UDP 的发送端可以用它选定的任何速率向其下层(网络层)注入数据。值得注意的是实际端到端吞吐量可能小于该速率,这可能是因为中间链路的带宽受限或因为拥塞而造成的。
  2. 无需建立连接。UDP 不需要像 TCP 那样进行 3 次握手,因此 UDP 并不会产生连接建立带来的时延。例如 DNS 运行在 TCP 上的话,就会使得效率受到影响,因此使用 UDP 协议更合适。
  3. 无连接状态。UDP 不需要建立连接,也就不需要为了维持连接产生其他的开销。而 TCP 由于需要维护连接的发送缓存、拥塞控制参数、序号和确认号参数等信息,需要对这些信息进行跟踪和审计,就需要更多的开销。
  4. 分组首部开销小,UDP 的首部开销仅有 8 字节,TCP 则需要 20 字节。

        对于有些应用而言,是可以容忍丢失且对速率是很敏感的,例如视频会议等实时性的引用,TCP 协议会造成较大的时延而影响性能。不过 UDP 协议的使用还是存在争议的,如果没有拥塞控制机制来防范网络拥塞,在大量端系统都采用流式高比特视频等应用,会使得路由器出现大量分组溢出,同样会影响性能,而且会干扰 TCP 协议的运行。不过这个问题已经有研究人员进行探讨,并提出了相关机制。

        最后一个问题是,UDP 能否实现可靠数据传输?虽然 UDP 本身不提供这样的服务,但是 UDP 应用可以在应用层添加可靠传输机制,例如实现错误恢复等。

        许多应用只支持 UDP ,它不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP 是最好的选择。数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP 也是一个好的选择。

2 实验

1.从跟踪中选择一个 UDP 数据包。从此数据包中,确定 UDP 标头中有多少字段,并为这些字段命名。
答:UDP 的标头有 4 个字段,一共 8 byte,各字段分别为:Source Port:源端口号;Destination Port:目的端口号;Length:长度;Checksum:校验和

  1. 通过查询 Wireshark 的数据包内容字段中显示的信息,确定每个 UDP 报头字段的长度。
    答:每个部分都是 2 byte,因此 UDP 报头为 8 byte = 64 bit。

  2. 长度字段中的值是指的是什么?使用捕获的 UDP 数据包验证您的声明。
    答:长度是包括 UDP 头+数据长度,UDP 头长度是8 Byte,有着以下的公式:(仅限IPV4 下UDP 传输),IP 长度=IP 头长度(20Byte)+UDP 头长度(8Byte)+UDP 数据,UDP 长度=UDP 头长度(8Byte)+UDP 数据,在作者抓包结果中UDP 长度=UDP 头长度(8Byte)+SNMP 服务长度

  1. UDP 有效负载中可包含的最大字节数是多少?

        首先先认识下有效负载:

有效负载是被传输数据中的一部分,而这部分才是数据传输的最基本的目的,和有效负载一同被传送的数据还有:数据头或称作元数据,有时候也被称为开销数据,这些数据用来辅助数据传输。——百度百科

        简单地说,有效负载就是可变长度的数据部分。由于 Length 字段占 2 Byte = 65536 bit,并且其中 8 Byte 是 UDP 首部信息。因此有效载荷 = 65536 - 8 × 64 = 65472 bit。

  1. 最大可能的源端口号是多少?
    两个 Port 字段占 2 byte = 65536 bit,同时端口号从 0 开始算,因此最大端口号 = 216 - 1 = 65535。

  2. UDP 的协议号是什么? 以十六进制和十进制表示法给出答案。
    答:UDP 的协议号为 17,十六进制为 0x11。

  1. 观察发送 UDP 数据包后接收响应的 UDP 数据包,这是对发送的 UDP 数据包的回复,请描述两个数据包中端口号之间的关系。(提示:对于响应 UDP 目的地应该为发送 UDP 包的地址。)
    答:下图左侧为发送UDP,右图为接收UDP。

        即发送者发送端口号在接收返回(响应)UDP 时候会变成接收端口号。接收者发送返回(响应)UDP 时候接受端口号会变成发送端口号。

端口号

        主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在与 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信。

        两个主机的传输层之间有一个灰色双向箭头,写着“传输层提供应用进程间的逻辑通信”。

        逻辑通信:看起来数据似乎是沿着双向箭头在传输层水平传输的,但实际上是沿图中的虚线经多个协议层次而传输。

        在上图中,AP1 与 AP3 的通信与 AP2 与 AP4 的通信可以使用同一个传输层协议来传输(TCP 或 UDP),根据 IP 地址或 MAC 地址都只能把数据传到正确的主机,但具体需要传到哪一个进程,是通过端口来辨认的。

        比如同时使用浏览器和 QQ,浏览器占用 80 端口,而 QQ 占用 4000 端口,那么发送过来的 QQ 消息便会通过 4000 端口显示在 QQ 客户端,而不会错误地显示在浏览器上。

        端口号有 0 ~ 65535 的编号,其中:

  • 编号 0 ~ 1023 为 系统端口号 ,这些端口号可以在网址 www.iana.org 查询到,它们被指派给了 TCP/IP 最重要的一些应用程序,以下是一些常见的系统端口号:
应用层协议FTPTELNETSMTPDNSTFTPHTTPSNMP
系统端口号212325536980161
  • 编号 1024 ~ 49151 为登记端口号,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复。
  • 编号 49152 ~ 65535 为短暂端口号,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用。

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

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

相关文章

Python操作Redis常见类型详解

1、windows 上安装 Redis 便于测试,笔者在 windows 上安装 Redis Redis 官方不建议在 windows 下使用 Redis,所以官网没有 windows 版本可以下载。微软团队维护了开源的 windows 版本,对于普通测试使用足够了。 1.1、安装包方式安装 Redis…

万字收藏:《2023网络工程师年度必看书单》

晚上好,我是老杨。 这周是总结周,更新的第三篇内容,还是关于总结的。很多人让我推荐网工适合看的书,其实我推荐过好多次了。 趁着年底,一起把我认为网工适合看的、推荐你看的、值得看的书整理一下,供新老…

视觉SLAM ch13 设计SLAM系统

目录 一、SLAM系统 二、工程框架 三、框架流程 四、具体实现 五、VO整体流程 六、显示整体建图效果 一、SLAM系统 实现一个精简版的双目视觉里程计,前端使用光流法,局部使用局部BA优化。 二、工程框架 app中 run_kitti_stereo.cpp是代码的运行入口…

国内免费可用 ChatGPT 网页版

ChatGPT是一个神奇的机器人,它可以回答任何问题,解决任何问题。它的名字来源于“Chat”和“GPT”,前者代表聊天,后者代表生成预测文本。它被设计成一个智能助手,可以帮助人们解决各种问题。 有一天,一个名…

【Python 爬虫之requests库】零基础也能轻松掌握的学习路线与参考资料

文章目录 一、概述二、Requests 库基本用法三、爬虫中的优秀实践四、参考资料 一、概述 Python 爬虫中,常用来请求网页的库有 urllib、urllib2、httplib等,但是这些库用起来比较麻烦,需要写很多代码。Requests 库正是为了解决这个问题而生的…

Flask轻松构建钉钉接口模版,实现自动化流程优化

项目背景 随着钉钉应用的不断普及和企业数字化程度的提高,越来越多的企业需要开发钉钉接口来完成内部业务流程的自动化和优化。而Flask框架,则是一个轻量级的Python web框架,具有快速开发和灵活性的优势,是钉钉接口开发的理想选择…

python去重列表中相同的字典元素

python去重列表中相同的字典元素 文章目录 python去重列表中相同的字典元素一.知识点二.代码|代码1|问题 |代码2 三.分析总结1、分析2、总结 四.后续代码知识点代码流程问题总结总结 一.知识点 ​ data_list [{“a”: 1, “b”: 2}, {“a”: 2, “b”: 3}, {“a”: 1, “b”:…

华为OD机试真题 Java 实现【相同数字的积木游戏1】【2023Q2 100分】

一、题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的2块积木块,计算他们…

【C++】——string的模拟实现

前言: 在之前的学习中,我们已经对string类进行了简单的介绍,大家只要能够正常使用即可。但是在面试中,面试官总喜欢让学生自己 来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

lightroom磨皮滤镜中文插件Portraiture4最新版本

哈喽!小伙伴们!整个摄影后期行业都在用Portraiture,这是一个被奉为高级磨皮面板,修图神器、修图的的扩展面板!Portraiture这款磨皮插件终于更新啦!最近推出了Portraiture4.03版本,新版本光影处理更强大&…

《编程思维与实践》1066.最小不重复数

《编程思维与实践》1066.最小不重复数 题目 思路 一般在oj上循环 2 ⋅ 1 0 9 2\cdot 10^9 2⋅109次以上就会超时,所以由于这题的数据A可以很大,直接循环加一再判断会超时. 优化:首先可以明确要想使不重复数尽可能小,则高位数字应该尽可能小, 即先找到最靠前的两个重复数字,然后…

【Vector VN1630/40 I/O应用】-1-简易示波器

案例背景(共13页精简):该篇博客将告诉您: Vector VN1630A,VN1640A,VH6501 I/O的使用;将Vector VN1630A/VN1640A CAN/LIN Interface的I/O接口充当一个简易的“示波器”使用;观察“CAN唤醒”工作的ECU控制器…

关于C语言的杂记4

文章目录 数据与程序结构C语言的编程机制#include <>和#include ""的区别形式参数和实际参数值传递地址传递 素数 文章内容摘自或加工于C技能树一些大佬的博文 数据与程序结构 阅读完C的编程机制和函数的声明和定义后的一些启发。——预处理 C语言的编程机制 …

dubbo技术

1、Dubbo的前世今生 2011年10月27日&#xff0c;阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo&#xff0c;服务治理和SOA的设计理念开始逐渐在国内软件行业中落地&#xff0c;并被广泛应用。 早期版本的dubbo遵循SOA的思想&#xff0c;是面向服务架构的重要组件。 …

1708_Simulink中取数组元素

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【多线程】线程安全问题原因与解决方案

目录 线程安全的概念 线程不安全示例 线程不安全的原因 多个线程修改了同一个变量 线程是抢占式执行的 原子性 内存可见性 有序性 线程不安全解决办法 synchronized 关键字-监视器锁monitor lock synchronized 的特性 互斥 刷新内存 可重入 synchronized 使用示例 Java 标…

【第三章:存储系统】

目录 知识框架No.0 引言No.1 存储器概述No.2 主存储器一、SRAM芯片和DRAM芯片二、只读存储器三、主存储器的基本组成1、基本的半导体元件和原理 知识框架 No.0 引言 这一章节主要是&#xff1a;这些二进制的数据在计算机内部如何存储 在学习这个章节之前&#xff0c;首先把下面…

Mybatis - 基础

文章目录 一、 Mybatis基本介绍二、 Mybatis 快速入门程序2.1 引入Mybatis依赖2.2 准备工作2.3 配置SQL信息2.3.1 IDEA连接数据库2.3.2 打开日志信息 2.4 JDBC 了解2.5 数据库连接池2.5.1 Druid数据库连接池 三、 Mybatis 基础3.1 环境准备3.1.1 数据库表3.1.2 实体类 3.2 基础…

EasyRecovery16中文最新版电脑数据恢复软件下载使用教程

EasyRecovery如果需要使用它来恢复数据&#xff0c;请注意&#xff0c;尤其是当需要恢复的数据文件非常重要时&#xff0c;建议使用软件EasyRecovery以保障数据安全。共有三个版本&#xff0c;分别是个人版、专业版、企业版&#xff0c;这三种都可以免费下载并使用&#xff0c;…

[MySQL]关于MySQL索引的一点点东西

最是人间留不住,朱颜辞镜花辞树. 目录 一.为什么需要索引 1.什么是索引 2.索引的创建原则 二.理解索引 1. MySQL与磁盘交互基本单位 2.索引的结构 a.关于hash索引,B树索引,B树索引的特点 B树 B树 HASH b.为什么使用InnoDB 存储引…