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

news2024/11/25 13:01:11

        用户数据报(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/534624.html

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

相关文章

RabbitMQ养成记 (10.高级特性:死信队列,延迟队列)

死信队列(DLX) 这个概念 在其他MQ产品里面也是有的,只不过在Rabbitmq中稍微特殊一点 什么叫私信队列呢? 就是当消息成为 dead message之后,可以重新发到另外一台交换机,这个交换机就是DLX。 注意这里的有翻…

基于OpenCV的人脸检测软件(含Python源码+UI界面+图文详解)

软件功能演示 摘要:人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形在图像中的坐标,可能还包括姿态如倾斜角度等信息。本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通…

GeoTools实战指南: 空间坐标系-地理信息科学的核心

GeoTools实战指南: 空间坐标系-地理信息科学的核心 引言 在我们的日常生活中,地图、GPS导航和地理位置服务已经变得司空见惯。但是,你有没有想过这些工具背后的工作原理呢?它们都依赖于一种称为"空间坐标系"的关键概念。本文将深入探讨空间坐标系的基础知识和其…

多线程专题(上)学习随手笔记

JMM:主内存物理内存线程共享,工作内存CPU缓存线程独占volatile:可见性、禁止指令重排,不可保证原子性;用于懒汉单例模式(双重检测)或状态标记Synchronized:保证代码块或方法同步化执…

Unity的URP下使用SRPBatcher

大家好,我是阿赵。这里继续来讲一下URP相关的东西。 这次主要说的是SRP Batcher的使用 一、在URP下实现SRP Batcher 1、设置 在我们创建的URPAsset文件的高级选项里面,有一个SRP Batcher的开关,默认就是勾上的。 2、修改shader 在把项目转…

小白白也能学会的 PyQt 教程 —— 自定义组件 Switch Button

文章目录 前言思路讲解代码部分 前言 最近在搞 Python 课程设计,想要搞一个好看的 UI,惊艳全班所有人。但打开 Qt Creator,Win7 风格的复古的按钮是在让我难以下手。 其次,我因为想要打造一个 Fluent UI 样式的设置页面&#xff…

详解c++STL—string组件

目录 一、string基本概念 1、本质 2、string和char * 区别: 3、特点: 二、string构造函数 1、构造函数原型 2、示例 三、string赋值操作 1、赋值的函数原型 2、示例 四、string字符串拼接 1、函数原型 2、示例 五、string查找和替换 1、功…

tomcat目录结构

tomcat服务器安装根目录下有很多子目录,这些目录的作用是: (1)bin:存放了tomcat服务器中的可执行的批处理文件(startup.bat shutdown.bat) (2)conf:存放了tomcat相关的配置文件(其中的server.xml是tomcat服务器核心配置文件) …

26. Pandas处理分析网站原始访问日志

Pandas处理分析网站原始访问日志 目标:真实项目的实战,探索Pandas的数据处理与分析 实例: 数据来源:我自己的wordpress博客蚂蚁学Python – 你有没有为写代码拼过命?那你知不知道 人生苦短,我用Python&am…

Python挑选出无Labelme标注文件的图片文件

Python挑选出无Labelme标注文件的图片文件 前言前提条件相关介绍实验环境Python挑选出无Labelme标注文件的图片文件代码实现输出结果 前言 本文是个人使用Python处理文件的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。 (https://blog.…

【设计原则与思想:总结课】38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

到今天为止,设计原则和思想已经全部讲完了,其中包括:面向对象、设计原则、规范与重构三个模块的内容。除此之外,我们还学习了贯穿整个专栏的代码质量评判标准。专栏的进度已经接近一半,马上就要进入设计模式内容的学习…

Python: 生成ubuntu apt镜像地址

文章目录 1. 目的2. 设计3. 实现4. 调用5. 参考 1. 目的 每次新配置 Ubuntu 系统,免不了配置 apt 源。尽管可以通过 GUI 界面进行选择,但自动化程度不够,不同桌面(Unity/Gnome/KDE)下的界面也不太一样; 使…

Java基础-sleep和wait的区别

本文介绍Java中sleep和wait方法的使用区别 文章目录 sleep()wait()sleep()和wait()对比区别相同点 sleep() 查看sleep方法,可见其是static native方法 public static native void sleep(long millis) throws InterruptedException;sleep()方法需要指定等待的时间。…

HTTP第14讲——HTTP传输大文件的方法

背景 HTTP 可以传输很多种类的数据,不仅是文本,也能传输图片、音频和视频。 早期互联网上传输的基本上都是只有几 K 大小的文本和小图片,现在的情况则大有不同。网页里包含的信息实在是太多了,随随便便一个主页 HTML 就有可能上百…

java常用集合

java集合又是一个新世界了,从前在我刚接触java的时候,一直在纠结 集合这东西到底有啥用,后来代码写的多了。才开始学习集合 集合也叫容器。顾名思意 就是存放对象的器皿。 主要是由两大接口派生而来 :一个是 Collecton接口&#…

LeetCode高频算法刷题记录2

文章目录 1. 最大子数组和【简单】1.1 题目描述1.2 解题思路1.3 代码实现 2. 合并两个有序链表【简单】2.1 题目描述2.2 解题思路2.3 代码实现 3. 两数之和【简单】3.1 题目描述3.2 解题思路3.3 代码实现 4. 二叉树的层序遍历【中等】4.1 题目描述4.2 解题思路4.3 代码实现 5. …

代码随想录算法训练营第四十二天 | 背包问题

背包问题 理论 基础:二维 文档讲解:代码随想录 (programmercarl.com) 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩…

Revit SDK:ErrorHandling

前言 本文介绍 Revit 的错误处理机制。 内容 程序员对错误处理的定义和理解 程序的错误处理机制可以分为两种类型:错误返回码和异常捕捉。 错误返回码是指在程序中遇到错误时,通过函数返回值来表明错误的类型和信息。错误返回码可以在程序中被预测和…

MySQL数据落盘原理(data page、redo log、undo log、binlog、xa-2pc等源码分析)

文章目录 前言一、Innodb如何作为MySQL插件的二、page cleaner thread三、Update操作源码梳理1、生成undo log2、更新数据3、生成redo log 四、MTR与将脏页添加到Flush List1、MTR2、脏页添加到Flush List 五、事务提交1、xa-prepare2、xa-commit2.1、process_flush_stage_queu…

概率统计与计算机技术的联系及在生活当中的应用研究

title: 概率统计与计算机技术的联系及在生活当中的应用研究 date: 2023-05-16 11:42:26 tags: 题目:概率统计与计算机技术的联系及在生活当中的应用研究 摘 要 概率论与数理统计是研究随机现象统计规律性的一门学科,是理工科各专业的一门重要的基础课程…