跳转到内容

通信网络/TCP 和 UDP 协议/UDP

来自维基教科书,开放世界中的开放书籍

与 TCP 不同,UDP 在发送数据之前不会建立连接,它只是发送。正因为如此,UDP 被称为“无连接”。UDP 数据包通常被称为“数据报”。DNS 服务就是一个 UDP 在实际应用中的例子。DNS 服务器使用 UDP 发送和接收 DNS 请求。

在本节中,我们必须了解用户数据报协议。它是一个传输层协议。本节将涵盖 UDP 协议、其报头结构以及它建立网络连接的方式。

如图 1 所示,用户数据报协议 (UDP) 是一种支持网络应用程序的传输层协议。它位于“会话”层下方,在开放式系统互联模型 (OSI) 中位于 IP(互联网协议)之上。这种协议类似于 TCP(传输控制协议),后者用于视频会议系统等客户端/服务器程序,但 UDP 是无连接的。

图 1:OSI 层模型中的 UDP

什么是 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 使用的端口列表

UDP 报头结构

[编辑 | 编辑源代码]

它包含四个部分:源端口、目标端口、长度和校验和。

图 6:UDP 报头

源端口

源端口是一个可选字段。如果使用,它表示发送进程的端口,并且可以假设它是回复应发送到的端口,前提是在没有其他信息的情况下。如果未使用,则插入值为零。

目标端口

它是发送数据的端口号。

长度

它包括 UDP 报头和数据的长度。

此用户数据报的长度(以八位字节为单位),包括此报头和数据。长度的最小值为八。

校验和

校验和的主要目的是错误检测。它保证消息到达了正确的目的地。为了验证校验和,接收方必须从 IP 报头中提取该字段。使用 12 字节的伪报头来计算校验和。

数据

它是应用程序数据或实际消息。


Ethereal 抓包

可以使用 Ethereal 抓包查看 UDP 数据包。下面捕获并显示了一个这样的 UDP 数据包。

图 7:Ethereal 抓包

UDP 中的通信

[编辑 | 编辑源代码]

在 UDP 连接中,客户端根据他们启动连接的程序设置唯一的源端口号。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
华夏公益教科书