UDP使用IP层提供的服务,把从应用层得到的数据从一台主机的某个应用程序传给网络上另一台主机上的某个应用程序。UDP协议的功能及特点是:第一,UDP是无连接的。UDP传送数据前并不与对方建立连接,在传输数据前,发送方和接收方相互交换信息使双方同步。第二,UDP不对收到的数据排序。在UDP报文的头部中没有关于数据顺序的信息(如TCP中所采用的序号),而且报文不一定按顺序到达,所以接收端无从排序。第三,UDP对接收到数据报不发送确认信号。发送端不知道数据是否被正确接收,也不会重发数据。第四,UDP传送数据快(比较TCP)系统开销少。以上几点说明UDP提供的是无连接、不可靠的数据传送或传输服务。
1.UDP数据报格式
UDP数据报包含两部分:UDP头部和UDP数据区,如图6-2所示。
UDP源端口号:标识主机应用程序所使用的端口号;可选项,没用时全置为0。如源主机是客户端,此端口号通常是进程向协议软件请求而得到的临时端口号;如源主机是服务器,此端口号一般为熟知端口。
UDP目的端口号:标识了此数据报接收端的应用程序所使用的端口号。
UDP数据报长度:表示数据报长度,包含头部和数据区;以字节为单位;最小值为8(没有数据时长度)。
UDP校验和:可选项,没用时全置为0,减少计算开销。需要时,计算校验和要用到伪头部概念。UDP伪头部格式如图6-3所示。
图6-2 UDP数据报格式
图6-3 UDP伪头部格式
此处,协议标识符为17。UDP长度是指UDP数据报的长度(不包括伪头部的长度)。计算校验和之前,把UDP数据报头部中的校验和域置为0,加上伪头部,把所有bit分成一个个的16bit字,如总字节数为奇数则补一个字节的零(这一字节的零在计算完校验和后会被丢弃),把所有的字相加(二进制反码求和),对相加的结果取补码得到校验和。结果若刚好为全0,则应置为全1。在接收端也按上面过程计算,如所得结果为全零,则此数据报为正确,可接收下来;如结果为其他值,则应丢弃该数据报。图6-4为计算校验和的实例。
伪头部只用于计算校验和,发送的UDP数据报中不包括它。伪头部中包含UDP数据报中所没有的IP地址信息,当包含了通信双方的IP地址(IP地址+端口号)才能完全标识UDP数据报的报数。因此,校验和可用于检验数据报是否到达正确的目的地。
图6-4 计算校验和
UDP检验和为可选项,但大多数应用的实现都选该项,因为IP只对IP数据报头部进行校验,如果UDP也不对数据内容进行校验,那就要由应用层来检测链路层上的传输错误了。在选择UDP检验和后,发送端UDP计算该数据段内容,并以16位字长为单位求其和的反码。例如有以下3个16位的字:0110011011001100、0101010101010101、0000111100001111,按UDP校验和的计算方式进行校验和计算其结果为:0011010100110101。在接收端,所有16位字(含校验和)如数据段没有发生错误,接收端得到的和应是1111111111111111。如其中任何一位为0,就可判断该数据段传输出错。当接收端判断收到的数据段有错,则简单将其丢弃,并不向信源报告错误。
2.UDP的操作
(1)UDP封装与解封装(www.xing528.com)
应用程序使用UDP协议提供的接口传送数据。UDP把从应用层传来的数据加上一个UDP头,将其传给网络层,网络层也加上一个头部,封装成IP数据包送到数据链路层,数据链路层同样加上相应的头部把数据封装,最后送到物理层在网络中传输。此过程示意图如图6-5所示。在接收端,数据包从底层向上传递,每一层都把各自的头部取下,把数据往上传,直到应用层程序得到发送端发送的数据。
图6-5 UDP数据报的封装
在接收端,开解封装过程与加封装过程相反。物理层把接收到的信号解调转换成比特形式,然后传给数据链路层;链路层对数据进行检查,如果正确则丢弃头部和尾部并把数据部分向上传给网络层;网络层没有检查到错误的话,IP的头部被丢弃,数据部分继续向上传递给UDP,UDP检查校验和等,如正确,UDP按目的端口号把用户数据传给相应的应用进程。
(2)传输层的多路复接与多路分解
为了让多个进程同时与远端主机相应进程进行通信,UDP协议通过端口机制对应用层多个用户数据进行复接,然后传给IP层进行传送。在接收端,UDP需要对IP层传上来的数据根据端口分配给相应的进程使用。
应用程序多路处理功能是传输层最为基本和十分重要的功能。在信宿主机上,传输层接收到来自其下网络层的数据段,然后将数据转给主机中的各个运行中的进程。例如,假设用户在浏览网页的同时,还运行一个FTP会话和两个Telnet会话,总共4个网络应用进程,如果传输层收到了网络层传来的数据,它就要将数据传到相应的应用进程。
UDP和TCP在段头部中设置两个特殊字段来解决应用程序多路复接的功能,两字段分别为源端口与宿端口,当把两字段合并时,就可确定信宿主机中唯一的某特定进程。端口号为16位数字,其范围为0~65535。0~1023端口号称为常用端口号并限制使用,表明这些端口号仅限于最常用的网络应用,如HTTP与FTP等。HTTP使用端口80,FTP使用端口21与端口20。
由此可知,在主机中运行的每一种网络应用程序都有一端口号,但为何在传输层协议UDP的字段中有两个端口号(源端口和宿端口)呢?这是因为同一主机可能在同一个时刻运行两个或两个以上相同的应用程序进程(如同时打开两个浏览器的窗口),而一个应用程序的端口号则无法确定主机中相同类型应用程序进程的某个具体的进程。如图6-6所示。
图6-6 传输层与多路处理
为解决此问题,需要明确互联网应用程序运行模式基本为客户端/服务器模式,每一个应用程序都是分成两个部分在不同的主机上运行。启动应用程序一方被称为客户端,等待服务请求到达一方称为服务器。现以Telnet为例说明这个问题。当用户启动一个Telnet服务的宿端口为23,而源端口则由操作系统生成一个未被使用的端口号x。每个发送到Telnet服务器的段都将宿端口设为23,而源端口则设为x。当段到达Telnet服务器时,在段中的宿端口和源端口使得服务器可以确定具体的应用进程。宿端口为23确定是Telnet服务,而源端口则确定具体的应用进程。
当数据从服务器流向客户端时,情况则颠倒过来,源端口为23,宿端口为x(该x与发送到服务器的源端口号相同)。
当该段到达客户端时,段中的源端口和宿端口使客户端主机可确定正确的应用程序进程并将数据递交给它(如图6-7)。
既然从客户端发送到服务器的源端口号由各网络上的主机随机选择,如果两台主机所选择的源端口完全相同,服务器进程又如何区别呢?该问题在大型Web网站上,很易出现。解决此问题不难,因服务器进程在对段数据进行甄别时参考数据报的IP地址。虽然源端口号可能重复,但加上IP地址后,冲突即不会发生。
图6-7 在C/S应用中源端口与宿端口的使用
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。