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

UDP的详细解析

UDP的详细解析

文章目录

  • UDP的详细解析
    • UDP 概述
    • UDP的首部格式
      • 检验和的计算
    • 抓包测试
    • 参考

TCP/IP运输层的两个主要协议都是互联网的正式标准,即:

  1. 用户数据报协议UDP (User Datagram Protocol)
  2. 传输控制协议TCP (Transmission Control Protocol)

按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元 TPDU.但在TCP/IP体系中,根据所使用的协议是TCP或UDP,分别称之为TCP报文段或UDP用户数据报。

UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式。

下表为一些应用和应用层协议主要使用的运输层协议。

应用应用层协议运输层协议
名字转换DNS(域名系统)UDP
文件传送TDTP(简单文件传送协议)UDP
路由选择协议RIP(路由选择协议)UDP
IP地址配置DHCP(动态主机配置协议)UDP
网络管理SNMP(简单网络管理协议)UDP
远程文件服务NFS(网络文件系统)UDP
IP电话专用协议UDP
流式多媒体通信专用协议UDP
多播IGMP(网际组管理协议)UDP
电子邮件SMTP(简单邮件传送协议)TCP
远程终端接入TELNET(远程终端协议)TCP
万维网HTTP(超文本传送协议)TCP
文件传送FTP(文件传送协议)TCP

UDP 概述

用户数据报协议UDP只在IP的数据服务之上加了很少一点功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:

  1. UDP是无连接的,即数据发送之前不需要建立连接

  2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

  3. UDP是面向报文的。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说应用层交给UDP多长的报文,UDP就照样发送,UDP一次交付一个完整的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片。

    IMG_20230213_135141

  4. UDP没有拥塞控制 网络出现拥塞不会使源主机的发送速率降低。这对某些实时应用使很重要的。

  5. UDP 支持一对一、一对多、多对一和多对多的交互通信

  6. UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部i段。首部字段只有8个字节,由四个字段组成,每个字段的长度都是两个字节

  • 源端口 源端口号。在需要对方回信时选用。不需要时可用全0
  • 目的端口 目的端口号。这在终点交付报文时必须使用
  • 长度 UDP 用户数据报的长度,其最小值时8(仅有首部)
  • 检验和 检测UDP用户数据报在传输中是否有错。有错就丢弃。

当接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。

IMG_20230213_140313

检验和的计算

UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时要在UDP用户数据报之前加12个字节的伪首部。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。通过上面那幅图我们可以看到伪首部中的字段信息:

  1. 32位源IP地址
  2. 32位目的IP地址
  3. 8位保留字节(置0)
  4. 8位传输层协议号(TCP是6,UDP是17)
  5. 16位报文长度(首部+数据)

检验和是如何工作的,我们可以通过观察下图:

IMG_20230213_143250

我们对应着上面这副图看,其实计算这个检验和的过程其实就是,将加上伪首部后的数据按照每16位相加求和。将求和后的结果取反与UDP自带的检验和相与,若得到的结果是全1的则说明数据传输无误。(刚好这里的检验和在UDP是以2字节存储的,刚好是12位)。

若在求16位求和结果时发生进位,那么需要进行回卷。计算的过程可以参考这篇 回卷计算。

读到这里不知道大家会不会有问题,就是为什么UDP在计算检验和的时候需要加上伪首部。

对于这个问题最简单的回答就是:出于历史原因。如下图David P. Reed的解释:

image-20230213151257589

前面这个不好翻译,在StackOverflow中找到了一个相关的解答:

image-20230213151419658

抓包测试

UDP有着很广泛的应用场景。它的特点就像上面看到的很简单,没有流量控制以及差错重传等特点,作为传输层的协议常常被拿来和tcp协议比较。所以广泛应用于qq聊天,视频,网络电视,迅雷等场景。缺点就是容易丢包。

我拿qq聊天来抓个UDP数据包试试。

首先通过终端查看本机的ip地址和物理地址:

image-20230213153811220

我们首先打开抓包工具然后,用qq给自己的Android手机发送聊天,可以发现抓包工具成功捕获信息,如下图。

image-20230213153424813

我们查看一下第二条记录中的详细信息

image-20230213154303273

现在我们再去看看所有qq是否有占用52652这个端口。用netstat -ano列出所有占用的端口号,同时用任务管理器查看qq的PID。查看的结果如下图,发现52652这个端口确实被qq所占用。

image-20230213155030303

参考

  • UDP 检验和原理

  • 为什么校验时要加上IP信息的伪首部

  • UDP/TCP 中使用伪标头的意义是什么

  • 《计算机网络 第7版》

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

相关文章:

  • 史上最详细JUC教程之Synchronized与锁升级详解
  • Vue|初识Vue
  • 在职阿里6年,一个29岁女软件测试工程师的心声
  • (C语言)自定义类型,枚举与联合
  • node.js服务端笔记文档学会写接口,学习分类:path、包、模块化、fs、express、中间件、jwt、开发模式、cors。
  • 初始C++(三):引用
  • 【前端】参考C站动态发红包界面,高度还原布局和交互
  • VR全景带你浪漫“狂飙”情人节,见证甜蜜心动
  • Linux系统安全之iptables防火墙
  • 【C#基础】C# 变量与常量的使用
  • [ 常用工具篇 ] CobaltStrike(CS神器)基础(一) -- 安装及设置监听器详解
  • Redis集群
  • 00---C++入门
  • Spring-事务2
  • Windows Git Bash 配置
  • java代码整合kettle9.3实现读取表中的数据,生成excel文件
  • 分享微信点餐小程序搭建步骤_微信点餐功能怎么做
  • 4、数组、切片、map、channel
  • 270 uuid
  • 2023最新简历模板免费下载
  • 【CSS】元素居中总结-水平居中、垂直居中、水平垂直居中
  • spring实现AOP
  • neovim搭建cpp环境
  • SpringBoot AES加密 PKCS7Padding 模式
  • 按键输入驱动
  • 2023年第七周总周结 | 开学倒数第三周
  • Springboot扫描注解类
  • Apache日志分析器
  • 啪,还敢抛出异常
  • Apache JMeter 5.5 下载安装以及设置中文教程