2024年6月1日发(作者:)

传摘要:UDP是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息

传送服务,UDP协议基本上是IP协议与上层协议的接口。本文中对UDP协议进行一下具体

的讲述,在第一章中将介绍UDP的基本概念,UDP协议的端口,长度和效验及其计算等方面

的问题;在第二章中介绍了UDP数据的封装与拆装以及它的应用。

第一章 UDP基本原理

1.1 UDP基本概念以及适用范围:

1.1.1 UDP的基本概念

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

[5]

。作为

运输层协议,UDP使用端口号来完成进程到进程之间的通信,UDP在

运输层提供非常有限的流控制机制,在收到分组时没有流控制也没有

确认。但是,UDP提供了某种程度的差错控制。如果UDP检测出在收

到的分组有一个差错,它就悄悄的丢弃这个分组。UDP不负责为进程

提供连接机制,它只从进程接收数据单元,并将他们不可靠的交付给

接收端。数据单元必须足够小,能够装进到一个UDP分组中。所以,

UDP提供的是无连接的、不可靠的运输服务。

1.1.2 UDP的适用范围

(1)UDP适用于需要简单的请求-响应通信,而较少考虑流控制

和差错控制的进程;

(2)UDP适用于具有内部流控制和差错控制机制的进程。例如,

简单文件传送协议(TFTP)的进程就包括流控制和差错控制,它能够

很容易的使用UDP;

(3)对多播和广播来说,UDP是个合适的运输协议。多播和广

[7]

播能力已经嵌入在UDP软件中,但没有嵌入到TCP软件中;

(4)UDP可用于进程管理,如SMTP;

(5)UDP可用于某些路由选择更新协议,如路由选择信息协议

RIP。

1.1.3 UDP协议的建立以及使用的优点

协议是建立在IP协议之上的,从进程的缓冲区输出一个UDP数

据报,把生成的UDP数据报直接封装在IP 数据报中进行传输,因此

在传输层使用UDP协议时,发送端不需要发送缓冲区,图1所示:

UDP数据报

IP数据报

[3]

UDP数据报头区 UDP数据区

IP报头区 IP数据区

图1

尽管与IP协议类似,UDP提供的也是无连接的,不可靠的数据

报传递服务,但是,有别于IP协议的是:

提供了端到端的通信机制

2.增加了对数据区的完整性校验

在网络通信中使用UDP协议的好处:在少量数据的传输时,使

用UDP协议传输信息流,可以减少TCP连接的过程,提高工作效率。

但是使用UDP协议还有很多不足:当使用UDP协议传输信息流时,用

户应用程序必须负责解决数据报排序,差错确认等问题。在多媒体应

用中,常用TCP支持数据传输,UDP支持音频/视频传输。

1.2 UDP特点及其其应用

(1) UDP是一个无连接协议,传输数据之前源端和终端不建立

连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽

可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受

应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收

端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消

息段。

