配色: 字号:
3.3无连接运输:UDP
2014-07-02 | 阅:  转:  |  分享 
  
第三章运输层



3.3无连接运输:UDP



由[RFC768]定义的UDP只是做了运输协议能够做的最少工作。除了多路复用/多路分解功能及一些轻型的差错检测外,它几乎没有对IP增加别的东西。实际上,如果应用程序开发人员选择UDP而不是TCP,则应用程序几乎是直接与IP打交道。



UDP从应用进程得到数据,附加上多路复用/多路分解服务所需的源端口号和目的端口号字段,及两个其它的小字段,然后将形成的报文段交给网络层。网络层将该运输层报文段封装到一个IP数据报中,然后尽力而为地将此报文段中的数据交付给正确的应用进程。注意到使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有进行握手。正因如此,UDP被称为无连接的。



DNS是一个通常使用UDP的应用层协议的例子。当一台主机中的DNS应用程序想要进行一次查询时,它构造了一个DNS查询报文并将其交给UDP。无须执行任何与运行在目的端系统中的UDP实体之间的握手,主机端的UDP为此报文添加首部字段,然后将其发送给一个名字服务器。查询主机中的DNS应用程序便等待对该查询的响应。如果它没收到响应,则要么试图向另一个名字服务器发送该查询,要么通知调用的应用程序它不能获得响应。



为什么开发人员宁愿在UDP上构建应用,而不选择TCP?既然TCP提供了可靠的数据传输服务,而UDP不能提供,那么TCP是否总是首选呢?答案是否定的,因为有许多应用更适合用UDP,这主要有以下原因:



应用层能更好地控制要发送的数据和发送时间。采用UDP时,只要应用程序将数据传递给UDP,UDP就会将此数据打包成UDP报文段并立即将其传递给网络层。另一方面,TCP有一个拥塞控制机制以便当源和目的主机间的一条或多条链路变得非常拥塞时,遏制运输层TCP发送方。TCP仍将继续重新发送数据报文段直到目的主机收到此报文并加以确认,而不管可靠交付需要多长时间。



无需连接建立。TCP在开始数据传输之前要经过三次握手。UDP却不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延,这可能是DNS运行在UDP之上而不是运行在TCP之上的主要原因。



无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数、序号与确认号的参数。



分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节。



使用UDP的应用时可以实现可靠数据传输的。这可通过在应用程序自身中建立可靠性机制来完成(例如,可通过增加确认与重传机制来实现)。但这并不是无足轻重的任务,它会使应用程序开发人员用一段较长的时间进行调试。



3.3.1UDP报文段结构



UDP报文段结构如图3-7所示,它由[RFC768]定义,应用层数据占用了UDP报文段的数据字段。例如,对于DNS应用,数据字段要么包含一个查询报文,要么包含一个响应报文。对于流式音频应用,音频抽样数据填充到数据字段。UDP首部只有4个字段,每个字段由两个字节组成。



通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程。接收主机使用检验和来检查报文段中是否存在差错。事实上,计算检验和时,除了UDP报文段以外还使用了IP首部的一些字段,但是我们忽略了这些细节,以便从整体上看问题。



3.3.2UDP检验和



UDP检验和提供了差错检测功能,即检验和用于确定当UDP报文段从源到达目的时,其中的比特是否发生了改变。发送方的UDP对报文段中的所有16比特字节的和进行反码运算,求和时遇到任何溢出都被回卷。得到的结果放在UDP报文段中的检验和字段。下面给出一个简单的例子,假定我们有下面3个16比特字:



0110011001100000

0101010101010101

100111100001100



三个相加得到:0100101011000010,最后一次加法有溢出,这要被回卷。反码运算是将所有的0换成1,所有的1换成0。因此,值0100101011000010的反码运算结果是1011010100111101,这就是检验和。在接收方,全部的4个16比特字(包括检验和)一起相加。如果分组中无差错,则显然在接收方这个和将是1111111111111111.如果有1个比特是0,那么我们就知道分组中出现了差错。



UDP提供了检验和的原因是由于不能保证源和目的之间的所有链路都提供差错检测,即其中也许有一条链路使用没有差错检测的协议。此外,即使报文段经链路正确地传输,当报文段存储在某台路由器的内存中时,也可能引入比特差错。既未确保逐段链路的可靠性,又未确保内存中的差错检测,UDP必须在端到端基础上在运输层提供差错检测。这是一个在系统中被赞扬的端到端原则,该原则表述为,因为某种功能必须基于端到端实现,‘与在较高级别提供这些功能的代价相比,在较低级别上设置的功能可能是冗余的或几乎没有价值。’



虽然UDP提供差错检测,但它并不可能进行差错恢复。某些UDP实现只是丢弃受损的报文段,其余的实现是将受损的报文段交给应用程序并告警。





献花(0)
+1
(本文系miracle859首藏)