运输层的任务:如何为运行在不同主机上的应用进程提供直接的通信服务。
运输层协议又称为端到端协议。
运输层位于应用层和网络层之间。
必须掌握的重要概念:
(1)运输层为相互通信的应用进程提供逻辑通信;
(2)运输层的复用与端口的概念;
(3)无连接的UDP的特点;
(4)面向连接的TCP实现可靠传输的工作原理,以及TCP的滑动窗口、流量控制、拥塞控制和连接管理。
当位于网络边缘部分的两台主机使用网络核心部分进行端到端的通信时,只有主机的协议栈采用运输层,网络核心部分中的路由器在转发分组时都只用到下三层(物理层、数据链路层、网络层)的功能。
问:既然IP协议能够将源主机发送出去的分组按照首部中的目的地址送交到目的主机,为什么还需要设置一个运输层?
解析:从IP层来说,通信的两端是两个主机。严格来讲,两个主机通信实际上是两个主机上的应用进程互相通信。IP协议只能将分组送到目的主机,但这个分组还停留在主机的网络层而没有交付主机中的应用进程。这便是运输层的任务,从运输层的角度,通信的真正端点并不是主机而是主机中的进程。
一个主机中经常有多个应用程序同时分别和另一个主机中的多个应用进程通信。
从而运输层的重要功能有复用和分用:详见5.1.3
1)复用:发送方不同的应用进程都可以同一个运输层协议传送数据;
2)分用:接收方的运输层在剥去报文的首部后能够把这些数据正确交付到目的应用程序。
重要概念1:运输层为相互通信的应用进程提供逻辑通信
意思是运输层之间的通信好像是沿着水平方向传送数据,实际这两个运输层之间并没有一条水平方向的物理连接,要传送的数据是沿着图中上下多次的虚线方向垂直传送的。
网络层和运输层的区别:
网络层是为主机与主机之间提供逻辑通信,
而运输层是为应用进程之间提供端到端的逻辑通信。
根据应用需求的不同,运输层为应用层提供了两种不同的运输协议,
(1)面向连接的TCP:尽管下面的网络不可靠(只提供尽最大努力服务),但这种逻辑通信信道相当于一条全双工的可靠信道;
(2)无连接的UDP:这种逻辑通信信道仍是不可靠信道。
因特网的网络层为主机之间提供的逻辑通信服务是一种尽最大努力交付的数据报服务,即IP报文在传输过程中有可能出错、丢失或失序。
单一的运输层很难满足所有应用的需求,例如:像电子邮件、文件传输、电子银行等应用,数据丢失可能会带来很大的后果,需要运输层为这类应用提供可靠的数据传输;但对于实时的多媒体应用,它们能够承受一定的数据丢失,不会造成很大影响,这时可靠数据传输会增加很多复杂机制,反而会给应用带来不利因素。
TCP/IP网络为上层应用提供了两个不同的传输层协议:
(1)用户数据报协议(User Datagram Protocol,UDP):
UDP在传送数据时不需要先建立连接。接受方运输层在收到UDP报文后,也不需要给出任何确认。
(2)传输控制协议(Transmission Control Protocol,TCP):
TCP提供面向连接的服务。在传送数据前,必须先建立连接,数据传送结束后要释放连接,因此不可避免地增加了很多开销,例如:确认、流量控制、计时器、连接管理等,使得协议数据单元的首部增加,占用很多处理机资源。TCP不提供广播或多播服务。
按照OSI术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元(Transport Protocol Data Unit, TPDU)。但在因特网中,根据所使用的协议是TCP还是UDP,分别称之为TCP报文段和UDP报文段(或用户数据报)。
复用:应用层所有的应用进程都可以通过运输层再传送到IP层;
分用:运输层从IP层收到数据后交付给指明的应用进程。
运输层要正确地将数据交付给指定应用进程,就必须给每个应用进程赋予一个明确的标志。在TCP/IP网络中,使用一种与操作系统无关的协议端口号(Protocol Port Number),简称端口号。
端口:应用层和运输层之间接口的抽象,应用层的源进程将报文发送给运输层的某个端口,目的进程从端口接收报文;
端口号:应用进程的运输层地址,16位,可以允许有65535(2^16-1)个端口号,**端口号只有本地意义。**不同的计算机中,相同的端口号是没有联系的,TCP和UDP端口号之间也没有联系。所以在运输协议数据单元(TCP报文段或UDP用户数据报)的首部中必须包含两个字段:源端口号和目的端口号。
--------当运输层收到IP层交上来的数据,就要根据其目的端口号来决定应当通过哪一个端口上交给目的应用进程。
总结:两个计算机中的进程要互相通信,需要知道(1)对方的IP地址-----找到对方的计算机;(2)对方的端口号-----找到对方计算机中目的应用进程。
注:应用进程间的通信采用客户-服务器模式。应用层中的各种不同的服务器进程不断监听其端口,以便发现客户进程与它通信。运输层的端口号分为三类:
(1)熟知端口:0-1023。由因特网赋号管理局(Internet Assign Numbers Authority, IANA)负责分配给一些常用的应用层程序固定使用。因此所有用户进程都知道。
例如:
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP | SNMP(trap) |
---|---|---|---|---|---|---|---|---|
端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 | 162 |
(2)登记端口:1024-49151. IANA不分配也不控制,但可以在IANA处登记,防止重复使用。
(3)动态端口:49152-65535. 留给客户进程作为临时端口。当客户进程发起通信前要先为自己选择一个未用的临时端口,通信结束后释放该端口以方便其他用户进程使用。
用户数据报协议UDP只在IP的数据报服务之上加了端口的功能(运输层从而可以复用与分用)和差错检测的功能。
UDP的优点:
(1)无连接。发送数据前不需要建立连接,发送数据结束也没有连接释放,从而减少了开销和时延。
(2)使用尽最大努力交付,即不保证可靠交付,同时不使用流量控制和拥塞控制,因此主机不需要维持具有许多参数的、复杂的连接状态表。
(3)因为UDP 没有拥塞控制,因此网络出现的拥塞不会使得源主机的发送速率降低。这对于实时应用(如IP电话、实时视频会议等)很重要,它们要求源主机以恒定的速率发送数据,并允许网络发生拥塞时丢失一些数据,但不允许数据有很大的时延。
注:UDP不使用拥塞控制功能,可能引起网络会发生严重的拥塞问题,当很多源主机同时向网络发送高速率的实时视频流时,网络就可能发生拥塞,结果大家都无法正常接收。
(4)UDP是面向报文的,即UDP对应用程序交下来的报文不再划分若干个分组来发送,也不把收到的若干报文合并后再交付给应用程序。(应用程序交给UDP一个报文,UDP就发送这个报文;而UDP收到一个报文,就把它交付给应用程序。
因此,应用程序必须选择合适大小的报文。太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,从而降低了IP层的效率;太短,UDP把它交给IP层后,会使IP数据报的首部相对太大,也降低了IP层的效率。
(5) UDP支持一对一、一对多、多对一和多对多的交互通信。
(6) 用户数据报只有8B的首部开销,比TCP的20B的首部短得多。
UDP报文有两个字段:数据字段和首部字段。
其中首部字段8字节,由4个字段组成,每字段2B,具体如下:
(1)源端口:标识UDP发送方;
(2)目的端口:标识UDP接收方;
(3)长度:UDP用户数据报长度;
(4)检验和:差错校验码,防止UDP用户数据报在传输中出错。
UDP用户数据报首部中检验和的计算方法:
(1)在UDP用户数据报之前增加12B的伪首部;
注:这里的伪首部不是UDP数据报的真正首部,只是在计算检验和时,临时和UDP用户数据报连接在一起,得到一个临时UDP数据报。检验和是按照这个临时UDP用户数据报来计算的,伪首部既不向下传送,也不向上递交。
(2)在发送方,把全零放入检验和字段,把伪首部及UDP用户数据报看作由许多16位的字串接起来;
(4)若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(此字节不发送),按照二进制反码计算出这些16位字的和;
(5)将此和的二进制反码写入检验和字段,并发送这样的UDP数据报;
(6)在接收方,将收到的UDP用户数据报连同伪首部(及可能填充的全零字节)一起,按照二进制反码求这些16位字的和;
(7)无差错,结果全1;否则有差错,接收方丢弃这个UDP用户数据报。
由图所示,伪首部的第3字段是全零,第4字段是IP首部的协议字段的值(UDP协议字段值为17),第5字段是UDP用户数据报的长度。
于是,这样的检验和既检查了UDP用户数据报的源端口号、目的端口号及UDP用户数据报的数据部分;又检查了IP数据报的源IP地址和目的地址。
UDP通过二元组(目的IP地址,目的端口号)来定位一个接收方应用程序;通过二元组(源IP地址,源端口号)来标识一个发送方进程。这里,二元组(IP地址,端口号)被称为套接字地址。
一个UDP端口与一个报文队列(缓存)关联,UDP根据目的端口号将到达的报文加到对应的队列。应用进程根据需要从端口对应的队列中读取整个报文。由于UDP报文没有流量控制功能,如果报文到达的速度长期大于应用进程从队列中读取报文的速度,则会导致队列溢出和报文丢失。
端口队列中的所有报文的目的IP地址和目的端口号相同,但源IP地址和源端口号不一定相同(不同源而同一目的地的报文会定位到同一队列)----这里不同于TCP。
注:如果接收方UDP发现收到的报文目的端口号错误(即不存在对应于该端口号的应用进程),则丢弃该报文,并由ICMP(网际控制报文协议)发送一个“端口不可达”差错报文给发送方。
(1)TCP是面向连接的传输层协议。类似于打电话:通话前,先拨号建立连接,通话结束后,挂机释放连接。 应用程序使用TCP协议传送数据之前,先建立连接;传送数据完毕后,释放已建立的TCP连接(释放相应的资源和变量)。
(2)每一条TCP连接只有两个端点,即一对一。TCP连接唯一地被通信两端的端点所确定,两个端点分别由二元组(IP地址,端口号)唯一标识,即一条TCP连接被两个套接字地址标识。
(3)TCP提供可靠交付的服务。通过TCP传送的数据无差错、不丢失、不重复、按序到达。
(4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据,TCP两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
(5)面向字节流。