(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,

包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消

息。

(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20

个字节信息包的额外开销很小。

(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据

的速率、传输带宽、源端和终端主机性能的限制。

(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机

不需要维持复杂的链接状态表(这里面有许多参数)。

(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报

文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是

[8]

保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

由于缺乏拥塞控制(congestion control),需要基于网络的机制来

减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,

因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路

由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工

具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速

率UDP流中增加主机拥塞控制来减小这个潜在的问题。虽然UDP是一

个不可靠的协议,但它是分发信息的一个理想协议。

例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP

也用在路由信息协议RIP(Routing Information Protocol)

[5]

中修

改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另

一个新的消息就会替换它。UDP广泛用在多媒体应用中,例如,

Progressive Networks公司开发的RealAudio软件,它是在因特网

上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件

使用的RealAudio audio-on-demand protocol协议就是运行在UDP

之上的协议,大多数因特网电话软件产品也都运行在UDP之上。UDP

只是在IP的数据服务之上增加了很少的一点功能,即端口的功能和

差错检验的功能。但是UDP不提供可靠性:他把应用程序封装后传给

IP层,被IP层封装后发送出去,但是不保证他们到达目的地,但UDP

在某些方面有其特殊的优点

[10]

:1.发送数据前不需要建立连接2.UDP

的主机不需要维持复杂的链接状态表用户数据报只有8个字节

的首部开销4.网络出现的拥塞不会使源主机的发送数据降低,这对

某些实现应用是很重要的。

1.3 UDP协议中涉及的的几个基本概念

[9]

1.3.1 点到点通信

点到点通信:是由网络互联层来实现的网络互联层只屏蔽了不同

网络之间的差异,构建了一个逻辑上的通信网络,因此他只解决了数

据通信问题。

1.3.2 端到端通信

端到端通信:IP协议在IP数据包的包头增添了IP地址,根据IP

地址,路由器可以一站一站的将数据包从源主机路由到目标主机,依

靠IP地址,IP协议实现了点到点的通信如图2所示:,它是建立在

点到点通信基础上的,他是比网络互联层通信更高一级的通信方式,

完成应用程序(进程)之间的通信,端到端的通信是由传输层来实现

的。

主机1 路由器 路由器 主机2

网络1 网络2

传输层端到端通信

图2

端到端通信——IP地址+端口 如图3所示:

QQ 腾讯公司 QQ

Server Web Server Client IE浏览器

C D A B

进程 进程

(服务器端 (客户机端

应用程序) 应用程序)

8000 80 (端口号) (端口号)1789 52100

UDP/TCP

用户数据报

UDP/IP

1789 8000

52100 80

服务器端 客户端

52100 80

1789 8000

用户数据报

图3

IP地址+端口 对定义了端到端通信,例如

(202.115.65.71,1500)和(202.115.64.37,80)

1.3.3 UDP协议的作用

UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一

个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前

8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

[2]

UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被

一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常

实用和可行的网络传输层协议。

1.3.4 UDP协议的应用

[13]

既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必

要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为

UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安

全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑

使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将

安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使

速度得到了保证。关于UDP协议的最早规范是RFC768,1980年发布。

尽管时间已经很长,但是UDP协议仍然继续在主流应用中发挥着作

用。包括视频电话会议系统在内的许多应用都证明了UDP协议的存在

价值。因为相对于可靠性来说,这些应用更加注重实际性能,所以为

了获得更好的使用效果(例如,更高的画面帧刷新速率)往往可以牺

牲一定的可靠性(例如,画面质量)。这就是UDP和TCP两种协议的

权衡之处。根据不同的环境和特点,两种传输协议都将在今后的网络

世界中发挥更加重要的作用。

1.4 端口

[4]

1.4.1 传输层端口

传输层端口的概念:为了识别传输层之上不同的网络通信程序(进

程),传输层引入了端口的概念,在一台主机上,要进行网络通信的

进程首先要向系统提出动态申请,由系统(操作系统内核)返回一个

本地唯一的端口号,进程再通过系统调用把自己和这个特定的端口联

系在一起,这个过程叫绑定。这样,每个要通信的进程都与一个端口

号对应,传输层就可以使用其报文中的端口号,把收到的数据传送到

不同的应用程序,如图4所示

应用程序

ICMP

ARP

以太网

应用程序 应用程序 应用程序

TCP UDP

由传输层报头中的

端口字段标识

由IP数据报头中的

上层协议字段标识

IP RARP

由以太网帧类型字

段标识

以太网网络接口层

图4

在TCP/IP协议中,传输层使用的端口号用一个16位的二进制数

表示,因此,在传输层如果使用TCP协议进行进程通信,则可用的端

口号共有2的16次方个不同的端口。

由于UDP也是传输层一个独立于TCP的协议,因此使用UDP协议

时也有2的16个不同的端口

1.4.2 UDP端口---最终目标的标识

端口分类:1.是由因特网分配给一些常用的应用层程序固定使用

的熟知端口,其数值一般为0~1023;2.是临时端口,当写一种新的

应用程序时,必须为他指派一个临时端口,否则其他的应用程序就无

法和它进行交互。而实际上,机器通常从1024起分配动态(临时)

端口。

由于大多数网络应用程序都在同一台机器上运行,计算机上必须

能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以

及源计算机能收到正确的回复。这是通过使用 UDP的“端口号”完

成的。例如,如果一个工作站希望在工作站 128.1.123.1 上使用域

名服务系统,它就会给数据包一个目的地址 128.1.123.1 ,并在 UDP

头插入目标端口号 53 。源端口号标识了请求域名服务的本地机的应

用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这

个端口上。

1.4.3标准UDP端口:

UDP数据包中,源端口字段可选,目标端口字段必须指定,接收

主机发现IP协议字段为17,就将数据交给UDP协议处理,图5对端

口号进行了描述:

DUP端口号

53

67

68

关键词

Domain

Bootps

Bootpc

描述

域名服务器

引导协议服务器

引导协议客户机

69

161

162

TFTP

SNMP

SNMP-TRAP

简单文件传输协议

简单网络管理协议

简单网络管理协议陷阱

图5

两台要通信的主机,每一端要使用一个二元地址(IP地址,端

口号)才可以完成他们之间的通信。

UDP和TCP都使用了与应用层接口处的端口与上层的应用进程进

行通信。图6说明了端口在进程之间的通信中所起的作用

应用进程 应用进程 应用进程 应用进程

端口 端口 端口 端口 端口 端口 端口 端口

TCP复用 UDP复用 TCP分用 UDP分用

TCP报文段 用户数据报 TCP报文段 用户数据报

NASP NASP NASP NASP

IP复用 IP复用

IP数据报 IP数据报

图6端口在进程之间的通信中所起的作用

若没有端口,运输层就无法知道数据应当交付给应用层的哪一个

进程,端口是用来表示应用层的进程,图7举例说明了端口的作用

计算机A

IP=131.6.23.13

连接1

端口

1500

连接2

端口

1501

计算机C

IP=130.42.85.15

端口

25

计算机B

IP=128.36.1.22

连接3

端口

1500

图7 与主机C的SMTP建立三个连接

1.4.4 UDP熟知端口号

UDP使用的熟知端口

[13]

端口

7

9

11

13

53

67

68

69

111

123

161

162

协议

ECHO

DISCARD

USERS

DAYTIME

NAMESERVER

BOOTPS

BOOTPC

TFTP

RPC

NTP

SNMP

SNMP

说 明

将收到的数据报回送到发送器

丢弃任何收到的数据报

活跃的用户

返回日期和时间

域名服务

下载引导程序信息的服务器端口

下载引导程序信息的客户端口

简单文件传送协议

远程过程调用

网络时间协议

简单网络管理协议

简单网络管理协议

协议端口号的指定的两种方式:

方式一:使用集中式管理机构。这个机构负责指派协议端口并发

布这些指派。所有的软件在设计时都要遵从这些指派的规定。这种方

式又称为统一指派(UNIVERSAL ASSIGNMENT),这些被管理机构指定

的端口指派也叫知名端口(WELL-KNOWN PORT)的指派。

方式二:使用动态绑定(DYNAMIC BINDING)。当一个应用程序

需要使用端口时,网络软件就指定一个端口。为了知道另一台机器上

的当前端口号,就必须送出一个请求报文,然后目的主机进行回答,

把正确的端口号送回来。

TCP/IP采用一种混合方式对端口地址进行管理,对某些常用服

务的端口进行指派,但为本地站点和应用程序留下了很大的端口取值

范围。

1.5插口地址

[12]

UDP需要两个标识符,IP地址和端口号。一个IP地址与一个端

口号合起来就叫做插口地址(SOCKER ADDRESS)。客户插口地址唯一

地定义了客户进程,而服务器插口地址唯一地定义了服务器进程(见

下图8)。

202.114.200.254 53

202.114.200.254 53

插口地址

图8

要使用UPD的服务,需要一对插口地址:客户端插口地址和服务

器端插口地址。至四种信息是IP首部和UDP首部的一部分。IP首部

包括IP地址,UDP首部包括端口号。

被封装在IP中的UDP数据报通过网络传输到目标主机的IP层

后,由目标主机的UDP层根据目标端口号送到接收该数据的相应进

程。

1.6 用户数据报

[9]

用户数据报UDP(图F所示为UDP用户数据报的首部和伪首部)

有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,

如图9所示,由4个字段组成,每个字段都是两个字节,各字段意义

如下所述:

源端口字段:源端口号,可选项。

目的端口字段:目的端口号。

长度字段:UDP用户数据报的长度。

检验和字段:可选项。

UDP源端口号(16位) UDP目标端口号(16位)

UDP长度(16位) UDP校验(16位)

0 15 16 31

数据区

图9 UDP数据报

最大UDP数据报长度:

1.理论上,IP数据报的最大长度是65535字节,这是由IP首

部16比特总长度字段所限制的2.取出20字节的IP首部8个字节的

UDP首部UDP数据报中的用户数据的最长长度为65507字节3,但是,

大多数实现所提供的长度比这个最大值小

主要原因:

[11]

1.应用程序可能会受到其程序接口的限制。Socket

API提供了一个可供应用程序调用的函数,以设置接受和发送缓存的

长度,对于UDP socket,这个长度与应用程序可以读写的最大UDP

数据报的长度有关,现在的大部分系统都默认提供了可读写大于8192

字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数

据数的默认值)。2.因为TCP/IP的内核实现,存在一些实现特性(或

差错),使数据报长度小于65535字节.

字节 4 4 1 1 2

字节 12 2 2 2 2

伪首部

首部 数 据

UDP用户数据段

首 部 数 据

IP数据报

图10 UDP用户数据报的首部和伪首部

在图10中伪首部并不是UDP的真正组成部分,他只是为了UDP

在进行差错检查时可以把更多的信息包含进去而人为加上的其中伪

头部的格式如图11所示

源 端IP地址(32位)

7 8 15 16 31 0

目标端IP地址(32位)

填充域(8位,全0) 协议(8位,UDP值为17) UDP长度(16位)

图11

伪头部包含IP头部的一些字段,填充域全填0,目的是使伪头

部为16位二进制数的整数倍,这是计算校验和时所需要的,UDP长

度为UDP数据报的总长(当然不能包括虚构的伪头部)。

源端在发送UDP数据报时,使用构造的UDP伪头部和UDP数据报

计算出校验和(校验和计算方法与IP伪头部校验和的计算方法相

同),然后填入UDP头部。

1.7 UDP校验和的计算

[8]

1.7.1 校验和计算步骤

1.构造该数据包的伪头部图12

目的IP地址

0 协议(17) UDP长度

图12

2.将UDP数据包的校验和字段设置为0 图13

16位源端口号 16位目的端口号

16位UDP长度 UDP校验和设置0

数据

图13

3.将UDP数据报连接在伪头部的后面,将UDP数据包的长度补足

16位的整数倍 图14

UDP伪头部 UDP包头 UDP数据 填充0

图14

4.最后,将IP协议校验和计算方法对整个数据结构作校验和计

算并填入UDP校验和字段

例题:图15(计算UDP检验和的例子)

10011001 00010011 1.53.19

153.19.8.104

00001000 01101000 8.104

12字节伪首部

171.3.14.11

10101011 00000011 171.3

00001110 00001011 14.11

全0 17 15

00000000 00010001 0和17

1087 13

8字节UDP首部 00000000 00001111 15

15

0

00000100 00111111 1087

00000000 0000 1101 13

7字节数据

数据

数据

数据

数据

00000000 00001111 15

数据

数据

数据

0

00000000 00000000 0(校验和)

01010100 01000101 数据

01010011 01010100 数据

填充 01001001 01001110 数据

01000111 00000000 数据和0(填充)

UDP校验和

按二进制反码运算求和 10010110 11101011 和

求解果的反码 01101001 00010100 校验和

图15

注:UDP的检验和是可选的,而TCP的检验和是必须的

如果传送的检验和为0,说明发送端没有计算检验和

如果发送端没有计算检验和而接收端检测到检验和有差错,那么

UDP数据报就要被悄悄的抛弃,不产生任何差错报文

UDP检验和选项在默认条件下是打开的

尽管UDP检验和是可选的,但是他们应该总是在用

UDP数据报的长度在检验和的计算过程中出现两次

1.7.2校验值的作用

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在

数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要

再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线

路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由

此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必

须具有校验值。许多链路层协议都提供错误检查,包括流行的以太网

协议,也许想知道为什么UDP也要提供检查和。其原因是链路层以下

的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP

提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地

把损坏的消息段扔掉,或者给应用程序提供警告信息。

[8]

1.8 UDP数据包

[13]

UDP数据包,是一种无连接的协议。在OSI模型中,在第四层——

传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和

不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法

得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传

输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务

器模式的网络应用都需要使用UDP协议.

UDP数据包格式如下图所示:

0 16 31

16位源端口号(可选)

16位UDP长度

16位目的端口号(必须)

16位UDP校验和(可选)

数 据