运输层

本章内容主要讨论运输层原理和这些原理在现有协议中是如何实现的,以及计算机网络中最基础的一个问题,两个实体怎样才能在一种会丢失或损坏数据的媒体上可靠地通信。后续内容:

无连接运输:UDP

可靠数据传输原理

面向连接的运输:TCP

一、概述和运输层服务

运输层位于应用层和网络层之间,该层为运行在不同主机上的应用进程提供直接的通信服务,它将网络层的在两个端系统之间的交付服务扩展到运行在两个不同端系统上的应用进程之间的交付服务。这句话的理解是,运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能,应用程序使用运输层提供的逻辑通信功能彼此发送报文,而无需考虑承载这些报文的物理基础设施的细节。从应用进程角度来看,通过逻辑通信,运行在不同进程的主机好像直接相连,但实际上这些主机可能相隔很远。

如图1.1,运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用进程接收到的报文转换成运输层分组,该分组称为报文段(segment)。实现方式可能是将应用报文划分为较小的块,并为每块加上一个运输层首部以生成运输层报文段,然后在发送端系统中,运输层将这些报文段传递给网络层。注意:网络路由器仅作用于该数据报的网路层字段;即它们不检查封装在该数据报的运输层报文段的字段。在接收端,网络层从数据报中提取出运输层报文段,并将该报文段上交给运输层,经运输层处理后上交给应用进程使用。

clip_image001

                                          图1.1 运输层在应用程序进程间提供逻辑而非物理的通信

1.1 运输层和网络层的关系

网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。

这句话的含义是,运输层协议只工作在端系统中,在端系统中,运输层协议将来自应用进程的报文移动到网络边缘(即网络层),但对这些报文在网络核心如何移动并不做任何规定。如图1.1,中间路由器既不处理也不识别运输层加在应用层报文的任何信息。

计算机网络中可以安排多种运输协议,每种协议为应用程序提供不同的服务模型。运输层协议能够提供的服务常常受制于底层网络协议的服务模型。如果网络层协议无法为主机之间发送的运输层报文段提供时延或带宽保证,运输层协议也就无法为进程之间发送的应用程序报文提供时延或带宽保证。不过即使底层网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务,如运输层协议能够提供可靠的数据传输服务。

1.2 因特网运输层概述

因特网为应用层提供了两种截然不同的可用运输层协议,一个是UDP(用户数据报协议),它为调用它的应用程序提供一种不可靠的、无连接的服务;另一个是TCP(传输控制协议),它为调用它的应用程序提供一种可靠的、面向连接的服务。

在本章中,我们将运输层分组统称为报文段(segment)。因为因特网文献也将TCP的运输层分组称为报文段,而将UDP的分组称为数据报(datagram)。但因特网文献中也将网络层分组称为数据报。

在讲UDP和TCP之前,需要简单了解网络层。网络层协议非常重要的是IP,即网际协议。IP为主机之间提供逻辑通信,IP的服务模型是尽力而为交付服务(best-effort delivery service),即它不确保报文段的交付,不保证报文段的按序交付,不保证报文段中数据的完整性,因此IP被称为不可靠服务(unreliable service)。

再来看UDP和TCP,两种协议的基本责任是将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程间的交付服务。将主机间交付扩展到进程间交付被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)。UDP和TCP还可以通过在其报文段首部中包括差错检查字段而提供完整性检查。进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP能提供的仅有的两种服务。

另一方面,TCP为应用程序提供几种附加服务。一是可靠数据传输(reliable data transfer),通过使用流量控制、序号、确认和定时器,TCP确保正确地、按序地将数据交付;另一个是拥塞控制(congestion control),它防止任何一条TCP连接用过多流量来淹没通信主机之间的链路和交换设备。

二、多路复用和多路分解

一个主机有一个或多个进程,而一个进程有一个或多个套接字,将运输层报文段中的数据交付到正确的套接字的工作称为多路分解(demultiplexing);在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(multiplexing)。

要实现多路复用,运输层需要:套接字有唯一的标识符;每个报文段有特殊字段来指示该报文段所要交付到的套接字。如图2.1,这些特殊字段是源端口号字段(source port number filed)和目的端口号字段(destination port number filed)。端口号是一个16比特的数,大小在0~65535之间。0~1023范围的端口号被称为周知端口号(well-known port number),是受限制的,保留给如HTTP等周知的应用层协议使用。当我们开发一个新的应用程序时,必须为其分配一个端口号。

clip_image002

                    图2.1 运输层报文段中的源与目的端口号字段

因此多路分解就是,在报文段到达主机时,运输层检查报文段中的目的端口号,将其定位到相应的套接字。UDP基本上就是这样做的,但TCP的却更为复杂。

2.1 无连接的多路复用和多路分解

无连接的多路复用和多路分解,即UDP多路复用和多路分解。复用与分解的关键在于为套接字关联一个特定的端口号。在使用UDP通信时,创建一个UDP套接字,运输层可以自动为该套接字分配一个端口号,也可以手动为该套接字绑定一个特定的端口号。在形成运输层的报文段时,其中包括应用程序数据、源端口号(作为“返回地址”)、目的端口号和其他值。这样就能够精确描述UDP的复用与分解。

需要注意的是,一个UDP套接字是由一个二元组全面标识的,该二元组包含了一个目的IP地址和一个目的端口号。因此,如果两个UDP报文段有不同的源IP地址和源端口号,但是具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程,即目的主机只使用目的端口号和IP地址定位相应的套接字。这一点与TCP是不同的。

2.2 面向连接的多路复用与多路分解

TCP套接字与UDP套接字不同的是,因为TCP是面向连接的,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识的。因此,当一个TCP报文段从网络到达主机时,该主机使用全部4个值来将报文段定向到相应的套接字。比如,两个具有不同源IP地址或端口号的TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带的是初始创建连接的请求(因为TCP服务器有一个“欢迎套接字”,TCP连接建立时都需要先向该套接字发送请求)。

服务器主机可以支持很多并行的TCP套接字,每个套接字与一个进程相联系,并由其四元组来标识每个套接字。当一个TCP报文段到达主机时,所有4个字段被用来将报文段定向分解到相应的套接字。

如图2.2,主机A和主机C以及服务器B都有自己的唯一IP地址A、B、C,其中主机C向服务器B发送两个会话,主机A向服务器B发送一个会话。主机C为两个会话分配了两个不同的源端口号(26145和7532),因为主机A选择源端口号时与主机C互不相干,因此它也可以将源端口号26145分配给其会话连接。尽管如此,服务器B仍能正确地分解这两个具有相同源端口号的连接,因为两个连接的源IP地址不同。

clip_image003

                                          图2.3 两个客户使用相同目的端口号和源端口号与同一服务器应用通信

需要注意的是,连接套接字并非与进程之间并不是一一对应关系。早期每个Web服务器可以为每条连接生成一个新进程,这样每个进程都有自己的连接套接字,但现在的高性能Web服务器通常只使用一个进程,当客户请求连接时,这个进程会为每个新的客户创建一个具有新连接套接字的新线程,因此很多具有不同标识的的连接套接字连接到的是相同的进程。

posted @ 2020-11-26 15:35  Aidan_Chen  阅读(289)  评论(0编辑  收藏  举报