一、 介绍
传输层位于应用层和网络层之间,传输层为应用层提供服务,它接受网络层的服务。它在两个应用层之间提供进程到进程通信(作用),一个进程在本地主机(客服端),另一个在远程主机(服务器)。使用逻辑连接提供通信,意味着两个应用层可以位于地球上的不同位置,两个应用层假设存在一条想象的直接连接,通过这条连接它们可以发送和接收报文。
二、传输层服务
2.1 进程到进程通信
2.11 介绍
传输层协议的首要任务是提供进程与进程通信。进程是使用着传输层服务的应用层实体(运行着的程序)。
2.12 与网络层之间的关系
网络层负责计算机层次的通信(主机到主机通信)。网络层协议只把报文传递到目的计算机。然而,这是不完整的传递。报文仍然需要递交给正确的进程。这正是传输层接管的部分。传输层协议负责将报文传输到正确的进程。图3-2给出了网络层和传输层的范围。
2.2 寻址(寻端口号)
2.21 寻找端口号的原因
实现进程与进程之间通信的常用模式为:客户机-服务器模式。一个典型进程通信例子,要从远程机器上获得日期和时间,我们需要在本地机器上运行Daytime客户机进程并在远程机器上运行Daytime服务器进程。
目前的操作系统支持多用户和多程序运行的环境。对通信来说,我们必须定义本地主机、本地进程、远程主机以及远程进程**。我们使用IP地址来定义本地主机和远程主机。为了定义进程,我们需要第二个标识符,称为端口号(port number)。在TCP/IP协议簇中,端口号是在0到65535之间的16位整数。
2.22 客户机与服务器端口号的异同
客户机程序用端口号定义它自己,这称为临时端口号(ephemeral port number)。临时这个词表示短期的(short-lived),它之所以被使用是因为客户的生命周期通常很短。为了客户-服务器程序能正常工作,临时端口号推荐值为大于1023。
服务器进程必须使用一个端口号定义它自己。但是,这个端口号不能随机选择。
服务器端口号不能随机选择的原因:如果服务器站点的计算机运行一个服务器进程,并随机分配一个数字作为端口号,那么在客户站点的进程想访问该服务器并使用其服务时,将不知道此端口号。当然,一个解决方法是发送一个特殊分组,并请求一个特定服务器的端口号,但是这需要更多的开销。TCP/IP 决定使用全局端口号;它们称为熟知端口号(well-known port number)。每一个客户进程都知道相应服务器进程的熟知端口号。例如,前面所讨论的Daytime客户进程可以使用临时(暂时)端口号52000来表示自己,但服务器Daytime进程必须使用熟知(永久)端口号13。
2.23 端口号和ip地址的作用对比
现在应该搞清楚,在选择数据的最终目的端时,IP地址(网络层)和端口号(传输层)起着不同的作用。目的IP地址在世界范围的不同主机中确定一个主机。但主机被选定后,端口号定义了在该特定主机上的多个进程中的一个进程(见图3-4)。
2.24 一些关于端口号的定义与联系
ICANN范围(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构
● 熟知端口。端口号的范围是0~1023,由ICANN分配和控制。这些是熟知端口号。UNIX系统存储在/etc/service文件。
●注册端口。端口号的范围1024~49151,ICANN不分配也不控制。它们可在ICANN注册以防重复
●动态端口。端口号的范围是49152~65535。这一范围内的端口号既不受控制又不需要注册, 可以由任何进程使用。它们是临时或私有端口号。
套接字地址
在 TCP 协议簇中的传输层协议需要IP 地址和端口号,它们各在一端建立一条连接。一个 IP 地址和一个端口号结合起来称为套接字地址(socket address)。客户套接字地址唯一定义了客户进程,而服务器套接字地址唯一地定义了服务器进程(见图3-6)。
传输层服务与套接字地址的联系
为了使用因特网中的传输层服务,我们需要一对套接字地址∶客户套接字地址和服务器套接字地址。这四条信息是网络层分组头部(包含IP地址)和传输层分组头部(包含端口号)的组成部分。
2.3 封装与解封装数据包
为了将报文从一个进程发送到另一进程,传输层协议负责封装与解封装报文。
封装在发送端发生。当进程(应用层)有报文要发送,它将报文与一组套接字地址和其他信息一起发送到传输层,这依赖于传输层协议。传输层接收数据并加入传输层头部。因特网中传输层的分组称为用户数据报(user datagram)、段(segment)或分组(packet),这取决于我们使用什么传输层协议。在一般讨论中,我们将传输层有效载荷(数据)称为分组。
解封装发生在接收端。当报文到达目的传输层,头部被丢弃,传输层将报文传递到应用层运行的进程。如果需要响应接收到的报文,发送方的套接字地址被发送到进程(双向通信)。(封装与解封装过程见图 3-7)。
2.4 多路复用与多路分解
2.41 定义
每当一个实体从一个以上的源接收到数据项时,称为多路复用(multiplexing,多对一);每当一个实体将数据项传递到一个以上的源时,称为多路分解(demultiplexing,一对多)。源端的传输层执行多路复用;目的端的传输层执行多路分解(见图3-8)。
2.42 解释
图3-8 给出了一个客户和两个服务器之间的通信。客户端运行三个客户进程∶P1、P2和P3。进程P1和P3需要将请求发送到对应的服务器进程。客户进程P2需要将请求发送到位于另外一个服务器的服务器进程。客户端的传输层接收到来自三个进程的三个报文并创建三个分组。它起到了多路复用器的作用。分组1和3使用相同的逻辑信道到达第一个服务器的传输层。当它们到达服务器时,传输层起到多路分解器的作用并将报文分发到两个不同的进程。第二个服务器的传输层接收分组2并将它传递到相应的进程。注意,尽管只有一个报文,我们仍然用到多路分解。
2.5 流量控制
2.51 流量控制的原因
每当一个实体创建数据项并且有另一个实体消耗它们时,就存在生产速率和消费速率的平衡问题。如果数据项生产比消费快,那么消费者可能被淹没并且可能要丢弃一些数据项。如果数据项生产比消费慢,那么消费者必须等待,系统就会变得低效。流量控制与第一种情况相关。我们需要在消费者端防止丢失数据项。换言之,消费者需要警告生产者停止传递,并且当消费者再次准备好接收数据时通知生产者。
2.52 传输层存在流量控制的地方
从发送方传输层到发送方应用层的流量控制,因为它要消耗来自发送方应用层的报文。
从接收方传输层到发送方传输层的流量控制
2.53 传输层流量控制的方式
尽管流量控制可以用多种方式实现,但通常的方式是使用两个缓冲区∶一个位于发送方传输层,另一个位于接收方传输层。缓冲区是一组内存单元,它可以在发送端和接收端存储分组。消费者向生产者发送信号从而进行流量控制通信。
发送方传输层的缓冲区已满,它就通知应用层停止传输报文块;当有空闲位置时,它通知应用层可以再次传输报文块。
接收方传输层的缓冲区已满,它就通知发送方传输层停止传输分组;当有空闲位置时,它通知发送方传输层可以再次传输分组。
2.6 差错控制
2.61 为什么传输层需要差错控制
在因特网中,由于网络层(IP)是不可靠的,如果应用层需要可靠性,我们需要使传输层变得可靠。可靠性可以通过在传输层加入差错控制服务来实现。
2.62 传输层的差错控制负责的功能
发现并丢弃被破坏的分组。
记录丢失和丢弃的分组并重传它们。
识别重复分组并丢弃它们。
缓冲失序分组直到丢失的分组到达。
2.63 传输层的差错控制
差错控制仅涉及发送方和接收方传输层。我们假设在应用层和传输层之间交换的报文块是不会产生差错的。图3-11给出了发送方和接收方传输层的差错控制。正如传输控制,大多数情况下,接收方传输层管理差错控制,它通过告知发送方传输层存在问题来进行管理。
2.64 传输层的差错控制实现方式
差错控制实现介质
序号(sequence number)
差错控制需要发送方传输层知道哪个分组要被重传并且接收方传输层需要知道哪个分组是重复的、哪个分组是失序的。如果分组是编号的,这个就可以实现。
确认号(acknowledge number)
我们可以发送积极或消极的信号作为差错控制,但是我们只讨论积极信号,这在传输层中最常见,用于应答发送方已经收到分组。
差错控制实现方式
我们可以在传输层分组中加入一个字段来保存分组的序号。当分组被破坏或丢失,接收方传输层可按某种方式通知发送方传输层去利用序号重传分组。如果两个接收到的分组具有相同的序号,接收方传输层也能发现重复分组。可以通过观察序号的间隔辨别失序分组。 分组一般按序编号(对2m取模)。然而,由于我们需要在头部包含每个分组的序号,因此需要设置一个界限。如果分组的头部允许序号最多为m比特位,那么序号范围就是0到2m-1。接收方可以为每一组正确到达的分组发送一个确认号(ACK)。接收方可以简单地丢弃被破坏的分组。发送方如果使用计时器,它就可以发现丢失分组。当一个分组被发送,发送方就开启一个计时器。如果ACK在计时器超时之前没有到达,那么发送方重发这个分组。重复的分组可以被接收方默默丢弃。失序的分组既可以被丢弃(被发送方当做丢失报文对待 回退N帧协议),也可以存储直到丢失的那个分组到来(选择性重复协议)。-- 传输层协议下文提到。
2.65 流量控制与差错控制的组合
两者可以组合的原因
流量控制要求使用两个缓冲区,一个在发送端另一个在接收端。如果我们在差错控制使用两个带序号的缓冲区∶一个位于发送端,一个位于接收端,那么这两个需要可以结合起来。
实现方式
在发送端,当分组准备发送时,我们使用下一个缓冲区空闲位置号码x作为分组的序号。当分组被发送,一个分组的备份存储在内存位置x,等待来自另一端的确认。当与被发送分组相关的确认到达时,分组被清除,内存位置空闲出来。
在接收端,当带有序号y的分组到达时,它被存储在内存位置y上,直到应用层准备好接收它。这时发送一个确认号(ack:不一定为分组y的序号,可以表明分组y已经到达即可)给发送方表明分组y的到达。
实现介质: 滑动窗口
由于序号进行模2m操作,因此一个环可以代表从0到2m-1的序号(见图3-12)。缓冲区由一组片段代表,称为滑动窗口。它随时占据环的一部分。在发送端,当一个报文被发送,相应的片段就被标记。当所有片段都被标记时,意味着缓冲区满且不能从应用层进一步接收报文。当确认到达时,相应片段被取消标记。如果从窗口开始处有一些连续的片段没有被标记,那么窗口滑过这些相应序号的范围,允许更多的片段进入窗口尾部。请注意滑动窗口仅仅是一个抽象∶实际情况是使用计算机变量来保存下一个和最后一个待发送的分组。
2.7 拥塞控制
在因特网之类的分组交换网络中存在一个重要问题,这就是拥塞(congestion)。如果网络中的负载(load,即发送到网络的分组数)大于网络的容量(网络可以处理的分组数),那么网络就可能发生拥塞。拥塞控制(congestion control)指的是一种机制和技术,它控制拥塞并将负载保持在容量以内。 我们可能会问,为什么网络中会有拥塞。在任何系统中发生的拥塞都需要等待。例如,由于车流量不正常,如高峰时段的事故,高速公路上会发生拥塞导致交通堵塞。 在处理前后都存储分组的缓冲区时,由于路由器和交换机中有队列,网络或互联网会发生拥塞。比如,一个路由器,它的每一个接口都有一个输入队列和一个输出队列。如果路由器不能以分组到达的速率进行处理,队列就会超载,拥塞就会发生。传输层的拥塞实际上是网络层拥塞的结果。我们在第4章讨论网络层拥塞及其成因。本章后面,假设网络层没有拥塞控制,我们给出TCP如何实现它自己的拥塞控制机制。
三、传输层服务类型
介绍:传输层协议就像网络层协议一样,可以提供两种类型的服务∶无连接服务和面向连接服务。
3.1 无连接服务
定义:在网络层,无连接服务可能意味着属于同一个报文的不同数据报有不同路径。在传输层,我们不关心分组的物理路径(我们假设两个传输层之间有一条逻辑连接)。传输层的无连接服务意味着分组之间的独立。在无连接服务中,源进程(应用程序)需要将报文分成传输层可接受大小的数据块,并把它们一个一个地传递到传输层。传输层将每一个数据块看做彼此没有关系的单元。当一个报文块从应用层到达时,传输层将其封装在分组中并发送。
例子:我们假设客户进程有三个报文块要发送给服务器进程。这些报文块被按序交给无连接传输协议。然而,由于传输层的这些分组之间没有联系,分组可能失序到达目的地并且被失序传递给服务器进程(应用层)(见图3-14)。
如图3-14所示,客户传输层从应用层收到3个按序报文(0,1,2)封装为分组传输到服务器传输层,但是由于分组2传输时出现延迟,服务器传输层接收到了失序分组(0,2和1),解封装后分组发送到服务器进程。如果这三个分组属于同一个报文时,这时服务器进程则收到了一个奇怪的报文。
特点 :因为无连接服务会导致双方传输层没有进行逻辑连接,所以接收方传输层不会知道第一个分组将要到来,也不会知道所有分组已经到来。所以流量控制,差错控制,拥塞控制都不能在无连接服务有效实现。
3.2 面向连接服务
定义:在面向连接的服务中,首先需要建立客户和服务器之间的逻辑连接。只有连接建立之后才能进行数据交换。在数据交换之后,连接需要拆除。传输层的面向连接服务与网络层的面向连接服务不同。在网络层,面向连接服务意味着两个终端主机以及这之间的所有路由器都进行协调。在传输层,面向连接服务仅仅涉及两个主机;服务是端到端的。这意味着我们能够在传输层建立一个面向连接协议,其下的网络层可以是无连接协议也可以是面向连接协议。图3-15给出传输层面向连接服务中的连接建立、数据传输以及拆除阶段。
特点:在面向连接协议中,我们可以实现流量控制、差错控制以及拥塞控制。