引言
- Internet传输层主要有两个协议,无连接和面向连接各一个,互为补充。无连接协议是UDP,它除了给应用程序提供发送数据包功能并允许它们在所需层次之上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的协议是TCP,该协议几乎做了所有的事情。它建立连接,并通过重传机制增加了可靠性,同时还进行流量控制和拥塞控制,代表使用它的应用程序做了所有的一切。
- UDP是最简单的传输协议。由于UDP是传输层协议,通常运行在操作系统中二使用UDP的协议通常运行在用户空间,因而可以把对UDP的使用视作应用程序。然而,它们的使用技术对许多应用都有用,而且把这些技术视作属于传输层更好。
1、UDP概述
- Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP)。UDP为应用程序提供了一种无需建立连接就可以发送封装的IP数据报方法。RFC 768描述了UDP。
- UDP传输的段由8字节的头和有效载荷字段构成。下图描述了头信息。两个端口分别用来标识源机器和目标机器内部的端点。当一个UDP数据包到来时,它的有效载荷被递交给与目标端口相关联的那个进程。在调用了BIND原语或者其他类似的原语之后,这种关联就建立起来了。可以把端口看做应用程序租来接收数据包的邮箱。实际上,采用UDP而不是原始IP的最主要价值在于增加了源端口和目标端口。如果没有端口字段,传输层将无从知道如何处理每个入境数据包;有了端口之后,它就能把内嵌的段递交给正切的应用程序处理。
- 当接收段必须将一个应答返回给源端时,源端口字段则是必需的。只要将入境字段中的源端口字段复制到出境段中的目标端口字段。UDP长度字段包含8个字节的头和数据两部分的总长度。最小长度是8个字节,最大长度是65 515字节,恰好低于填满16比特的最大字节数,而这是由IP数据包限制的。一个可选的校检和字段还提供了额外的可靠性。它校检头、数据和一个概念性的IP伪头。执行校检和计算时,校检和字段先被设置为0,如果数据字段的长度是奇数则用0填充成偶字节。校检和算法很简单,先按16位字的补码相加求和,然后再取总和的补码。因此,当接收端对整个段计算校检和时,要包括UDP校检和字段,正确的结果应该为0。如果发送端没有计算校检和,则将该字段值填为0,因为补码计算结果可能碰巧真是0,则储存为全1。然而,关闭校检和计算并不是明智之举,除非数据传输的质量并不重要(如数字化语音)。
- IPv4的伪头部分如图所示,它包含源机器和目标机器的32位IP地址、UDP的协议号(17),以及UDP段(包括头)的字节计数。IPv6的伪头与其类似。在UDP校检和计算中包含伪头将有助于检测出被错误递交的数据包,但是传输层在计算校检和时需要地址的做法违反了协议分层原则,因为IP地址属于IP层,而不属于UDP层。TCP在计算校检和的时候也使用了统一的伪头。
- 或许值得明确一提的UDP没有做的事情。它没有流量控制、拥塞控制,或者接收到一个坏段后的重传机制。所有这一切都必须由用户进程来完成。它只是提供了一个与IP协议的接口,并在此接口上增加通过端口号复用多个进程的功能,以及可选的端到端检测功能。这就是UDP所做的一切。对于需要对数据包流实施精确控制、错误检测或者时序功能的应用,UDP提供的服务恰到好处。UDP协议特别有用的一个领域是客户机-服务器应用开发。一般情况下,客户端向服务器发送一个简短的请求报文,并期待来自服务器的简短报文。如果请求或回复报文丢失,客户端就会超时,然后再试一次。以UDP实现的代码相比需要初始建立连接的协议(比如TCP)不仅代码简单,而且需要交换的报文也很少(对于连接来说,每个方向都需要一份)。以这种方式使用UDP的一个应用是域名系统(DNS),简单地说,如果一个应用程序需要查询某个主机的IP地址,