运输层
运输层第一个关键功能:将网络层的在两个端系统之间的交付服务扩展到运行在两个不同端系统上的应用层进程之间的交付服务。
网络应用程序可以使用多种运输层协议:例如,因特网有两种协议,即TCP和UDP。
上面读起来确实很拗口,可以看看下面:
This sets the stage for examining the first critical function of the transport layer—extending the network layer’s delivery service between two end systems to a delivery service between two application-layer processes running on the end systems.
计算机网络中最为基础性的两个问题:
1)可靠数据连接:两个实体怎样才能在一种会丢失或损坏数据的媒体上可靠地通信。
2)拥塞控制:控制运输层实体的传输速度以避免网络中的拥塞,或从拥塞中恢复过来。
1 概述和运输层服务
A transport-layer protocol provides for logical communication between application processes running on different hosts.
从应用程序的角度看,通过逻辑通信,运行在不同进程之间的主机好像直接相连一样。
运输层协议是在端系统中而不是路由器中实现的,应用进程使用运输层提供的逻辑通信功能彼此之间发送报文,而无需考虑承载这些报文的物理基础设施。
在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组(因特网术语:运输层报文段)。可能实现的方式是:将应用报文划分为较小的块,并为每块加上一个运输层首部一生成运输层报文段。
注意:网络路由器仅作用于该数据报的网络层字段,即它们不检查封装在该数据报的运输层报文段的字段。
1.1 运输层和网络层的关系
网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。
类比一个家庭分发邮件:
application messages = letters in envelopes
processes = cousins
hosts (also called end systems) = houses
transport-layer protocol = Ann and Bill
network-layer protocol = postal service (including mail carriers)
注意:
1)即使底层网络协议是不可靠的,也就是说网络层协议会使分组丢失,篡改和冗余,运输协议也能为应用程序提供可靠的数据传输服务。
2)即使网络层不能保证运输层报文段的机密性,运输协议也能使用加密来确保应用程序报文不被入侵者读取。
1.2 因特网运输层概述
因特网(更一般地将是一个TCP/IP网络)为应用层提供了两种截然不同的可用运输层协议:
1)UDP(用户数据报协议):为调用它的应用程序提供一种不可靠,无连接的服务。
2)TCP(传输控制协议):为调用它的应用程序提供一种可靠的,面向连接的服务。
注意:在因特网有关环境中,运输层分组称为报文段。接下来我们将TCP和UDP分组统称为报文段,而将网络层分组称为数据报
因特网的网络层协议IP(网际协议):IP为主机之间提供逻辑通信,IP的服务模型是尽力而为交付服务,但它不做任何确保。因此,IP被称为不可靠服务。每台主机至少有一个网络层地址,即所谓IP地址。
UDP和TCP服务模型:UDP和TCP最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务。将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解
UDP提供的服务:进程到进程之间数据交付和差错检查。
TCP提供的服务:
1)可靠数据传输:通过使用流量控制,序号,确认和定时器,TCP确保正确地,按序第将数据从发送进程交付到接收进程。
2)拥塞控制:防止任何一条TCP连接用过多流量来淹没通信主机之间的链路和交换设备。
2 多路复用和多路分解
运输层的多路复用与多路分解:指的就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。
注意,下面将在因特网环境中讨论这种基本的运输层服务。多路复用和多路分解服务是所有计算机网络都需要的。
多路分解:将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。
实现多路分解:在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应套接字。然后报文段中的数据通过套接字进入其所连接的进程。
多路复用:在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用。
运输层多路复用要求:
1)套接字有唯一标识符。
2)每个报文段有特殊字段来指示该报文段所要交付到的套接字。
2.1 无连接的多路复用与多路分解
通常,应用程序的客户端让运输层自动地分配端口号,而服务器端则分配一个特定的端口号。
当从网络达到UDP报文段时,主机B通过检查该报文段中的目的端口号,将每个报文定向(分解)到相应的套接字。
一个UDP套接字是由一个二元组来全面标识的,该二元组包含一个目的IP地址和一个目的端口号。因此,如果两个UDP报文段有不同的源IP地址或源端口号,但具有相同的目的地址和目的端口号。那么,这两个报文段将通过相同的目的套接字被定向到相同的目的进程。
源端口号的作用在于,服务器可以使用recvform()方法从其客户接收到的报文段中提取客户端(源)端口号,然后将所提取的源端口号作为目的端口号,向客户发送一个新的报文段。
2.2 面向连接的多路复用与多路分解
TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识。
当一个TCP报文从网络中到达一个主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。
特别与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
TCP客户-服务器的例子中:
1)TCP服务器首先有一个”welcoming socket”,在某一个端口上等待来自TCP客户的连接建立请求。
2)TCP客户创建一个套接字并发送一个连接建立请求报文段(一个连接请求包含:一个目的端口号;TCP首部特定“连接建立位”置位的TCP报文段)。
3)定位到服务器进程后,该服务器进程则创建一个新的套接字”connection Socket”。
4)新的套接字”connection Socket”通过4个值来标识:①请求连接报文段中的源端口号;②源主机IP地址;③该报文段中的目的端口号;④自身的IP地址。
5)后续到达的报文段,如果他们的源端口号,源主机IP地址,目的端口号,目的IP地址与上述4个值匹配,则被分解到这个套接字。
2.3 Web服务器与TCP
事实上。连接套接字与进程之间并非总有着一一对应的关系,当今高性能Web服务器通常只使用一个进程,但为每个新的客户连接创建一个具有新连接套接字的新线程。
3 无连接运输:UDP
运输层最低限度必须提供一种复用分解服务,以便在网络层与正确的应用级进程之间传递数据。
1)UDP从应用进程得到数据,附加上用于多路复用/分解服务的源和目的端口号字段,以及两个其他小字段,然后将形成的报文段交给网络层。
2)网络层将该运输层报文段封装到一个IP数据报中,然后尽力而为地尝试将此报文段交付给接收主机。
3)如果该报文段到达接收主机,UDP使用目的端口号将报文段交付给正确的应用程序。
适用UDP的场合:
1)关于何时、发送什么数据的应用层控制更为精细。(无拥塞机制)
2)无需建立连接。(不会引入建立连接的延迟)
3)无连接状态。(连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。)
4)分组首部开销小。(每个TCP报文段都有20个字节的首部开销,而UDP仅有8字节的开销。)
下图表示了使用TCP/UDP的一些常见应用:
有两点简记:
1)UDP中缺乏拥塞控制能够导致UDP发送方和接收方之间的高丢包率,并挤垮了TCP会话,这是一个潜在的严重问题。
2)使用UDP的应用是可以实现可靠数据传输的,这可通过在应用程序自身中建立可靠性机制来完成。
3.1 UDP报文段结构
UDP首部只有4个字段,每个字段由两个字节组成,通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程(即执行分解功能)。长度字段指示了UDP报文段中的字节数(首部+数据)。An
explicit length value is needed since the size of the data field may differ from one UDP segment to the next.
3.2 UDP校验和
虽然UDP提供差错检测,但它对差错恢复无能为力.UDP的某种实现只是丢弃受损的报文段;其他实现是将受损的报文段交给应用程序并给出警告。