计算机网络教程-传输层协议-UDP - STEMHA's Blog

计算机网络教程-传输层协议-UDP

传输层协议

UDP :不可靠的无连接传输层协议,由于在应用中简单高效而被使用,在那些应用中差错控制由应用层进程提供。
TCP :可靠的面向连接协议,可用于可靠性重要的任何应用。

TCP/IP协议簇协议示意图
tcp-ip协议簇协议示意图
UDP 和TCP 使用的熟知端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
端口     协议     UDP     TCP     说明
7 Echo √ 将接收到的数据报回送到发送方
9 Discard √ 丢弃接收到的任何数据报
11 Users √ √ 活跃的用户
13 Daytime √ √ 返回日期和时间
17 Quote √ √ 返回每日引用
19 Chargen √ √ 返回一字符串
20,21 FTP √ 文件传输协议
23 TELNET √ 终端网络
25 SMTP √ 简单邮件传输协议
53 DNS √ √ 域名服务
67 DHCP √ √ 动态主机设置协议
69 TFTP √ 简单文件传输协议
80 HTTP √ 超文本传输协议
111 RPC √ √ 远程过程调用
123 NTP √ √ 网络时间协议
161,162 SNMP √ 简单网络管理协议

UDP(用户数据报协议)

用户数据报协议(User Datagram Protocol,UDP):

  • 无连接不可靠传输层协议。
  • 不提供主机到主机通信,它除了提供进程到进程之间的通信之外,就没有给IP 服务增加任何东西。
  • 此外,它进行非常有限的差错检验。

如果UDP 功能是如此之差,那么为什么进程还要使用它?
它有缺点也有优点。UDP 是一个非常简单的协议,开销最小。如果一个进程想发送很短的报文,而且不在意可靠性,就可以使用UDP。使用UDP 发送一个很短的报文,在发送方和接收方之间的交互要比使用TCP 时少得多。

用户数据报

UDP 分组称为用户数据报(user datagram),有8 字节的固定头部,这个头部由4 个字段组成,每个字段2 字节(16 位)。
8 字节的固定头部的四个字段:每个字段两个字节。
头两个字段定义了源和目的端口号。
第三个字段定义了用户数据报的总长,即头部加数据的长度。16 位可以定义的总长度范围是0 到65 535。然而,总长度需要更小一些,这是因为UDP数据报存储在总长度为65 535 的IP 数据报中。
最后一个字段可以携带可选校验和。
用户数据报格式

UDP 服务

进程到进程的通信

UDP 使用套接字地址提供进程到进程通信,这是IP 地址和端口号的组合。

无连接服务

  • UDP 提供无连接服务。这就表示UDP 发送出去的每一个用户数据报都是一个独立的数据报。不同的用户数据报之间没有关系,即使它们都是来自相同的源进程并发送到相同的目的程序。
  • 用户数据报不进行编号。此外,也没有像TCP 协议那样的连接建立和连接终止,这就表示每一个用户数据报可以沿着不同的路径传递。
  • 无连接的一个结果就是使用UDP 的进程不能够向UDP 发送数据流,并期望它将这个数据流分割成许多不同的相关联的用户数据报。相反,每一个请求必须足够小,使其能够装入用户数据报中,只有那些发送短报文的进程才应当使用UDP。短报文小于65507字节(65535减去UDP头部的8字节再减去IP头部的20 字节)。

无流量控制

UDP 是一个非常简单的协议。它没有流量控制(flow control),因而也没有窗口机制。如果到来的报文太多时,接收方可能会溢出。缺乏流量控制意味着如果需要的话,使用UDP 的进程应该提供这个服务。

差错控制(仅有校验和)

除校验和外,UDP 也没有差错控制(error control)机制,这就表示发送方不知道报文是丢失还是重传。当接收方使用校验和检测出差错时,它就悄悄地将此用户数据报丢弃。缺乏差错控制意味着如果需要的话,使用UDP 的进程应该提供这个服务。

校验和

UDP 校验和包含三部分:伪头部、UDP 头部和从应用层来的数据。
伪头部(psedoheader)是IP 分组的头部的一部分(第4 章讨论),其中有些字段要填入0,用户数据报分装在IP分组中

  • 如果校验和不包括伪头部,用户数据报也可能是安全完整地到达。但是,如果IP 头部受到损坏,那么它可能被提交到错误的主机。

