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

【网络协议分析】使用Wireshark分析UDP协议

一、实验目的

        通过使用Wireshark抓取UDP流来分析学习UDP协议,比较TCP与UDP的不同。

二、实验过程

        1、使用Wireshark抓取UDP报文流,常见的使用UDP协议的应用有DNS、QQ、在线游戏等。

        2、分析抓取到的数据包,比较与TCP协议的异同。

        我们选取DNS的UDP报文进行分析。

        首先,相比于TCP协议建立连接时需要三次握手,结束时需要四次挥手,UDP协议可以直接发送数据分组,而省略了握手与挥手的过程,降低安全性换来提升传输的效率。

        因此,由于UDP本身的发送方式,UDP无法保证传输的可靠性,存在丢包的可能性。但UDP不是点对点的,可以借助该特性进行广播或多播。

        3、分析UDP报文格式

        分析Wireshark捕捉的UDP报文我们可以知道,UDP的报文首部共分为4个部分,每个部分占2字节,共8个字节。分别为:源端口Source Port、目的端口Destination Port、报文长度Length、校验和Checksum。后面的部分均属于数据区。

        源端口和数据端口包含了UDP端口号,用以在各个等待接收报文的应用之间对数据包进行多路分解工作。

        报文长度指明了以字节为单位的UDP首部和UDP数据的长度,因此报文长度最小值为8(数据为空,仅包含UDP首部)。

        校验和是可选字段,设置为0时表明未进行校验。校验和是UDP中提供的唯一保证UDP报文无差错的途径。

4、分析你使用UDP包的应用,试着分析该应用自身是否有提供可靠性传输相关的机制

        我们这里对DNS应用进行分析。

        首先,通过查看捕获到的报文,可以看到DNS报文使用了校验和作为保证可靠性传输的机制之一。

        此外,根据查阅资料我们可以知道,DNS首部提供了一个截断位,当报文长度大于512字节时,由于UDP传输大数据的不稳定,仅用UDP发送前512各字节,并设置截断位为1,这样客户端收到后会用TCP重发这个请求,可保证长数据的稳定传输。下图报文中的截断位为0,即无须截断。

5、捕获到使用ICMP报文来报告UDP数据报不可达的报文

        使用手机提供热点,但关闭手机的数据流量,使得电脑连接的热点为不可访问互联网的状态。此时在电脑上打开任意使用UDP协议的应用(这里选择阿里云盘),可以抓到UDP报文发送失败时,使用ICMP报文报告UDP数据报不可达的报文。

        我们可以发现,这个ICMP报文的Type Code为3 0,表明目标网络端口不可达。

        使用ICMP报文报告数据报不可达也是UDP于TCP的区别之一。TCP协议由于本身连接与断开都是经过多次确认的,且考虑了出现问题时重传和阻塞控制。因此其自身在握手、挥手、数据发送时通过超时、捎带确认等方式就可以完成确认和错误报告。而UDP由于是无连接的用户数据报协议,因此在不可达时,只能从本机发送一个ICMP报文报告不可达,通报路径上的各节点。此外的一个原因是,ICMP本身也是一个数据报协议,依靠UDP传输。

三、思考与总结

        本次实验主要对UDP协议进行了捕获,通过分析UDP报文格式对UDP协议进行进一步的学习。

        UDP协议是一个无连接的面向数据报协议,其报文格式如下:

        TCP与UDP的区别如下:

        (1)TCP 是面向连接的,UDP 是面向无连接的。

        (2)UDP程序结构较TCP程序简单。

        (3)TCP 是面向字节流的,UDP 是基于数据报的。

        (4)TCP 保证数据正确性,UDP 可能丢包。

        (5)TCP 保证数据顺序,UDP 不保证。

        UDP协议常用的应用场景有:即时通信(QQ等)、直播/在线视频、在线游戏、网盘等。其特点为单次传输需要资源少、不需要一一对应建立连接、可以忍受丢包,但对实时性要求强。

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

相关文章:

  • TensorFlow Lite中文本分类在Android上的实践
  • 使用vscode查bug
  • LC 2846. 边权重均等查询
  • RabbitMQ简单模式和工作模式
  • c语言实战之贪吃蛇
  • Midjourney图片生成描述词记录(今天一天)
  • 类和对象 第五部分第四小节:赋值运算符重载
  • Django从入门到精通(一)
  • 数据库分表分库的原则
  • Java技术栈 —— Docker容器
  • Mysql大数据量分页优化
  • QT tcp与udp网络通信以及定时器的使用 (7)
  • web架构师编辑器内容-添加自动保存的功能
  • 【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?
  • SpringBoot之JWT登录
  • 【备战蓝桥杯】——循环结构
  • 【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)
  • 探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】
  • 蓝桥杯-循环节长度
  • Jython调用openwire库连接activemq转发topic订阅消息到另一个activemq 服务器上 完整代码
  • 面试经典题---30.串联所有单词的子串
  • 字符串随机生成工具(开源)-Kimen(奇门)
  • UE4 CustomDepthMobile流程小记
  • Docker 基础篇
  • Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?
  • vue3封装el-pagination分页组件
  • 负载均衡下Webshell连接思路及难点
  • 基于链表实现贪吃蛇游戏
  • Python网络爬虫实战——实验6:Python实现js逆向与加解密
  • 【python】使用aiohttp库编写一个简单的异步服务器