用户数据报(UDP)协议是运输层提供的一种最低限度的复用/分解服务,可以在网络层和正确的用户即进程间传输数据。UDP 是一种不提供不必要服务的轻量级运输协议,除了复用/分用功能和简单的差错检测之外,几乎就是 IP 协议了,也可以说它仅提供最小服务。UDP 是无连接的,因此在两个进程通信前没有握手过程。UDP 协议提供一种不可靠数据传输服务,也就是说,当一个进程讲一个报文发送进 UDP 套接字时,UDP 协议并不保证该报文将到达接收进程。也正是由于 UDP 不修复错误,因此到达接收进程的报文也可能是乱序到达的。UDP 是面向报文的,这是因为 UDP 并不会对应用层传递下来的报文进行任何处理,对于报文的边界信息都会保存,向下交付时交付的是完整报文。
UDP(User Datagram Protocol)用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:
- UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。
- UDP尽最大努力交付,不保证交付可靠性。
- UDP 是面向报文的,对于从应用层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。
- UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
从应用层到传输层,再到网络层的各层次封装:
1 UDP 协议分析
1.1 UDP 报文
UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:
- 源端口: 源端口号,需要对方回信时选用,不需要时全部置 0 ;
- 目的端口:目的端口号,在终点交付报文的时候需要用到;
注:端口是用来指明数据的来源(应用程序)以及数据发往的目的地(同样是应用程序)。字段包含了 16 比特的 UDP 协议端口号,它使得多个应用程序可以多路复用同一个传输层协议及 UDP 协议,仅通过端口号来区分不同的应用程序。
- 长度:UDP 的数据报的长度(包括首部和数据)其最小值为 8(只有首部)。字段记录了该 UDP 数据包的总长度(以字节为单位),包括 8 字节的 UDP 头和其后的数据部分。最小值是 8(报文头的长度),最大值为 65535 字节;
- 校验和:检测 UDP 数据报在传输中是否有错,有错则丢弃。它的值是通过计算 UDP 数据报及一个伪包头而得到的。校验和的计算方法与通用的一样,都是累加求和。
1.2 UDP 校验和的计算
对发送方的 UDP 报文段的所有 16 比特字的和进行反码运算,当求和遇见溢出的时候,进行回卷(回卷的补充在下面),得到的结果放在 UDP 报文段中的检验和字段。
1. UDP 校验的所需信息
- (1) UDP 伪首部:源 IP + 目的 IP + Byte 0 + Byte17 + UDP 长度,目的是让 UDP 两次检查数据是否以及正确到达目的地,只是单纯为了做校验用;
- (2) UDP 首部:该长度不是报文的总长度,而是 UDP(包括 UDP 头和数据部分)的总长度;
- (3) UDP 的数据部分。
2. 计算步骤
- (1) 把伪首部添加到 UDP 上;
- (2) 计算初始时将校验和字段添零;
- (3) 把所有位划分为 16 位( 2 字节)的字;
- (4) 把所有 16 位的字相加,如果遇到进位,则将高于 16 字节的进位部分的值加到最低位上;
- (5) 将所有字相加得到的结果应该为一个 16 位的数,将该数按位取反则可以得到校验和。
在计算校验和的时候,需要在 UDP 数据报之前增加 12 字节的伪首部,伪首部并不是 UDP 真正的首部。只是在计算校验和,临时添加在 UDP 数据报的前面,得到一个临时的 UDP 数据报。校验和就是按照这个临时的 UDP 数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了 UDP 数据报,又对 IP 数据报的源 IP 地址和目的 IP 地址进行了检验。
链路层已经有一定的差错检测机制了,为什么在传输层也要?这是因为我们不能保证源主机和目的主机之间的所有链路使用的链路层协议,都具备差错检验的机制,有可能中间的某一跳的链路不支持。而且当报文段存储在某一台路由器的内存时,也有可能发生比特差错。当端到端的数据传输需要差错检测时,那么 UDP 也要在运输层提供这个功能,也就是端到端原则。不过虽然 UDP 可以进行差错检验,但是它对错误的恢复无能为力。
1.3 UDP 与 TCP 对比
UDP 和 TCP 协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP 协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息。发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与 TCP 不同,UDP 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把 UDP 协议称为不可靠的传输协议。
- TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务,TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;
- UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
- UDP具有较好的实时性,工作效率较TCP协议高;
- UDP段结构比TCP的段结构简单,因此网络开销也小;
- TCP协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用TCP传输数据。
相比于 TCP 协议,UDP 协议什么都不提供,那么为什么还需要 UDP 协议呢?UDP 在以下 4 个方面具有一定的优势,对于某些应用来说更为合适。
- 应用层发送什么数据以及何时发送的问题,使用 UDP 协议更为精细。TCP 的传输有拥塞控制机制,会限制发送方的发送思路,同时还需要 ACK 确认。而 UDP 没有包括拥塞控制机制,只需要把数据封装好放进 UDP 报文就能进行发送,所以 UDP 的发送端可以用它选定的任何速率向其下层(网络层)注入数据。值得注意的是实际端到端吞吐量可能小于该速率,这可能是因为中间链路的带宽受限或因为拥塞而造成的。
- 无需建立连接。UDP 不需要像 TCP 那样进行 3 次握手,因此 UDP 并不会产生连接建立带来的时延。例如 DNS 运行在 TCP 上的话,就会使得效率受到影响,因此使用 UDP 协议更合适。
- 无连接状态。UDP 不需要建立连接,也就不需要为了维持连接产生其他的开销。而 TCP 由于需要维护连接的发送缓存、拥塞控制参数、序号和确认号参数等信息,需要对这些信息进行跟踪和审计,就需要更多的开销。
- 分组首部开销小,UDP 的首部开销仅有 8 字节,TCP 则需要 20 字节。
对于有些应用而言,是可以容忍丢失且对速率是很敏感的,例如视频会议等实时性的引用,TCP 协议会造成较大的时延而影响性能。不过 UDP 协议的使用还是存在争议的,如果没有拥塞控制机制来防范网络拥塞,在大量端系统都采用流式高比特视频等应用,会使得路由器出现大量分组溢出,同样会影响性能,而且会干扰 TCP 协议的运行。不过这个问题已经有研究人员进行探讨,并提出了相关机制。
最后一个问题是,UDP 能否实现可靠数据传输?虽然 UDP 本身不提供这样的服务,但是 UDP 应用可以在应用层添加可靠传输机制,例如实现错误恢复等。
许多应用只支持 UDP ,它不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP 是最好的选择。数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP 也是一个好的选择。
2 实验
1.从跟踪中选择一个 UDP 数据包。从此数据包中,确定 UDP 标头中有多少字段,并为这些字段命名。
答:UDP 的标头有 4 个字段,一共 8 byte,各字段分别为:Source Port:源端口号;Destination Port:目的端口号;Length:长度;Checksum:校验和
-
通过查询 Wireshark 的数据包内容字段中显示的信息,确定每个 UDP 报头字段的长度。
答:每个部分都是 2 byte,因此 UDP 报头为 8 byte = 64 bit。 -
长度字段中的值是指的是什么?使用捕获的 UDP 数据包验证您的声明。
答:长度是包括 UDP 头+数据长度,UDP 头长度是8 Byte,有着以下的公式:(仅限IPV4 下UDP 传输),IP 长度=IP 头长度(20Byte)+UDP 头长度(8Byte)+UDP 数据,UDP 长度=UDP 头长度(8Byte)+UDP 数据,在作者抓包结果中UDP 长度=UDP 头长度(8Byte)+SNMP 服务长度
- UDP 有效负载中可包含的最大字节数是多少?
首先先认识下有效负载:
有效负载是被传输数据中的一部分,而这部分才是数据传输的最基本的目的,和有效负载一同被传送的数据还有:数据头或称作元数据,有时候也被称为开销数据,这些数据用来辅助数据传输。——百度百科
简单地说,有效负载就是可变长度的数据部分。由于 Length 字段占 2 Byte = 65536 bit,并且其中 8 Byte 是 UDP 首部信息。因此有效载荷 = 65536 - 8 × 64 = 65472 bit。
-
最大可能的源端口号是多少?
两个 Port 字段占 2 byte = 65536 bit,同时端口号从 0 开始算,因此最大端口号 = 216 - 1 = 65535。 -
UDP 的协议号是什么? 以十六进制和十进制表示法给出答案。
答:UDP 的协议号为 17,十六进制为 0x11。
- 观察发送 UDP 数据包后接收响应的 UDP 数据包,这是对发送的 UDP 数据包的回复,请描述两个数据包中端口号之间的关系。(提示:对于响应 UDP 目的地应该为发送 UDP 包的地址。)
答:下图左侧为发送UDP,右图为接收UDP。
即发送者发送端口号在接收返回(响应)UDP 时候会变成接收端口号。接收者发送返回(响应)UDP 时候接受端口号会变成发送端口号。
端口号
主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在与 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信。
两个主机的传输层之间有一个灰色双向箭头,写着“传输层提供应用进程间的逻辑通信”。
逻辑通信:看起来数据似乎是沿着双向箭头在传输层水平传输的,但实际上是沿图中的虚线经多个协议层次而传输。
在上图中,AP1 与 AP3 的通信与 AP2 与 AP4 的通信可以使用同一个传输层协议来传输(TCP 或 UDP),根据 IP 地址或 MAC 地址都只能把数据传到正确的主机,但具体需要传到哪一个进程,是通过端口来辨认的。
比如同时使用浏览器和 QQ,浏览器占用 80 端口,而 QQ 占用 4000 端口,那么发送过来的 QQ 消息便会通过 4000 端口显示在 QQ 客户端,而不会错误地显示在浏览器上。
端口号有 0 ~ 65535 的编号,其中:
- 编号 0 ~ 1023 为 系统端口号 ,这些端口号可以在网址 www.iana.org 查询到,它们被指派给了 TCP/IP 最重要的一些应用程序,以下是一些常见的系统端口号:
应用层协议 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP |
---|---|---|---|---|---|---|---|
系统端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 |
- 编号 1024 ~ 49151 为登记端口号,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复。
- 编号 49152 ~ 65535 为短暂端口号,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用。