计算机网络教程-传输层概述 - STEMHA's Blog

计算机网络教程-传输层概述

传输层

  • 传输层是客户程序和服务器程序之间的联络人,是一个进程到进程的连接。
  • 传输层是TCP/IP 协议簇中的核心;
  • 它是因特网上从一点到另一个点传输数据的端到端逻辑传输媒介。

传输层提供的一般服务

进程到进程通信

传输层协议的首要任务是提供进程到进程通信(process-to-process communication)

主机间通信与进程间通信的不同:
网络层负责计算机层次的通信(主机到主机通信)。网络层协议只把报文传递到目的计算机。
然而,这是不完整的传递。报文仍然需要递交给正确的进程。这正是传输层接管的部分。
传输层协议负责将报文传输到正确的进程。

寻址:端口号

对通信来说,我们必须定义本地主机、本地进程、远程主机以及远程进程。
IP 地址来定义本地主机和远程主机。
端口号(port number)来定义进程。TCP/IP 协议簇中,端口号是在0 到65 535 之间的16 位整数。

客户程序用端口号定义它自己,这称为临时端口号(ephemeral port number)。临时这个词表示短期的(short-lived),它之所以被使用是因为客户的生命周期通常很短。为了客户-服务器程序能
正常工作,临时端口号推荐值为大于1023。

服务器进程端口号不能随机选择。(因为随机分配的话导致客户端不知道端口号),TCP/IP 决定使用全局端口号,它们称为熟知端口号(well-known port number)

ICANN 端口范围

ICANN已经把端口号编码划分为三种范围:熟知的、注册的和动态的(或私有的)

  • 熟知端口:端口号0~1023,由ICANN 分配和控制。这些是熟知端口号。
    • 在 UNIX 中,熟知端口号存储在/etc/services 文件中,这个文件的每行给出服务器名和熟知端口号
  • 注册端口:端口号1024~49151,ICANN 不分配也不控制。它们可在ICANN 注册以防重复。
  • 动态端口:端口号49152~65535。这一范围内的端口号既不受控制又不需要注册,可以由任何进程使用。它们是临时或私有端口号。49152是2的14次方乘3

ICANN范围

套接字地址

在 TCP 协议簇中的传输层协议需要IP 地址和端口号,它们各在一端建立一条连接。
一个IP地址和一个端口号结合起来称为套接字地址(socket address)
客户套接字地址唯一定义了客户进程;
服务器套接字地址唯一地定义了服务器进程;
为了使用因特网中的传输层服务,我们需要一对套接字地址:客户套接字地址和服务器套接字地址。
一对套接字地址

多路复用和多路分解

多路复用(multiplexing,多对一)

  • 多个数据项从多个源发出,一个实体接收它们,然后负责传输。;
  • 指多个应用程序共享同一个传输层建立的连接进行数据的传送,在传输层是通过什么来区分不同的应用程序的(通过端口)
  • 源端的传输层执行复用;

多路分解(demultiplexing,一对多)

  • 每当一个实体将数据项传递到一个以上的源时。
  • 目的端的传输层执行多路分解

流量控制

每当一个实体创建数据项并且有另一个实体消耗它们时,就存在生产速率和消费速率的平衡问题。

  1. 如果数据项生产比消费快,那么消费者可能被淹没并且可能要丢弃一些数据项
  2. 如果数据项生产比消费慢,那么消费者必须等待,系统就会变得低效

流量控制与第一种情况相关。我们需要在消费者端防止丢失数据项。

生产者到消费者消息传输两种方式

推(push):每当发送方生产数据项时,它无须事前获得消费者的请求就会发送它们——这种传递称为推。
需要流量控制:当生产者推数据项时,消费者可能被淹没并需要相反方向的流量控制,以此来防止丢弃这些数据项。

拉(pull):如果生产者在消费者请求这些数据项之后进行发送,这种传递称为拉。
不需要流量控制:当消费者拉数据项,它会在自身做好准备时进行请求。在这种情况下,不需要流量控制。
数据传递模型

传输层流量控制

