运输层是整个网络体系结构中的关键层次之一,一定要弄清楚一下概念:
- 运输层为互联网相互通信的应用进程提供逻辑通信。
- 端口和套接字的意义。
- 无连接的UDP的特点。
- 面向连接的TCP的特点。
- 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议。
- TCP的滑动窗口,流量控制,拥塞控制和连接管理。
5.1 运输层协议概述
5.1.1 进程之间的通信
从通信和信息处理的角度来看,运输层向向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最低层。当网络的边缘部分的两台主机使用网络的核心功能进行端到端的通信的时候,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组的时候都只用到以下三层的功能。
如图:设局域网LAN1上的主机A和局域网LAN2上的主机B通过互连的广域网WAN进行通信,我们知道,IP协议能够把源主机A发送的分组,按照首部中的目的地址,送交到目的主机B那里去,那么,为什么还需要运输层呢?
从IP层来讲,通信的两端是两台主机,IP数据报的首部明确地标识了这两台主机的IP地址,但两台主机之间通信这一说法是不明确的。这是因为。真正通信的实体是在主机中的进程,是这台主机中的进程和另一台主机中的进程在交换数据(即通信),因此,两台主机进行通信就是两台主机中的应用进程互相通信,IP协议虽然能把分组送到目标主机,但是这个分组还在停留在网络层,并没有交给主机的应用进程,也因此呢,从运输层的角度来看:通信的真正端点并不是主机而是主机中的进程。端到端之间的通信是应用之间的通信。在一台主机中经常有多个应用进程同时分别和另一台主机中的多个应用进程通信,在图5-1中,主机A的应用进程AP1和主机B 的AP3进行通信,与此同时,主机A的进程AP2与主机B的AP4在进行通信,这表明了分用运输层有一个很重要的功能:复用和分用,这里“复用”指的是在发送方不同的应用进程都可以使用同一个运输层传输协议传递数据,而“分用”指的是接收方的运输层在剥去报文的首部后能够拿这些数据正确的交付给目的应用进程。图5-1之间的双向粗箭头,写明运输层提供应用进程之间的逻辑通信。逻辑通信的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把报文传给对面的传输层(不论相距多远),好像这种通信就是沿着水平方向直接传输数据,但事实上这两个运输层并没有一条水平方向的物理连接。数据的传输是沿着图中的虚线方向进行传送。逻辑通信的意思就是好像是这样通信,但事实上并非是这样的通信。
从这里看出网络层和运输层的区别:网络层为主机之间提供逻辑通信,而应用层为应用进程之间提供端到端的逻辑通信,如图5-2,
运输层还要对收到的报文进行差错检查。大家都还记得,在网络层IP数据报中的校验和字段,只检验首部是否出现差错而并不检查数据部分。
根据应用进程之间的不同需求,应用层需要两种不同的传输协议:(1):面向连接的TCP;(2):无连接的UDP。
我们还应该指出:运输层向高层屏蔽了下面网络层核心的细节(例如网络拓扑结构,所采用的的路由选择协议等),它使得应用进程看见的好像就是在两个运输层实体之间有一条端到端的逻辑通信信道。但这条逻辑通信信道对上层的表现却是因为运输层使用的不同协议而有着很大的区别:当运输层采用面向连接的TCP协议的时候,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议的时候,这种逻辑通信信道仍然是一条不可靠信道。
5.1.2 运输层的两个主要协议
TCP/IP运输层的两个主要协议都是互联网的标准,即:
(1):用户数据报协议(UDP)User datagram Protocol[RFC 768]
(2):传输控制协议(TCP)Transmission Control Protocol[RFC 793]
如图给出了这两种协议在协议栈的位置:
- 按照OSI的术语,两个对等运输实体在通信时传送的数据单元叫做运输协议数据单元TPDU(Transport Protocol Data Unit)。但在TCP/IP协议中,则根据所使用的协议是TCP或者UDP,分别称之为TCP报文段,UDP用户数据报。
- UDP在传输的时候不需要建立连接。远程主机的运输层在收到UDP报文后,不需要给出任何的确定动作。虽然UDP提供不可靠支付,但在某些情况下UDP却是一种最有效的工作方式。
- TCP则提供面向连接的服务,在传送数据之前必须要建立连接,数据传送之后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的,面向连接的运输服务,因此不可避免的添加了许多额外的开销,如确认,流浪控制,计时器以及连接管理等等。这不仅使得协议协议数据单元的首部增大,还要占用许多处理资源。
- 如图给出了一些应用和应用层给出主要使用使用的运输层协议(TCP/UDP):
- 运输层所有应用进程都通过运输层再传到IP层,这就是复用。运输层从IP层收到的发送给到各个应用进程的数据后,必须交付给指明的各应用进程,这就是分用。
- 为了使不同的操作系统的应用进程之间能够相互通信,就必须要采用统一的方法对TCP.IP体制的应用进程进行标识。这个区分我们就采用端口。这个端口,也就是协议层使用的协议端口号,简称为端口,这就是说虽然通信的终点是应用进程,但只要把传送的报文交的目的主机的某个端口处,生下的工作就交给TCP/UDP来完成。请注意:这种在协议层间抽象的协议端口为软件端口,和路由器或者交换机上的硬件端口完全是不同的概念,硬件端口是不同硬件设备上的进行交互的端口,而软件应用层的端口是应用层各种协议进程与实体进行层间交互的一种地址。
- 在后面讲到的TCP或者UDP的首部格式中,我们会看到他们都会有很重要的源端口和目的端口两个字段。当运输层收到IP层交过来的数据报时候,能够根据其首部中的目的端口号把数据交付应用层的目的应用进程。
- TCP/IP的运输层用的是16位端口号标志一个端口。但注意的是,端口号只具有本地意义,他只是标记了计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网中不同的计算机中,相同的端口号是没有关联的。16位的端口号,可以最大允许有65535个不同的端口号。
- 因此,我们可以知道,两个计算机之间相互通信,不仅要知道对方的IP地址(为了找到对方的计算机),还要知道对方的端口号(为了找到对方的应用进程)。互联网上的计算机通信采用的是客户-服务器方式。客户端在发起网络请求的时候,必须要事先知道对方服务器的IP地址以及端口号。因此运输层的端口号可以分为以下两大类:
-
服务器端使用的端口号:
- 熟知端口号(系统端口号):数值是0-1023,IANA把这些端口指派给了TCP/IP中最重要的一些应用程序:
- 登记端口号:1024-49151:这些端口是为没有熟知端口号的应用程序使用的,使用这些端口必须在IANA按照规定的手续登记,以防重复。
- 客户端使用的端口号49152-65535:由于这类端口号仅在客户进程运行时动态选择,因此又叫做短暂端口号,这类端口号留给客户端暂时使用。在通信结束的时候,刚才已经使用过的端口号就不复存在,这个端口号就可以提供给其他进程使用。
-
服务器端使用的端口号: