本章学习运输层
运输层位于应用层和网络层之间,是分层的网络体系的重要部分,该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。从应用程序的角度看,通过逻辑通信,运行不同进程之间的主机好像直接相连一样;实际上这些主机之间通过很多路由器及多种不同类型的链路相连,下图图示了逻辑通信的概念

如图,运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组(运输层报文段),实现的方法是将应用报文划分为较小的块,并为每块加上一个运输层首部以生成运输层报文段。然后在发送端系统中,运输层将这些报文段传递给网络层,网络层将其封装成网络层分组(数据报)并向目的地发送。【注意:网络路由器仅作用于该数据报的网络层字段;即它们不检查封装在该数据报的运输层报文段的字段】在接收端,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层。运输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。
运输层和网络层之间的关系
在协议栈中,运输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信,而运输层为在不同主机上的进程之间提供了逻辑通信。
举例 有两个家庭,每个家庭有12个孩子,每周他们要互相写一封信,因此每个家庭每周向另一家发送144封信,每一个家庭有一个孩子负责收发邮件,Anna和Bill,每星期Anna去她的所有兄弟姐妹那里收集邮件,并将这些邮件交到邮政服务的邮车上,同时她还负责接收并分发邮件。Bill也是负责这样的工作。
在这个例子中,邮政服务为两个家庭间提供逻辑通信,邮政服务将信件从一家送往一家,而不是从一个人送往另一个人,另一方面,Anna和Bill为兄妹之间提供了逻辑通信,Anna和Bill从兄弟姐妹那里收取或分发邮件,从兄弟姐妹的角度看,Anna和Bill就是邮件服务,尽管他们只是端到端交付过程中的一部分
| 应用层报文=信封上的字符 |
| 进程=兄弟姐妹 |
| 主机(端系统)=家庭 |
| 运输层协议=Anna和Bill |
| 网络层协议=邮政服务(包括邮车) |
运输层协议只工作在端系统中,运输层协议将来自应用进程的报文移动到网络边缘(即网络层),但对这些报文在网络核心如何移动并不作任何规定。
假定Anna和Bill外出度假,另外一对姐妹Alice和Bob接替他们的工作。但是Alice和Bob与Anna和Bill所做的并不完全一样,比如收发邮件的次数更少、偶尔可能还会丢失邮件等等。与此类似计算机网络中可以安排多种运输层协议,每种协议为应用程序提供不同的服务模型。
Anna和Bill的提供的服务明显受限于邮政服务所能提供的服务,与此类似,运输协议能够提供的服务常常受制于底层网络协议的服务模型,如果网络层协议无法为主机之间发送的运输层报文段提供时延或带宽保证的话,运输层协议也就无法为进程之间发送的应用程序报文提供时延或带宽保证。
运输层概述
因特网为应用层提供了两种截然不同的可用运输层协议,一种是UDP(用户数据报协议),它为调用它的应用程序提供一种不可靠、无连接的服务。另一种是TCP(传输控制协议),它为调用它的应用程序提供了可靠的、面向连接的服务。
运输层分组称为报文段(segment),网络层分组称为数据报(datagram)
因特网网络层协议中有一个名字叫IP(网际协议)。IP为主机之间提供了逻辑通信,IP的服务模型是尽力而为交付服务。这意味着 它不做任何确保,不确保报文段的交付、不确保完整性和有序性。因此IP被称为不可靠服务
UDP和TCP最基本的职责是,将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务,将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解,进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP所能提供的仅有的两种服务
另一方面,TCP为应用程序提供可靠数据传输。通过使用流量控制、序号、确认和定时器,TCP确保正确地、按序地将数据从发送进程交付给接收进程,这样TCP就将两个端系统之间的不可靠IP服务转换成了一种进程间地可靠数据传输服务。同时TCP还提供拥塞控制。
多路复用与多路分解
这里我们讨论运输层的多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。
在目的主机,运输层从紧邻其下的网络层接收报文段,运输层负责将这些报文段中的数据交付给在主机上运行的适当应用程序进程。

一个进程(作为网络应用的一部分)有一个或多个套接字,它相当于从网络向进程传递数据和从进程向网络传递数据的门户。因此如图所示,在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交给了一个中间套接字。
那么主机怎样将一个到达的运输层报文段定向到适当的套接字。为此,每个运输层报文段中具有几个字段。在接收端,运输层检查这些字段标识出接收套接字,进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用。
在主机中”多路复用与多路分解“实际是怎样工作的?在前面我们已经知道运输层多路复用要求:①套接字有唯一标识符;②每个报文段有特殊字段来指示该报文段所要交付的套接字
如下图所示,这些特殊字段是源端口号字段(source port number field)和目的端口号字段(destination port number field)。端口号是一个16比特的数,其大小在0~65535之间。0~1023范围的端口号称为周知端口号(well-known port number),是受限制的,这是指他们保留给诸如HTTP(它使用端口号80)和FTP(它使用端口号21)之类的周知应用层协议来使用。

现在我们应该清楚运输层是怎样能够实现分解服务的了:在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。
无连接的多路复用与多路分解
【假定在主机A中的一个进程具有UDP端口19157,它要发送一个应用程序数据块给位于主机B中的另一进程,该进程具有UDP端口46428.主机A中的运输层创建一个运输层报文段,其中包括应用程序数据、源端口号(19157)、目的端口号(46428)和两个其他值,然后运输层将得到的报文段传递到网络层。网络层将该报文段封装到一个IP数据报中,并尽力而为地将报文段交付给接收主机。如果该报文段到达接收主机B,接收主机运输层就检查该报文段中的目的端口号(46428)并将该报文段交付给端口号46428所标识的套接字。需要注意的是,主机B能够运行多个进程,每个进程有自己的UDP套接字及相应的端口号,当UDP报文段从网络到达时,主机B通过检查该报文段中的目的端口号,将每个报文段定向(分解)到相应的套接字】
一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP地址和一个目的端口号。如果两个UDP报文段有不同的源IP地址或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的套接字被定向到相同的目的进程。
源端口号的用途是什么?
在下图中,在A到B的报文段中,源端口号用作”返回地址“的一部分,即当B需要回发一个报文段给A时,B到A的报文段中的目的端号便从A到B的报文段中的源端口号中取值

面向连接的多路复用与多路分解
TCP套接字和UDP套接字之间的差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP,目的端口号)来标识的。因此当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
下图就是这种情况,【主机C向服务器B发起了两个HTTP会话,主机A向服务器B发起一个HTTP会话。主机A与主机C及服务器B都有自己唯一的IP地址,它们分别是A、C、B。主机C为其两个HTTP连接分配了两个不同的源端口号(26145和7532),因为主机A选择源端口号时与主机C互不相干,因此也可以将源端口号26145分配给其HTTP连接,但由于它们连接有不同的源IP地址,服务器B仍然能够正确地分解这两个具有相同源端口号的连接】

本文详细介绍了网络运输层的两大协议UDP和TCP,包括它们的工作原理、服务模型和可靠性机制。UDP是无连接的,适合实时应用,而TCP是面向连接的,提供可靠的数据传输服务,包括连接建立、拥塞控制和流量控制等。此外,文章还探讨了TCP的三次握手和四次挥手过程,以及拥塞控制的慢启动、拥塞避免和快速恢复策略。
最低0.47元/天 解锁文章
4075

被折叠的 条评论
为什么被折叠?