在传输层通信中,我们需要处理四个实体:发送方进程、发送方传输层、接收方传输层和接收方进程。
应用层的发送方进程仅仅是一个生产者。它生产报文块,并把它们推到传输层。
发送方传输层有两个作用:
是消费者:它消费生产者推来的报文。
也是生产者:它将报文封装进分组并传递到接收方传输层。
接收方传输有两个作用:
是消费者:消费从发送方那里接收来的分组;
也是生产者:解封装报文并传递到应用层。然而,最后的传递通常是拉传递;传输层等待直到应用层进程请求报文。

我们至少需要两种流量控制:

  1. 从发送方传输层到发送方应用层的流量控制。
  2. 从接收方传输层到发送方传输层的流量控制。

这里看图即可:
传输层流量控制

缓冲区

流量控制可以用多种方式实现,但通常的方式是使用两个缓冲区:一个位于发送方传输层,另一个位于接收方传输层。
缓冲区是一组内存单元,它可以在发送端和接收端存储分组。
消费者向生产者发送信号从而进行流量控制通信。

当发送方传输层的缓冲区已满,它就通知应用层停止传输报文块;当有空闲位置时,它通知应用层可以再次传输报文块。
当接收方传输层的缓冲区已满,它就通知发送方传输层停止传输分组;当有空闲位置时,它通知发送方传输层可以再次传输分组。

传输层差错控制

由于网络层(IP)是不可靠的,如果应用层需要可靠性,我们需要使传输层变得可靠。可靠性可以通过在传输层加入差错控制服务来实现。

传输层的差错控制负责以下几个方面:

  1. 发现并丢弃被破坏的分组。
  2. 记录丢失和丢弃的分组并重传它们。
  3. 识别重复分组并丢弃它们。
  4. 缓冲失序分组直到丢失的分组到达。

差错控制不像流量控制,它仅涉及发送方和接收方传输层。我们假设在应用层和传输层之间交换的报文块是不会产生差错的。
传输层差错控制

序号

差错控制需要发送方传输层知道哪个分组要被重传并且接收方传输层需要知道哪个分组是重复的、哪个分组是失序的。如果分组是编号的,这个就可以实现。我们可以在传输层分组中加入一个字段来保存分组的序号(sequence number)。
分组一般按序编号。然而,由于我们需要在头部包含每个分组的序号,因此需要设置一个界限。如果分组的头部允许序号最多为m 比特位,那么序号范围就是0 到2m−1。例如,如果m 是4,序
号范围是0 到15 的闭区间。然而,我们可以回绕。
序号是模2^m 的。
对于差错控制,序号是模2m 的,这里m 是序号字段的大小,单位是比特。

确认

接收方可以为每一组正确到达的分组发送一个确认(ACK)。接收方可以简单地丢弃被破坏的分组。发送方如果使用计时器,它就可以发现丢失分组。当一个分组被发送,发送方就开启一个计时器。如
果ACK 在计时器超时之前没有到达,那么发送方重发这个分组。重复的分组可以被接收方默默丢弃。失序的分组既可以被丢弃(被发送方当做丢失报文对待),也可以存储直到丢失的那个分组到来。

流量和差错控制的组合

流量控制要求使用两个缓冲区,一个在发送端另一个在接收端。
差错控制要求两端均使用序号和确认号。
流量和差错控制的组合:使用两个带序号的缓冲区:一个位于发送端,一个位于接收端,那么这两个需要可以结合起来。
发送端,当分组准备发送时,我们使用下一个缓冲区空闲位置号码x 作为分组的序号。当分组被发送,一个分组的备份存储在内存位置x,等待来自另一端的确认。当与被发送分组相关的确认到达时,分组被清除,内存位置空闲出来。
接收端,当带有序号y 的分组到达时,它被存储在内存位置y 上,直到应用层准备好接收它。这时发送一个确认表明分组y 的到达。

滑动窗口

由于序号进行模2m 操作,因此一个环可以代表从0 到2m−1 的序号。
缓冲区由一组片段代表,称为滑动窗口(sliding window),它随时占据环的一部分。
在发送端,当一个报文被发送,相应的片段就被标记。当有所片段都被标记时,意味着缓冲区满且不能从应用层进一步接收报文。
当确认到达时,相应片段被取消标记。如果从窗口开始处有一些连续的片段没有被标记,那么窗口滑过这些相应序号的范围,允许更多的片段进入窗口尾部。
下图 给出发送方的滑动窗口。
圆形滑动窗口

序号以16 为模(m = 4)且窗口大小为7。请注意滑动窗口仅仅是一个抽象:实际情况是使用计算机变量来保存下一个和最后一个待发送的分组。
大多数协议使用线性形式来表示滑动窗口。虽然想法是相同的,但是它通常占用更少的页面空间。下图给出这种表示方法。这两种表示方法告诉我们相同的事情。如果拿起下图每一幅图的两个端点,并且弯曲它们,我们就可以得到与圆形滑动窗口相同的图。
线性形式滑动窗口

拥塞控制

拥塞(congestion):因特网之类的分组交换网络中存在一个重要问题,这就是拥塞。如果网络中的负载(load,即发送到网络的分组数)大于网络的容量(网络可以处理的分组数),那么网络就可能发生拥塞。
拥塞控制(congestion control)指的是一种机制和技术,它控制拥塞并将负载保持在容量以内。

无连接和面向连接服务

传输层协议就像网络层协议一样,可以提供两种类型的服务:

  • 无连接服务
  • 面向连接服务

然而,这些传输层服务的本质与网络层不同。

  • 网络层,无连接服务可能意味着属于同一个报文的不同数据报有不同路径。
  • 网络层,面向连接服务意味着两个终端主机以及这之间的所有路由器都进行协调。
  • 在传输层,我们不关心分组的物理路径(我们假设两个传输层之间有一条逻辑连接)。

传输层的无连接服务意味着分组之间的独立;面向连接服务意味着依赖。

无连接服务

在无连接服务中,源进程(应用程序)需要将报文分成传输层可接受大小的数据块,并把它们一个一个地传递到传输层。
传输层将每一个数据块看做彼此没有关系的单元。当一个块从应用层到达时,传输层将其封装在分组中并发送。

为了展示分组的独立,我们假设客户进程有三个报文块要发送给服务器进程。这些块被按序交给无连接传输协议。
然而,由于传输层的这些分组之间没有联系,分组可能失序到达目的地并且被失序传递给服务器进程
在客户端,三个报文块按序传递给客户传输层
(0、1 和2)。由于第二个分组在传输中的额外延迟,服务器报文的传递失序(0、2 和1)。如果这三个数据块属于同一个报文,那么服务器进程可能会收到一个奇怪的报文。
如果一个分组丢了情况就更糟糕了。由于分组没有序号,接收方传输层不知道一个报文已经丢失。它仅仅将两个数据块传送到服务器进程。
以上两个问题是由于双方传输层没有互相协调所致。接收方传输层不知道第一个分组将要到来,也不知道所有的分组已经到来。
我们可以说,流量控制、差错控制以及拥塞控制都不能在无连接服务中有效实现。

无连接的服务是不可靠的服务,无法许诺不会出现的交付和重复的差错,但这种协议代价很小,更适应于某些服务,比如内部的数据采集、向外的数据分发、请求一响应,以及实时应用等。因此在运输层既有面向连接的位置,也有无连接的用武之地。每一个分组独立地建立和释放逻辑连接,也适合传送大量的数据。
无连接的服务的通信线路不都是预设的。
无连接的服务需要将目标地址信息加在每个发送的分组上,便于每个分组路由到达目的地。
UDP在电路交换或租用专线网络上也能运行。

面向连接服务

面向连接的服务中,首先需要建立客户和服务器之间的逻辑连接。只有连接建立之后才能进行数据交换。在数据交换之后,连接需要拆除

  1. 连接建立
  2. 数据传输
  3. 拆除阶段。

在面向连接协议中,我们可以实现流量控制、差错控制以及拥塞控制。
面向连接的方式功能强大,允许流量控制、差错控制以及顺序交付等。

参考资料

计算机网络教程-自顶向下方法

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×