Transport Layer gaunthan Posted on May 14 2016 ? Transport Layer ? ? Computer Networking ? ## 简介 传输层协议的首要任务是提供**进程到进程通信**(process-to-process communication)。进程是使用传输层服务的应用层实体。传输层有几个概念需要掌握。 <!--more--> ## 寻址:端口号 实现进程到进程通信,最常用的方法是**客户端-服务器模型**(client-server paradigm)。本地主机上的进程称为客户,它通常需要远程主机上的进程提供的服务,这种远程主机称为服务器。 使用IP地址可确定网络中的一台主机(严格来说是一块网络适配器),但由于现在的操作系统支持多道程序运行环境,为了区分不同的进程,需要使用第二个标识符,称为**端口号**(port number)。在TCP/IP协议簇中,端口号是一个16位二进制数,其十进制表示范围在0~65535之间。其中,0~1023系统保留,用户可随意使用1024~65535间的端口号。 根据端口号的范围有不同的称呼与用途: |名称|范围|说明 |--|--|--| |公认端口|0~1023|由ICANN分配和控制,供系统使用。在类Unix系统中,公认端口保存在`/etc/serivecs`文件中| |注册端口|1024~49151|ICANN不分配也不注册,但可在ICANN注册以防重复| |动态端口|49152~65535|不受控制也不需要注册,可供任何进程使用,属于临时或私有端口号| ### 套接字地址 在TCP/IP协议簇中的传输层协议需要IP地址和端口号,它们各自在一端建立一条连接。一个**IP地址**和一个**端口号**结合起来称为**套接字地址**(socket address)。客户端套接字地址唯一定义了客户端进程,而服务器套接字地址唯一定义了服务器进程。 ## 封装与解封装 为了将报文从一个进程发送到另一进程,传输层协议负责封装与解封装报文。 ### 封装 封装发生在发送端。当进程有报文要发送时,它将报文与一组套接字地址和其他信息一起发送到传输层。传输层接收数据并加入传输层头部。Internet中传输层的分组称为**用户数据报**(user datagram)、**段**(segment)或**分组**(packet),这取决于使用的传输层协议。一般地,将传输层有效载荷称为分组。 ### 解封装 解封装发生在接收端。当分组到达目的传输层时,头部被丢弃,传输层根据分组中的端口号信息将报文传递到应用层运行的进程。如果需要响应接收到的报文,则发送方的套接字地址会被发送到该接收进程。 ## 多路复用与多路分解 ### 多路复用 每当一个实体从一个以上的源接收到数据项时,称为**多路复用**(multiplexing,多对一)。具体地说,就是源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(用于多路分解)从而生成报文段,然后将报文段传递到网络层的工作。 传输层多路复用的要求如下: - 套接字有唯一标识符。 - 每个报文段有特殊字段来指示该报文段所要交付到的套接字。 多路复用就像拿一个大箱子把相同目的地、不同用户的包裹装起来,然后只需将这个大箱子送到目的地。为了能够让拆箱子的人能够区分这些包裹,需要为这些包裹加上一些标识信息,如收件人。 ### 多路分解 每当一个实体将数据项传递到一个以上的源时,称为**多路分解**(demultiplexing,一对多)。 在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,传输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进行。 继续上面的例子,多路分解会把接收到的大箱子拆开,把其中的包裹交付给对应的用户。这里需要使用到某些唯一的标识信息。 源端(发送方)的传输层执行复用,目的端(接收方)的传输层执行多路分解。 ### 无连接的多路复用与多路分解 无连接的多路复用与多路分解使用UDP套接字。一个UDP套接字是由一个二元组来全面标识的,该二元组包含一个目的IP地址和目的端口号。因此,如果两个UDP数据报有不同的源IP地址和/或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个数据报将通过相同的目的套接字被定向到相同的目的进程。 ### 面向连接的多路复用与多路分解 面向连接的多路复用和多路分解使用TCP套接字。一个TCP套接字是一个四元组,由源IP地址、源端口号、目的IP地址和目的端口号标识。这样,当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。 特别与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求(这是指连接套接字)。 ## 流量控制 每当一个实体创建数据项并且有另一个实体消耗它们时,就存在生存速率和消费速率的平衡问题。如果数据项生产比消费快,那么消费者可能被淹没并且可能要丢弃一些数据项。如果数据项生产比消费慢,那么消费者必须等待,系统就会变得低效。流量控制有多种方法。 ### 推或拉 从生产者传递数据项到消费者有两种方式:**推**(push)或**拉**(pull)。 #### 推 每当发送方生产数据项时,它无须事前获得消费者的请求就会发送它们。这种传递称为“推”。 #### 拉 生产者在消费者请求这些数据项后进行发送,这种传递称为“拉”。 当生产者推数据项时,消费者可能被淹没并需要相反方向的流量控制,以此来防止丢弃这些数据项。当消费者拉数据项时,它会在自身做好准备时进行请求。在这种情况下,不需要流量控制。 ### 缓冲区 流量控制有多种方法,但通常的方式是使用两个缓冲区:一个位于发送方传输层,另一个位于接收方传输层。缓冲区是一组内存单元,可以在发送端和接收端存储分组。消费者向生产者发送信号从而进行流量控制通信。 * 当发送方传输层的缓冲区已满,它就通知应用层停止传输报文块;当有空闲位置时,它通知应用层可以再次传输报文块。 * 当接收方传输层的缓冲区已满,它就通知发送方传输层停止传输分组;当有空闲位置时,它通知发送方传输层可以再次传输分组。 ### 传输层流量控制 在传输层通信中,需要处理四个实体:发送方进程、发送方传输层、接收方传输层和接收方进程。 实体|作用 --|-- 发送方进程|应用层的发送方进程仅仅是一个生产者。它生产报文,并把它们推到传输层。 发送方传输层|发送方传输层既是消费者又是生产者:消费进程推来的报文;将报文封装进分组并推到接收方传输层。 接收方传输层|接收方传输层也有两个作用:消费从发送方那里接收来的分组;解封装报文并传递到应用层。 接收方进程|应用层的接收方仅仅是一个消费者,它消费来自接收方传输层的报文。 最后的传递通常是拉请求,接收方传输层等待直到应用层请求报文。因此,总共需要两个流量控制。 ## 差错控制 在因特网中,由于网络层(IP)是不可靠的,如果应用层需要可靠性,那么需要使传输层变得可靠。可靠性可以通过在传输层加入差错控制服务来实现。 传输层的差错控制负责以下几个方面: 1. 发现并丢弃被破坏的分组。 2. 记录丢失和丢弃的分组并重传它们。 3. 识别重复分组并丢弃它们。 4. 缓冲失序分组直到丢失的分组到达。 ### 序号 差错控制需要发送方传输层知道哪个分组要被重传并且接收方传输层需要知道哪个分组是重复的、或失序的。为此,可以在传输层分组中加入某个字段来保存分组的**序号**(sequence number)。当分组被破坏或丢失,接收方传输层可按某种方式通知发送方传输层利用序号重传分组。如果两个接收到的分组具有相同的序号,接收方传输层就能够发现重复分组。可以通过观察序号的间隔辨别失序分组。 分组一般按序编号。但对于差错控制,序号是模$2^m$的,这里$m$是序号字段的大小,单位是比特。 ### 确认 可以通过发送积极或消极的信号作为差错控制,但在传输层中更常见的是积极信号:接收方可以为每一组正确到达的分组发送一个确认(ACK)。接收方可以简单地丢弃被破坏的分组。发送方如果使用计时器,那么当ACK在计时器超时之前没有到达,发送方就会重发这个分组。 ## 流量和差错控制的组合 ### 滑动窗口 由于序号进行模$2^m$操作,因此一个环可以代表从0到$2^m-1$的序号。缓冲区由一组片段代表,称为**滑动窗口**(sliding window),它随时占据环的一部分。 * 在发送端,当一个报文被发送,相应的片段就被标记。 * 当所有片段都被标记时,意味着缓冲区满且不能从应用层进一步接收报文。 * 当报文成功送达时,相应片段被取消标记。 * 如果从窗口开始处有一些连续的片段没有被标记(表明这段空间未被使用),那么窗口滑过这些相应序号的范围,从而允许更多的片段进入窗口尾部(因为缓冲区是环状的,所以是尾部)。 注意滑动窗口仅仅是一个抽象、一个逻辑概念,实际情况是使用内存变量来保存下一个和最后一个待发送的分组。 ## 阻塞控制 在因特网之类的分组交换网络中存在一个重要问题,那就是**拥塞**(congestion)。如果网络中的**负载**(load,即发送到网络的分组数)大于网络的容量(网络可以处理的分组数),那么网络就可能发生拥塞。 **拥塞控制**(congestion control)指的是一种制和技术,它控制拥塞并将负载保持在容量以内。 ## 无连接和面向连接服务 传输层协议就像网络层协议一样,可以提供两种网络类型的服务:无连接服务和面向连接服务。在传输层,无连接服务意味着分组之间的独立;面向连接服务意味着依赖。 ### 无连接服务 在无连接服务中,源进程(应用程序)需要将报文分成传输层可接受大小的数据块,并把它们一个一个地传递到传输层。传输层将每一个数据块看成彼此没有关系的单元。当一个块从应用层到达时,传输层将其封装在分组中并发送,这些分组可能失序到达目的地并且被失序传递给接收方进程。 由于通信双方的传输层之间没有协调,流量控制、差错控制以及拥塞控制都不能在无连接服务中有效实现。 ### 面向连接服务 在面向连接服务中,首先需要建立双方之间的逻辑连接。只有连接建立以后才能进行数据交换。在数据交换结束后,连接需要拆除。 传输层的面向连接服务和网络层的面向连接服务不同: - 在网络层,面向连接服务意味着两个终端主机以及这之间的所有路由器都进行协调。 - 在传输层,面向连接服务仅仅涉及两个主机,服务是端到端的。 可以在传输层建立一个面向连接协议,其下的网络层可以是无连接协议也可以是面向连接协议。 在面向连接协议中,可以实现流量控制、差错控制以及拥塞控制。 ## References - JamesF.Kurose, KeithW.Ross, 库罗斯,等. 计算机网络:自顶向下方法[M]. 高等教育出版社, 2009. - 谢希仁. 计算机网络.第6版[M]. 电子工业出版社, 2013. 赏 Wechat Pay Alipay Transmission Control Protocol(TCP) User Datagram Protocol(UDP)