在上一篇文章中,我们讲了一些运输层的基本特点。这一篇文章中,我们就从具体的网络协议下手。在传输层常用的协议就是TCP(传输控制协议)和UDP(用户数据报协议),这一节我们先聊一聊比较简单的UDP协议。UDP是一个不提供不必要服务的最简化的运输层协议,它提供了两种最为基本的服务:进程到进程间的数据交付和差错检查。
UDP报文段结构
UDP报文由上图中的五部分组成:源端口,目的端口,长度,检验和,应用数据。应用层数据占用了UDP报文段的数据字段,其他的四个部分则组成了UDP报文段的首部字段。UDP首部中的四个字段每一个占用两个字节(16 bit)。
- 源端口号
传递源端口号有助于服务器端应用程序确定报文的来源。 - 目的端口号
传递目的端口号可以使目的主机将应用数据交付运行在目的端口的响应进程(即执行分解功能)。 - 长度
长度字段则指示了在UDP报文段中的字节数(首部加数据),因为数据字段的长度在UDP报文段中不是固定的,为了便于接收端程序的处理,所以需要一个长度字段。 - 检验和
接收方使用检验和来检查该报文段中是否出现了差错。
差错检查的实现原理
UDP检验和提供了差错检测功能。这就是说,检验和用于确认当UDP报文段从源到目的地移动时,其中的比特是否发生了改变(这种改变可能是由于链路中的噪声干扰或者存储在路由器中引入问题引起的)。检验和的计算方法是这样的:发送方的UDP对报文段中的所有16比特字的和进行反码运算,求和遇到任何溢出都被回卷。得到的结果放在UDP报文段中的检验和字段。可以在[RFC 1071]中找到有效实现的细节.
虽然UDP提供了这种差错检测的机制,但是它对差错回复却无能为力。UDP的某种实现只是丢弃受损的报文段,其他的实现是将受损的报文段交给应用程序并且给出警告。
UDP应用场景
UDP不提供可靠数据传输,就没有三次握手这种消耗时间的建立连接的操作,也没有对包的各种检查以及状态维护操作。所以使用UDP作为传输层协议往往会更加快速,但也可能会出现丢失数据的情况。UDP也不提供拥塞控制,所以它没有传输速率限制。由于UDP协议传输时的特点,它还是有许多的应用场景。它主要适合与可以容忍少量数据丢失,低时延,需要快速传输大量数据的场景。如因特网电话、视频会议之类的实时应用以及流式多媒体的传输。
结论
- UDP是无连接的
- UDP只提供进程到进程间的数据交付和差错检查两种服务
- UDP报文由源端口,目的端口,长度,检验和,应用数据五部分组成
- UDP适合与可以容忍少量数据丢失,低时延,需要快速传输大量数据的场景