传输层概述

从网络体系结构的角度,传输层既是面向通信的最高层,又是用户功能的最低层。在通信网络的路由器中只用到下三层的功能,只有在主机的协议栈中才有传输层。

传输层的基本功能是利用通信子网为两台主机的应用进程之间,提供端-端的性能可靠、价格合理、透明传输的通信服务。

传输层基本功能

image

上图表示两台主机(A和B)通过互连的通信网络进行通信的情况。图中两个传输层之间有一条双向箭头,表示传输层为应用进程(AP1~AP4)之间提供的逻辑通信。所谓“逻辑通信”意指应用进程的报文到达传输层后,似乎是沿着水平方向直接传送到远地的传输层,但事实上应用进程之间并没有这一水平方向的物理连接,被传送的数据实际上是经过传输层以下各层及通信网络来传送的(即沿着图中虚线方向)。当两主机通过多个通信网络通信时,由于各通信网络所提供的服务不一定相同,传输层会弥补各通信网络所提供服务的差异和不足,并在其提供的服务的基础上,利用传输层的协议及其服务功能,使应用进程得到一个面向通信的通用传输接口。此时,各通信网络对两端应用进程是透明的。也就是说,传输层向高层用户屏蔽了通信网络的具体细节,它使应用进程所看到的只是在两个传输层实体之间存在着一条端-端的可靠的逻辑通信链路。这条逻辑通信链路对上层因传输层使用的协议不同而有很大的差异。当传输层采用面向连接的TCP协议时,下面的网络只提供尽最大努力服务,这条逻辑通信链路相当于一条全双工的可靠信道;当传输层采用无连接的UDP协议时,这条信道仍是一条不可靠信道。

通常,在一台主机中存在多个应用进程与另一台主机中的多个应用进程同时通信的情况。如上图中主机A的AP1与主机B的AP4通信,与此同时,AP2也与AP3通信。这表明传输层可同时支持多个进程的连接,具有 复用(multiplexing)分用(demultiplexing) 的功能。这里的“复用”是指发送端不同的应用进程都使用同一个传输层协议传送具有一定格式的报文,而“分用”是指接收端的传输层剥去报文首部后将数据部分正确交付给目的应用进程。

传输层还必须具有流量控制、拥塞控制和差错控制等功能,既要负责报文无差错、不丢失、不重复,还要保证报文的顺序性,从而提高其服务质量。从某种意义上来讲,传输层协议与数据链路层协议相类似,但它们所处的环境不同。数据链路层的环境是两个交换结点直接相连的一条物理信道,而传输层的环境是两台主机之间的通信网络。因此,传输层协议比数据链路层协议要复杂。另外,传输层与网络层也有着明显的区别。传输层为应用进程之间提供端-端的逻辑通信,而网络层为主机之间提供逻辑通信。因此,传输层还具有网络层无法替代的许多重要功能。

传输层协议及服务

根据应用程序的不同要求,因特网的传输层主要有两个传输协议:一个是无连接的用户数据报协议UDP(User Datagram Protocol),另一个是面向连接的传输控制协议TCP(Transmission Control Protocol)。这两个协议都是因特网的正式标准。它们所使用的 传输协议数据单元TPDU(Transport Protocol Data Unit) 分别称为UDP用户数据报和TCP报文段。

下图表示TCP/IP体系中传输层协议与相邻层协议之间的关系。

image

传输层提供的服务是由位于传输层内部的硬件或软件(称为传输实体)来完成的。传输服务的内容包括服务类型、服务质量、服务原语、连接管理和状态报告等。传输服务有两种类型,即面向连接的传输服务和无连接的传输服务。

面向连接的传输服务与面向连接的网络服务十分相似,连接都有三个阶段:建立连接数据传输释放连接。在编址和流控制方面也有相似之处。那么,既然传输层服务与网络层服务如此相似,为什么还要设立两个独立的层次呢?

这里的问题就在于传输层的代码是完全运行在用户主机上的,而网络层主要运行在由网络服务提供者控制的路由器上面。如果网络层提供的服务不理想,造成分组的频繁丢失或路由器时常崩溃,那又如何解决呢?

