通信网络/TCP 和 UDP 协议/UDP
与 TCP 不同,UDP 在发送数据之前不会建立连接,它只是发送。正因为如此,UDP 被称为“无连接”。UDP 数据包通常被称为“数据报”。DNS 服务就是一个 UDP 在实际应用中的例子。DNS 服务器使用 UDP 发送和接收 DNS 请求。
在本节中,我们必须了解用户数据报协议。它是一个传输层协议。本节将涵盖 UDP 协议、其报头结构以及它建立网络连接的方式。
如图 1 所示,用户数据报协议 (UDP) 是一种支持网络应用程序的传输层协议。它位于“会话”层下方,在开放式系统互联模型 (OSI) 中位于 IP(互联网协议)之上。这种协议类似于 TCP(传输控制协议),后者用于视频会议系统等客户端/服务器程序,但 UDP 是无连接的。
图 1:OSI 层模型中的 UDP
'图 2:UDP
UDP 是一种无连接且不可靠的传输协议。两个端口用于识别源和目标机器中的端点。当不需要可靠交付时,用户数据报协议用于代替 TCP。但是,UDP 永远不会用于发送诸如网页、数据库信息等重要数据。视频、音频等流媒体使用 UDP,因为它提供了速度。
为什么 UDP 比 TCP 快?
UDP 比 TCP 快的原因是它没有进行任何形式的流量控制。UDP 不执行错误检查、错误更正或确认。UDP 只关注速度。因此,当通过互联网发送的数据受到冲突和错误影响时,就会出现错误。
UDP 数据包称为用户数据报,具有 8 字节的报头。用户数据报的格式如图 3 所示。在用户数据报中,前 8 字节包含报头信息,其余字节包含数据。
图 3:UDP 数据报
源端口号:这是传输数据的源主机使用的端口号。它是一个 16 位长。因此端口号范围从 0 到 65,535。
目标端口号:这是接收数据的目标主机使用的端口号。它也是 16 位长,并且与源主机具有相同的端口号范围。
长度:长度字段是一个 16 位字段。它包含用户数据报的总长度,包括报头和数据。
校验和:UDP 校验和是可选的。它用于检测数据错误。如果该字段为零,则不计算校验和。如果计算出真正的校验和,则该字段包含 1。
UDP 的特点
UDP 的特点如下所示。
• 端到端。UDP 可以识别计算机上运行的特定进程。
• 不可靠的无连接交付(例如,美国邮政服务):
UDP 使用无连接的通信设置。在这种情况下,UDP 在发送数据之前不需要建立连接。通信仅由数据段本身组成。
• 与 IP 相同的尽力而为语义
• 没有确认、没有序号、没有流量控制
• 易受丢失、重复、延迟、乱序或连接丢失的影响
• 快速、开销低
1. 适合可靠的本地网络
2. RTP(实时传输协议)
收到数据后,计算机必须有一些机制来决定如何处理这些数据。假设用户打开了三个应用程序,例如一个 Web 浏览器、一个 telnet 会话和一个 FTP 会话。所有三个应用程序都在通过网络移动数据。因此,应该有一些机制可以让操作系统确定哪些流量对应于哪些应用程序。为了处理这种情况,使用了网络端口。可用端口范围为 0 到 65535。其中,0 到 1023 是众所周知的端口,1023 到 49151 是注册端口,49152 到 65535 是动态端口。
图 4:端口
UDP 使用的众所周知的端口列表
图 5:UDP 使用的端口列表
它包含四个部分:源端口、目标端口、长度和校验和。
图 6:UDP 报头
源端口
源端口是一个可选字段。如果使用,它表示发送进程的端口,并且可以假设它是回复应发送到的端口,前提是在没有其他信息的情况下。如果未使用,则插入值为零。
目标端口
它是发送数据的端口号。
长度
它包括 UDP 报头和数据的长度。
此用户数据报的长度(以八位字节为单位),包括此报头和数据。长度的最小值为八。
校验和
校验和的主要目的是错误检测。它保证消息到达了正确的目的地。为了验证校验和,接收方必须从 IP 报头中提取该字段。使用 12 字节的伪报头来计算校验和。
数据
它是应用程序数据或实际消息。
Ethereal 抓包
可以使用 Ethereal 抓包查看 UDP 数据包。下面捕获并显示了一个这样的 UDP 数据包。
图 7:Ethereal 抓包
在 UDP 连接中,客户端根据他们启动连接的程序设置唯一的源端口号。UDP 不限于一对一的交互。可以使用广播或组播寻址提供一对多的交互。多个客户端与单个服务器通信可以提供多对一的交互。多对多交互只是这些技术的扩展。
UDP 校验和的主要目的是检测传输段中的错误。
UDP 校验和是可选的,但应始终打开。
为了计算 UDP 校验和,会将“伪报头”添加到 UDP 报头中。伪报头中的字段都取自 IP 报头。它们在接收方系统中用于确保 IP 数据报被正确的计算机接收。通常,伪报头包括
图 8:UDP 伪报头
IP 源地址 4 字节
IP 目标地址 4 字节
协议 2 字节
UDP 长度 2 字节
发送方
1. 将段内容视为一系列 16 位整数。
2. 将所有段相加。我们称之为 sum。
3. 校验和:sum 的 1 的补码。(在 1 的补码中,所有 0 都转换为 1,所有 1 都转换为 0)。
4. 发送方将此校验和值放入 UDP 校验和字段中。
接收方
1. 计算校验和
2. 将所有段相加,然后将 sum 加到发送方的校验和中。
3. 检查校验和中是否包含任何 0 位。如果接收方的校验和包含任何 0,则检测到错误。因此,接收方将丢弃该数据包。
这里我们解释一个简单的校验和计算。例如,假设我们有比特流 0110011001100110 0110011001100110 0000111100001111
此比特流被分成 16 位整数段。
因此,它看起来像这样
0110011001100110(16 位整数段)
0101010101010101
0000111100001111
上述第一个 16 位字的总和为
0110011001100110
0101010101010101
1011101110111011
将第三个字添加到上述总和中得到
1011101110111011
0000111100001111
1100101011001010(所有段的总和)
现在,要计算校验和,取 sum 的 1 的补码。正如我之前提到的,1 的补码是通过将所有 1 转换为 0,将所有 0 转换为 1 来实现的。因此,发送方侧的校验和为:0011010100110101。
现在,在接收方,再次将所有段相加。然后将 sum 加到发送方的校验和中。
如果没有错误,则接收方的校验和将为:1111111111111111。
如果报头中存在任何 0 位,则校验和存在错误。因此,该数据包将被丢弃。
你可能想知道为什么 UDP 在第一位提供校验和,因为许多链路层协议(包括流行的以太网协议)也提供错误检查?原因是,没有保证源和目标之间所有链路都提供错误检查——其中一个链路可能使用不提供错误检查的协议。由于 IP 应该在几乎所有 2 层协议上运行,因此对于传输层来说,将错误检查作为安全措施非常有用。虽然 UDP 提供了错误检查,但它不会做任何事情来从错误中恢复。一些 UDP 实现只是丢弃损坏的分段;另一些将损坏的分段与警告一起传递给应用程序。
摘要
[edit | edit source]UDP 是一种传输层协议。UDP 是一种无连接且不可靠的协议。UDP 不会进行流量控制、错误控制或重传坏分段。UDP 比 TCP 快。UDP 通常用于流式音频和视频。UDP 从未使用于重要的文档,如网页、数据库信息等。UDP 传输的分段包含一个 8 字节的报头。它包含源端口、目标端口、UDP 长度和校验和。UDP 校验和用于检测传输分段中的“错误”。
练习题
[edit | edit source]1. 计算以下序列的 UDP 校验和:11100110011001101101010101010101。
答案:要计算校验和,请遵循以下步骤
1. First of all divide the bit stream on to two parts of 16-bit each. The two bit streams will be 1110011001100110 and 1101010101010101. 2. Add these two bit streams, so the addition will be: 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ---------------------------------- 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 3. Now apply one's complement to this bit stream. One's complement is achieved by converting all 1s into 0s and all 0s into 1s. So, the checksum will be : 0100010001000011.
2. 将校验和字段关闭的优势是什么?何时适合将校验和字段关闭?
答案
By keeping checksum field turned off, this might save computational load and speed up data transfer. When we are transmitting data over wide area network(WAN), it is not a good idea to keep checksum off. We can keep checksum turned off when we are transmitting data over a Local Area Network(LAN),because switching infrastructure would catch transmission error in the Ethernet protocol's checksum