《计算机网络—自顶向下方法》 Wireshark实验(五):UDP 协议分析_wireshark udp-程序员宅基地

技术标签: # Computer Networking  udp  wireshark  校验和  UDP报文  计算机网络  

        用户数据报(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 最重要的一些应用程序,以下是一些常见的系统端口号:
应用层协议 FTP TELNET SMTP DNS TFTP HTTP SNMP
系统端口号 21 23 25 53 69 80 161
  • 编号 1024 ~ 49151 为登记端口号,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复。
  • 编号 49152 ~ 65535 为短暂端口号,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xq151750111/article/details/130660079

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法