运输层(UDP)

UDP主要特点:

1) UDP是无连接的即发送数据之前不需要建立连接(当然发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。

2) UDP使用尽最大努力交付,即不保证可靠交付。

3) UDP是面向报文的。发送方的UDP对应用程序交下来的报文,再添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。如图,在接收方的UDP,对IP层交上来的UDP用户数据,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP一次交付一个完整的报文。

4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。

5) UDP支持一对一、一对多、多对一和多对多的交互通信。

6) UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短

UDP首部格式

用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(见下图)。由四个字段组成,每个字段的长度都是两个字节。各字段意义如下:

1) 源端口         源端口号。在需要对方回信时选用。不需要时可全用0。

2) 目的端口      目的端口号。这在终点交付报文时必须使用。

3) 长度            UDP用户数据报的长度,其最小值是8(仅有首部)。

4) 检验和        检测UDP用户数据报在传输中是否有错。有错就丢弃。

   

 从通信和信息处理角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络的边缘部分中的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

       从下图可以说明运输层的作用。设局域网LAN1上的主机A和局域网LAN2上的主机B通过互连的广域网WAN进行通信。我们知道,IP协议能够把源主机A发送出的分组,按照首部中的目的地址,送交给目的主机B,那么,为什么还需要运输层呢?

       从IP层来说,通信的两端是两台主机。IP数据报的首部明确标志了这两台主机的IP地址。但“两台主机之间的通信”的这种说法还不清楚,因为真正进行通信的实体是主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(通信)。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。在一台主机中经常有多个应用进程同时分别在和另一台主机中的多个应用进程通信。

       在下图中,主机A的应用进程AP1和主机B的应用进程AP3通信,而与此同时,应用进程AP2也和对方的应用进程AP4通信,这表明运输层有一个很重要的功能—复用和分用。这里“复用”是指在发送方不同的应用进程都可以使用同一个运输层协议传输数据(当然需要加上合适的首部)而“分用”是指接收方的运输层在剥去报文的首部后能够把这些数据正确地交付给目的应用进程。图中有一条“运输层提供应用进程间的逻辑通信”。“逻辑通信”的意思是:从应用层看,只要把应用层报文交给下面的运输层,运输车就可以把这报文传送到对方的运输层(哪怕双方相距很远),好像是这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间没有一条水平方向的物理连接。数据传送是沿着图中的虚线方向(经过多个层次)传送的。

        所以可以看出网络层和运输层的区别,网络层提供主机之间的逻辑通信,而运输层提供主机进程之间的逻辑通信。

        根据应用程序的不同需求,运输层有两种不同的运输协议,面向连接的TCP和无连接的UDP

       当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。但运输层采用无连接的UDP协议时,这种逻辑通信仍然是不可靠信道。

运输层端口

       我们知道,在单个计算机中的进程是用进程标识符(一个不大的整数)来标志的。但是在互联网环境下。用计算机操作系统所指派的这种进程标识符来标志运行在应用层的各种应用进程则是不行的。因为在互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。为了使运行在不同操作系统的计算机的应用进程能够相互通信,就必须用统一的方法(而这种方法必须与操作系统无关)对TCP/IP体系的应用进程进行标志。

       但是,把一个特定机器上运行的特定进程,指明为互联网上的通信的最后终点还是不可行的,这是因为进程的创建和撤销都是动态的,通信的一方无法识别对方机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道最后具体实现这个功能的进程是哪一个(如,要和互联网上的某个邮件服务器联系,并不是一定要知道这个服务器功能是由目的主机上的哪个进程实现的)。

       解决这个问题的方法就是在运输层使用协议端口号(protocol port number),或通常简称端口(port)。这就是说,虽然通信的终点是应用进程,但只要把所传送的报文交到目的主机的某个合适的目的端口,剩下的工作(即最后交付目的进程)就由TCP或UDP来完成。

       注意,这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址

       由此可见,两个计算机中的进程要通信,不仅要知道对方的IP地址,而且要知道对方的端口号。

 

 

当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点—应用进程。见下图。

如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应与该端口号的应用进程),就丢弃该报文,并有网际控制报文ICMP发送“端口不可达”差错报文给发送方。

UDP首部检验和

UDP首部检验和的计算方法有些特殊,在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为伪首部并不是UDP用户数据报真正的首部。只是在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。

UDP计算检验和的方法和计算IP数据报首部检验和的方法相似。但不同的是:IP数据报的检验和只检验IP数据报的首部吗,但UDP的检验和是把首部和数据部分一起都检验。在发送方,首先是先把全零放入检验和字段。再把伪首部以及UDP用户数据报看成是由许多16位的字串接起来的。若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送),然后按二进制反码计算出这些16位字的和。将此和的二进制反码写入检验和字段后,就发送这样的UDP用户数据报。在接受方,把收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16位字的和。当无差错时其结果应全为1.否则就表明有差错出现,就收方就应该丢弃这个UDP用户数据报(也可以上交给应用层,但附上出现了差错的警告)。下图给出了一个计算UDP检验和的例子。这里假定用户数据报的长度是15字节,因此要添上一个全0字节。这种差错检验方法能力并不强,但它的好处是简单,处理起来较快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值