显然,问题就出在用户对网络层并没有真正的控制权,解决这一问题的唯一可行的办法就是在网络层上面增加一个层次——传输层。这样,传输层的存在将使得传输服务比网络服务更可靠,分组的丢失、损坏甚至网络重组都可以被传输层检测到,并采取相应的补救措施。而且因传输服务独立于网络服务,就可以采用一个标准的原语集提供传输服务。传输服务原语可以通过调用库函数来实现,从而使这些原语独立于网络服务原语。而网络服务则因不同的网络,其服务原语可能存在很大的差别,如无连接的LAN服务就可能完全不同于面向连接的WAN服务。将网络服务隐藏在一组服务原语后面,其好处是一旦改变了网络服务,只要求替换一组库函数即可,新的库函数使用了不同的低层网络服务,但却实现了同样的传输服务原语。由于有了传输层,又有了标准的传输服务,应用开发人员就可以根据一组标准的原语来编写程序代码,使其应用程序广泛地运行在各种不同的网络平台上。 传输服务通过执行传输服务原语来实现的。传输服务原语是传输服务用户与服务提供者之间交换的一些必要信息。一种服务通常由一组原语来描述,用户进程调用这些原语来实现该服务。各种原语有着不同的参数,如被叫地址、主叫地址、确认和服务质量等。传输实体提供的服务质量根据用户的要求有所不同,服务质量也用参数来表示。这些参数(如优先级、连接建立时延、连接失败概率等)是在建立连接时商定的。

无连接的传输服务在传送数据之前不必先建立连接,远地主机的传输层在收到对方用户的数据报时没有流控制机制,也不给出任何确认。因此,面向连接的传输服务比无连接的传输服务要花费更多的开销,占用处理机更多的资源。

传输层端口

传输层与网络层在功能上的最大区别就是传输层提供了进程通信的能力(即端-端通信)。运行在计算机中的进程是用进程标识符来标志的,是在因特网环境中,由于计算机所用的操作系统各不相同,不同操作系统又使用不同格式的进程标识符,因此各种应用进程不应当采用由计算机操作系统所指派的进程标识符,而必须用统一的方法对TCP/IP 体系的应用进程进行标志。另外,由于进程存在创建和销销的动态性,通信一方无法识别对方计算机上的进程。因此,我们可以利用目的主机提供的功能来识别终点,至于具体实现该功能的哪个进程就不必知道。

在TCP/IP体系中,解决上述问题的方法是在传输层使用协议端口号(protocol port number),或简称端口(port)。这种端口是协议栈各层之间的抽象的软件端口,它不同于路由器或交换机中的硬件端口。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层各种协议进程与传输实体进行层间交互的一种地址。端口的具体实现方法则取决于系统使用的操作系统。在传输层协议中,端口就是传输协议的服务访问点TSAP。端口是一个非常重要的概念,因为应用层的各种进程都是通过相应的端口与传输实体进行交互的。下图表示端口在进程通信中的作用。

image

传输层对每个端口都赋予一个16位(二进制)的端口号。这个端口号只具有本地意义,因为它仅标志本计算机应用层中的进程与传输层实体交互时的层间接口。由于TCP和UDP是彼此独立的两个软件模块,它们的端口号允许相同。而且因特网中不同计算机中的端口号无不关联,各台计算机也允许使用相同的端口号。

由于因特网上计算机之间的通信采用客户/服务器模式,两台计算机中的进程通信时,不仅必须知道对方的IP地址,而且还需要知道对方的端口号。

传输层的端口号可分为下面两大类:

(1)服务器使用的端口号

此类端口又可分为两类:一类是熟知端口号(well-known port number)或系统端口号,其数值为0~1023。因特网号码指派管理局IANA负责分配一些常用的应用层程序固定使用的熟知端口,并为所有客户进程所共知。常用的熟知端口号如表7-1所列。另一类是登记(或注册)端口号,其数值为1024~49151。此类端口号供没有熟知端口号的应用程序使用。使用该范围内的端口号必须在IANA登记,以免重复。

常用的熟知端口号:

应用程序熟知端口号
Echo7
FTP(data)20
FTP(control)21
TEL NET23
SMTP25
DNS53
TFTP69
HTTP80
POP3110
SNMP161
SNMP(trap)162
BGP179
RIP520

(2)客户端使用的端口号(或称临时端口号)

其数值为49152~65535。此类端口供客户进程运行时临时选择使用。当客户进程需要传输服务时,可向本地操作系统动态申请,操作系统随即返回一个本地唯一的端口号。一旦通信结束,随即收回此端口号供其他客户进程使用。

提示

①TCP/IP规定服务器使用熟知端口号或登记端口号,但也有例外,如有的客户进程也被指派了熟知端口号; ②最初的建议是客户只能使用临时端口号,但多数系统并没有遵循这一建议。