深入理解网络传输协议——TCP/IP协议的可靠交付服务的特征
应用程序与TCP/P可靠交付服务之间的接口可以用五个特征来描述:
- 面向数据流。
当两个应用程序(用户进程)传输大量数据时,我们把这些数据当做一个可划分为八位组(octet)的比特流(通常我们也将八位组非正式地称为字节)。在目的机器上运行的数据流交付服务软件传给接收方的八位组与源机器上的发送方送出来的完全一样。
- 虚电路连接。
数据流的传输与打电话类似。在传输开始之前,接收应用程序和发送应用程序都要与操作系统进行交互,通知它们需要进行数据流传输。
从概念上讲,数据流传输过程就像一个应用程序打了一个对方必须接的电话。在双方的操作系统中,协议软件模块通过在互联网上传输报文来进行通信,查证这个传输是否被授权,双方是否做好了准备。所有的细节设定之后,协议模块通知应用程序已经建立了连接,可以开始进行传输。在传输过程中,通信双方的协议模块继续进行通信,以确保数据正确到达。
如果出于某种原因通信失败了(例如两台机器之间的路径上的某网络硬件失效),这两台机器都检测到故障并将其报告给适当的应用程序。我们使用术语“虚电路”(virtual circuit)来描述这种连接是因为虽然在应用程序看来这种连接像是一条专用的硬件线路,但这种可靠连接的错觉是由数据流交付服务提供的。
- 有缓冲的传输。
应用程序不断地向协议软件传递数据八位组,通过虚电路发送数据流。在传输数据的时候,每个应用程序使用自己认为适宜的任何大小的数据片,最小可为1八位组。
在接收端,协议软件所收到的由数据流交付服务送来的八位组与其发送顺序完全相同,因此经过校验后就可由接收应用程序使用。协议软件可以将数据流划分为若干分组,而不必考虑传输时的数据片大小。
为了提高传输效率以及减少网络通信量,协议软件在实现时都会从数据流中收集到足够多的数据,把它们组成大小合理的数据报后再送到互联网上传输。
因此,即便应用程序以一次1八位组的方式生成数据流,在互联网上的传输也会相当高效,与此类似,当应用程序要传输特别大块的数据时,协议软件也能把它们划分成适于传输的小数据块。对那些需要交付的数据不够填满一个缓冲区的应用程序,流服务提供了一种“推(push)”机制,应用程序使用该机制进行强迫传输。
在发送端,推操作强迫协议软件传输当前生成的所有数据,而不必等到缓冲区满。当这样的数据到达接收端时,推操作使得TCP立即将数据提交给应用程序。不过读者也许注意到了,推功能仅仅保证所有的数据都会被发送出去,但是并不规定传输的记录界限。所以即使数据是被强迫交付的,协议软件还是可以选择将这个流进行划分。
- 无结构的数据流。
TCP/IP流服务并不按照结构化的数据流形式。例如,在工资表应用程序中,数据流服务无法区分雇员记录的界限,也不能识别数据流的内容是工资数据。使用数据流服务的应用程序必须在开始连接之前就了解数据流的内容并对其格式进行协商。
- 全双工连接。
TCP/P流服务所提供的连接功能是双向的。这种连接称为全双工(fullduplex)连接。对一个应用程序进程而言,全双工连接包括了两个独立的、流向相反的数据流,而且这两个数据流之间不进行明显的交互。流服务允许一个应用程序进程停止一个方向上的数据流,而继续另一方向上的数据流,这样的连接称为半双工(half duplex)连接。全双工连接的优点在于底层协议软件能够把一个流的控制信息放在相反方向的数据报中发回到源主机。这种捎带(piggybacking)方式降低了网络通信量。