User Datagram Protocol (UDP)

UDP协议User Datagram Protocol)是一个轻量级的数据传输协议,它位于IP协议之上

UDP协议提供了发现数据包损坏的机制,但是无法解决其他的关于数据包的问题,例如丢包或包顺序错乱。这也是为什么UDP协议有时候也被称为不可靠数据协议(Unreliable Data Protocol)的原因

相比于其他基于IP层的协议来说,UDP协议简单且迅速。它经常被用于时间敏感的应用(例如在线影像流),因为这些对这些应用来说速度比准确性更重要

数据包结构

在这里插入图片描述

每个UDP数据段包含有一个8字节的头部和可变长度的数据部分

Port numbers(端口)

UDP头里的前4个字节存储着数据传输来源和目的地的端口信息

一个网络设备可以从不同的虚拟端口获取消息,就像海港可以从不同的港口接受不了船只一样。不同的端口可以帮助区分不同的网络流量的类型

以下是我电脑里的一些UDP正在使用的端口
在这里插入图片描述

每行数据的开头都是使用端口的进程的名字,结尾都是使用的协议和端口号

Segment Length(数据段长度)

UDP头里之后的两个字节存储着数据段(包括头部)的长度(以字节为单位)

两个字节是16位,所以以二进制来表示的话,长度可以为:

1111111111111111

用十进制来表示,记为(2^16-1)或者65535。因此,UDP数据段的最大长度就是65535字节

Checksum

UDP头的最后两个字节存储着checksum,它被消息的发送方和接收方用于检查数据正确性

当发出数据段前,发送方:

  1. 基于数据段中的数据计算出checksum
  2. 把checksum存储在UDP头里

在收到数据段后,接收方:

  1. 通过收到的数据段数据计算出checksum
  2. 比较计算出的checksum与数据段中的checksum,如果两者不想等,接收方就知道数据被损坏了

为了理解checksum如何可以知道数据被损坏,让我们一步步来计算一个简单数据Hola的checksum值吧
首先,发送着会对Hola进行二进制编码,以下将用ASCII/UTF-8字符集进行编码:

Hola
010010000011011110110110001100001

可以得出以下4个字节

01001000 01101111 01101100 01100001

下一步,发送方将这4个字节按2字节(16位)进行划分

0100100001101111
0110110001100001

为了计算checksum,发送方将这两个16位的数字进行相加
0100100001101111
+
0110110001100001
----------------------------
1011010011010000

现在,计算机可以发送一个数据为Hola,checksum为1011010011010000的数据段了

整个UDP数据段看起来如下

字段
Source port number00010101 00001001
Destination port number0001010 100001001
Length00000000 00000100
Checksum10110100 11010000
Data01001000 01101111 01101100 01100001

但是,万一数据被损坏了,Hola变成了Mola怎么办?

首先,让我们先看看损坏后的数据的二进制编码是什么

Mola的二进制编码如下

Mola
01001101011011110110110001100001

然后把这4个字节拆分成2个16位的数

0100110101101111
0110110001100001

现在,再计算一下checksum

0100110101101111
+
0110110001100001
----------------------------
1011100111010000

接收者现在可以比较接收到的checksum与自己计算出的checksum了

  • 接收到的:1011010011010000
  • 计算出的:1011100111010000

看出差别了吗?

当接收者发现两个checksum不一致时,它就明白数据已经被损坏了。

不幸的是,接收者无法通过计算后的checksum去还原以前的数据,所以它只能将整个数据包抛弃

实际上的UDP checksum计算过程包括一些其他步骤,但是之前展示的计算过程已经是比较通用的了

  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

bingzhilingyi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值