协议字段可确保这个分组是属于UDP,而不是属于其他传输层协议。

  • 如果一个进程既可用UDP 又可用TCP,则端口号可以是相同的。

  • UDP 的协议字段值是17。如果在传输过程中这个值改变了,在接收端计算校验和时就可检测出来,UDP 就可丢弃这个分组。这样就不会传递给错误的协议。

    用于校验和计算的伪头部

可选校验和

UDP 分组的发送方可以选择不计算校验和。这种情况下,在发送前,校验和字段就全填入0。在发送方决定计算校验和的情况下,如果碰巧结果全是0,那么在发送前校验和全改为1。换言之,发送方填充两次校验和。注意,这不会产生混淆,因为校验和的值在正常情况下不会全为1。

无拥塞控制

由于UDP 是无连接协议,它不提供拥塞控制。UDP 假设被发送的分组很小且零星,不会在网络中造成拥塞。今天当UDP 被用做音频和视频的交互实时传输时,这个假设可能对也可能不对。

封装和解封装

要将报文从一个进程发送到另一个进程时,UDP 协议就要对报文进行封装和解封装。

排队

我们已经讨论过端口,但是没有讨论端口的实际实现。在UDP 中,队列是与端口联系在一起的。在客户端,当进程启动时,它从操作系统请求一个端口号。有些实现是创建一个入队列和一个出队列与每一个进程相关联。而有些实现只创建与每一个进程相关的入队列。

多路复用与多路分解

运行TCP/IP 协议簇的主机上只有一个UDP,但可能有多个想使用UDP 服务的进程。处理这种情况,UDP 采用多路复用和多路分解。

UDP 和通用简单协议比较

我们可以将UDP 与之前讨论的无连接简单协议进行比较。唯一的区别就是UDP 提供可选校验和来在接收端发现被破坏分组。如果校验和被加入分组,接收UDP 可以检测分组,如果分组被破坏可以丢弃它。然而,没有反馈被发向发送方。
UDP 是我们之前讨论的无连接简单协议的一个例子,区别在于它为差错检测加入了可选校验和。

UDP应用

一位应用设计师有时需要折中来得到最佳情况。例如,在日常生活中,我们都知道一日递送包裹比三日递送要贵。尽管时间和代价在递送包裹中都是想要获取的特性,但是它们是彼此矛盾的。我们需要选择最佳值。

尽管UDP 不满足我们之前讨论的可靠传输层协议标准,但是,UDP 更适合某些应用,因为其他某些服务可能有副作用,这些副作用或许是不可接受的或许是不称心的

UDP特性

  1. 无连接服务:UDP 是无连接协议。同一个应用程序发送的UDP 分组之间是独立的。

    例如,如果一个客户应用需要向服务器发送一个短的请求并接收一个短的响应,那么这就是优势。如果请求和响应各自可以填充进一个数据报,那么无连接服务可能更可取。在这种情况下,建立和关闭连接的开销可能很可观。在面向连接服务中,要达到以上目标,至少需要在客户和服务器之间交换9 个分组;在无连接服务中只需要交换2 个分组。无连接服务提供了更小的延迟;面向连接服务造成了更多的延迟。如果延迟是应用的重要问题,那么无连接服务更可取。

  2. 缺乏差错控制:它提供的是不可靠服务。

  3. 缺乏拥塞控制:UDP 不提供拥塞控制。然而,在倾向于出错的网络中UDP 没有创建额外的通信量。TCP 可能多次重发一个分组,因此这个行为促使拥塞发生或者使得拥塞状况加重。因此,在某些情况下,当拥塞是一个大问题时,UDP 中缺乏差错控制可以看做是一个优势

应用

  1. DNS,它使用UDP 服务,因为客户需要向服务器发送一个短的请求,并从服务器接收快速响应。请求和响应可以填充进一个用户数据报。由于在每个方向上只交换一个报文,因此无连接特性不是问题;客户或服务器不担心报文会失序传递。
  2. UDP 可用于某些路由选择更新协议,如路由选择信息协议(RIP)
  3. UDP 可用于管理进程,如SNMP
  4. UDP 适用于具有内部流量控制和差错控制机制的进程。例如,简单文件传输协议(TFTP)的进程就包含流量控制和差错控制。它可很容易地使用UDP。
  5. UDP 适合于这样的进程:它需要简单的请求-响应通信,而较少考虑流量控制和差错控制。对于需要传送成块数据的进程(如FTP)则通常不使用UDP

参考资料

计算机网络教程-自顶向下方法

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×