UDP 协议
用户数据报(UDP)协议是运输层提供的一种最低限度的复用/分解服务,可以在网络层和正确的用户即进程间传输数据。UDP 是一种不提供不必要服务的轻量级运输协议,除了复用/分用功能和简单的差错检测之外,几乎就是 IP 协议了,也可以说它仅提供最小服务。UDP 是无连接的,因此在两个进程通信前没有握手过程。UDP 协议提供一种不可靠数据传输服务,也就是说,当一个进程讲一个报文发送进 UDP 套接字时,UDP 协议并不保证该报文将到达接收进程。也正是由于 UDP 不修复错误,因此到达接收进程的报文也可能是乱序到达的。UDP 是面向报文的,这是因为 UDP 并不会对应用层传递下来的报文进行任何处理,对于报文的边界信息都会保存,向下交付时交付的是完整报文。
UDP VS 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 首部只有 4 个字段:源端口号、目的端口号、长度、校验和,其中每个字段由 2 个字节组成。
接下来我们着重讨论一下校验和,校验和进行差错检验的一个例子如下:
我们想要探讨的问题是,链路层已经有一定的差错检测机制了,为什么在传输层也要?这是因为我们不能保证源主机和目的主机之间的所有链路使用的链路层协议,都具备差错检验的机制,有可能中间的某一跳的链路不支持。而且当报文段存储在某一台路由器的内存时,也有可能发生比特差错。当端到端的数据传输需要差错检测时,那么 UDP 也要在运输层提供这个功能,也就是端到端原则。不过虽然 UDP 可以进行差错检验,但是它对错误的恢复无能为力。
Wireshark实验
实验操作
- 在 Wireshark 中捕获数据包,然后执行一些会导致主机发送和接收多个 UDP 数据包的操作。也可以什么也不做,仅执行 wireshark 捕获以便获取其他程序发给您的 UDP 数据包。有一种特殊情况:简单网络管理协议(SNMP)在 UDP 内部发送 SNMP 消息,因此您可能会在跟踪中找到一些 SNMP 消息(以及 UDP 数据包)。
- 停止数据包捕获后,设置数据包筛选器,以便 Wireshark 仅显示在主机上发送和接收的 UDP 数据包。 选择其中一个 UDP 数据包并在详细信息窗口中展开 UDP 字段。
问题解答
1.从跟踪中选择一个 UDP 数据包。从此数据包中,确定 UDP 标头中有多少字段,并为这些字段命名。
UDP 的标头有 4 个字段,一共 8 byte,各字段分别为:
Source Port:源端口号
Destination Port:目的端口号
Length:长度
Checksum:校验和
2. 通过查询 Wireshark 的数据包内容字段中显示的信息,确定每个 UDP 报头字段的长度。
每个部分都是 2 byte,因此 UDP 报头为 8 byte = 64 bit。
3. 长度字段中的值是指的是什么?使用捕获的 UDP 数据包验证您的声明。
长度字段指示了在 UDP 报文段中的字节数(首部 + 数据),这是因为数据字段的长度在一个 UDP 段中不同于在另一个段中,因此需要一个明确的长度。
如图所示,报文的长度是 778 byte,加上首部的 8 byte 为 786 byte 刚好是 Length 字段的长度。
4. UDP 有效负载中可包含的最大字节数是多少?
首先先认识下有效负载:
有效负载是被传输数据中的一部分,而这部分才是数据传输的最基本的目的,和有效负载一同被传送的数据还有:数据头或称作元数据,有时候也被称为开销数据,这些数据用来辅助数据传输。——百度百科
简单地说,有效负载就是可变长度的数据部分。由于 Length 字段占 2byte = 65536 bit,并且其中 8 byte 是 UDP 首部信息。因此有效载荷 = 65536 - 8 = 65528 bit。
5. 最大可能的源端口号是多少?
两个 Port 字段占 2 byte = 65536 bit,同时端口号从 0 开始算,因此最大端口号 = 216 - 1 = 65535。
6. UDP 的协议号是什么? 以十六进制和十进制表示法给出答案。
UDP 的协议号为 17,十六进制为 0x11。
7. 观察发送 UDP 数据包后接收响应的 UDP 数据包,这是对发送的 UDP 数据包的回复,请描述两个数据包中端口号之间的关系。(提示:对于响应 UDP 目的地应该为发送 UDP 包的地址。)
发送 UDP 数据包:
接收 UDP 数据包:
参考资料
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
UDP
有效载荷
TCP/IP协议号大全