跳转至

Chapter3 传输层

3.1 简介

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信

逻辑通信,不相连的主机像仿佛相连一样,可以直接通信。

运输层协议实现在端系统中。运输层将从发送应用程序进程收到的报文转换成运输层分组报文段),网络层将报文段封装称数据报,向目的地发送。 网络路由器仅作用于该数据报的网络层字段。

3.1.1 运输层与网络层的关系

网络层提供了主机之间的逻辑通信。

运输层为运行在不同主机上的进程之间提供了逻辑通信。

3.1.2 因特网运输层概述

运输层协议

UDP(用户数据报协议)

  • 不可靠、无连接

TCP(传输控制协议)

  • 可靠、面向连接

TCP

TCP服务可以提供:

1。面向连接的服务

  • 建立TCP连接在两个通信进程的套接字之间。
  • 该连接全双工,报文发送结束拆除连接。

2。可靠数据传输服务

  • 传输保证

  • 无差错

  • 按适当顺序交付
  • 无字节的丢失和冗余

3。拥塞控制

网络出现拥塞时,抑制发送端发送数据,改善网络环境

UDP

仅提供了最小服务的轻量级运输协议,提供无连接、不可靠、不保证顺序的数据传输服务,且没有拥塞控制机制。

UDP可以选定任何速率向网络层注入数据。

网络层协议

IP(网际协议)

  • 服务模型:尽力而为交付服务,IP尽其最大努力,在通信的主机之间交付报文段,但不做任何确保:

  • 不确保报文段是否能交付

  • 不确保按序交付

  • 可靠性:不可靠

  • 唯一性:每台主机只有一个IP地址

3.2 多路复用&多路分解

UDP和TCP的基本职责:

端系统之间(主机之间)IP的交付服务拓展为运行在端系统上的两个进程之间的交付服务,这个又被称为运输层的多路复用&多路分解

多路复用&多路分解即一种职责,是运输层协议的基本责任。

多路分解:将运输层报文段中的数据交付到正确的套接字的工作。

多路复用

  • 从源主机的不同套接字中收集数据块
  • 并为每个数据块封装上首部信息,从而生成报文段
  • 再传递至网络层

如果要满足多路复用&多路分解则需要:

  1. 套接字有唯一标识符
  2. 每个报文段要能指出被交付到的套接字

于是在报文中,我们通过增加源端口号目的端口号来进行标识,每个字段16bits,大小在0-65535。

无连接的多路复用&多路分解

一个UDP的套接字是由一个二元组来标识的,这个二元组包含目的IP地址目的端口号,不同的源端口发送的信息,只要目的IP地址与端口一致,将会被送到同一进程。

源端口号用于回传信息,是返回地址的一部分。

面向连接的多路复用&多路分解

TCP的套接字是一个四元组,包括目的IP地址目的端口号源IP地址源端口号

两个不同源相同目的地址的报文段将被定位到不同的套接字,除非TCP报文段携带了初始创建连接的请求。

3.3 无连接运输:UDP

相比较于IP协议,UDP提供了多一点的复用分解服务,以便网络层与正确的应用进程之间传递数据(可以定位到给那个应用程序)。

使用过程:

  • 从应用程序获得数据
  • 封装上源、目的端口号
  • 将报文段交给网络层

UDP优点:

  • 可以较为精细的控制传输传输时间,相比较于TCP而言
  • 无需建立连接
  • 不需要维护连接状态
  • 首部开销小(TCP报文段首部开销20字节,UDP报文段首部开销8字节)

3.3.1 报文段结构

UDP首部四个字段,每个字段2个字节。

  • 源端口号
  • 目的端口号
  • 长度

长度字段指示了UDP报文段中的字节数(首部+数据)

  • 检验和

检验是否出现差错

3.3.2 检验和

3.4 可靠数据传输原理

这里研究,如何借助不可靠的协议构建一个可靠的传输信道。《计算机网络》书提出了几种协议,逐步推导出一个可靠的传输协议。该书上使用代码进行表示,《自顶向下》使用FSM(有限状态机)表示。

《计算机网络》(即教材中)总共构建了6种协议,这里都会涉及。

3.4.1 构建可靠数据传输协议

协议1:理想状态下完全可靠的数据传输

在这个协议中,数据只能单向传输。发送方和接收方的网络层总是处于准备就绪 状态。数据处理的时间忽略不计。可用的缓存空间无穷大。最强的一个条件是数据链路层 之间的通信信道永远不会损坏帧或者丢失帧。这个完全不现实的协议我们给它一个昵称“乌托邦”( Utopia)

协议2:无错信道上的单工停-等式协议

处理这样的问题:

发送方以高于接收方能处理到达帧的速度发送帧,导致接收方被淹没。这种情形实际上很容易出现,因此协议是否能够防止它非常重要。

然而, 我们仍然假设通信信道不会出错,并且数据流量还是单工的。

解决方案:

  1. 建立足够强大的接收器,使其强大到能处理一个接着一个帧组成的连续流。
  2. 让接收方给发送方提供反馈信息。接收方将数据包传递给网络层之后给发送方返回一个小的哑帧,实际上这一帧的作用是给发送方一个许可,允许它发送下一帧。发送方在发出一帧之后,根据协议要求,它必须等待一段时间直到短哑帧(即确认)到达。

发送方发送一帧,等待对方确认到达后才能继续发送,这样的协议称为停·等式协议

协议3:有错信道上的单工停-等式协议

常见问题的情形:

通信信道可能会出错。帧可能会被损坏,也可能完全被丢失。然而,我们假设,如果一帧在传输过程中被损坏,则接收方硬件在计算校验和时能检测出来。

如果一帧被损坏了之后校验和仍然是正确的(数据错误但是没能检测出),那么这个协议(以及所有其他的协议)将会失败(即给网络层递交了一个不正确的数据包)。

重申

  • 数据链路层目标:

机器A上的网络层将数据交给A的数据链路层,想要把数据传递给机器B。

数据链路层A必须将数据包丝毫不差地传递给数据链路层B,并由它传递给机器B的网络层。

丝毫不差:

  • 错包
  • 重复
  • 丢失

协议待解决问题

  • 包完整性确认

采用接收端返回确认帧进行确认的方式。

  • 确认帧的防丢失处理

解决方案:

在一个协议中,发送方在发送下一个数据之前必须等待一个肯定确认

这样的协议称为自动重复请求( ARQ , Automatic Repeat reQuest)或带有重传的肯定确认( PAR, Positive Acknowledgement with Retransmission)。

  • 帧序号

帧序号只有0和1。原因是,发送一个帧是建立在前一个帧已经发送的情况下的,比如目前已经接收到了序号为0的帧,目标接收是序号为1的新帧,此时传来序号为0的帧即认为是重复帧。

  • event

协议3中有三种事件

  • frame_arrival

一帧数据到达接收方然后出发此事件。

  • cksum_err

  • timeout

  • 定时器timer

3.4.2 流水线可靠数据传输协议

协议三的性能瓶颈在于它是一个停等协议。解决方式是改造成流水线的模式,不再等待一个响应。

需要解决的问题:

  • 必须增加序号的范围
  • 协议的发送接收方必须可以缓存多个分组
  • 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏和延时打的分组。

解决流水线的差错恢复,有两种办法:

  • 回退N步
  • 选择重传

协议4:1位滑动窗口协议

和协议三效果相同。

协议5:回退N协议

概念

回退N步(GBN)协议中,允许发送方发送多个分组而不需等待确认,流水线中未确认的分组数不能超过某个最大的允许值N。

一个窗口大小为4的例子:

GBN中,接收方丢弃所有失序分组。
滑动窗口指的是发送方窗口的滑动,当发送方接收到连续的ACK时,窗口进行滑动。
超时之后发送所有分组。

窗口大小

窗口大小w选择多大合适呢?

即 。

协议6:选择重传协议

概念

解决GBN的性能问题,因为一个分组的失效,必须重传其后所有的分组,效率很低。

选择重传仅重传了有错的分组。

注意:《计算机网络 第五版》 P181页配图有误。
图b表示选择重传。
接收3分组到后返回NAK是对2分组丢失的回应。在接收到NAK之后,发送方立即重传有问题的分组。接收到分组2之后,返回ACK5的原因是,之前的已经排序好了,发送ACK5提示发送方之前传送的已经没有问题。
这是一种SR的策略。

一个例子。

这里我们认为,发送方和接收方都有一个窗口,发送方只有接收到ACK回应,才会移动发送窗口;接收方只有最小序号接收到分组,才会向后滑动。
这是另一种SR策略。
值得注意的是,《自顶向下》和《计算机网络》关于SR的论述有不一样的地方,《计算机网络》引入NAK的概念,这也是这一节第一个图的来源原因。

窗口长度

窗口长度必须小于等于序号空间大小的一半。

在这个栗子中,如果只看中间竖面的右侧部分,发现结果是一样的,然而造成这样结果的发送方传递方式却存在歧义。
所以窗口长度不宜过大。

3.5 面向连接的运输:TCP

3.5.1 TCP连接

TCP连接需要进行相互“握手”,目的是为了确保数据传输的参数。TCP连接提供点对点全双工服务。

TCP可以从缓存中取出并放入报文段中的数据数量,受限于最大报文段长度(MSS)。TCP连接的组成包括:

  • 两台主机上的缓存
  • 变量
  • 与进程连接的套接字

MSS和MTU各是什么,二者是什么关系?
答案:MSS是TCP最大报文段长度,就是TCP发送数据需要对数据分段时,最大的段的字节数。MTU是最大传输单元,通常由网卡的硬件特性规定,表示通过该网卡传输的数据单元最大的字节数。 MSS要受同一台机器上的MTU限制。比如MTU为1500字节,那么MSS就只能是1460字节,这是因为1460字节的数据在通过网卡向外传输时,会加上20字节的ip头和20字节的tcp头。

3.5.2 TCP报文段结构

TCP首部一般为20字节。

  • 32bits序号字段,确认号字段

实现可靠数据传输服务。

TCP将数据看成一个无结构的、有序的字节流。

假设主机A通过TCP给主机B发送数据流。

  • A隐式的对数据流中的每一个字节编号
  • 假设MSS为1000字节
  • 数据流的首字节为0号

这个号码就是序号字段。

主机A填充进报文段段确认号,是主机A期望从主机B收到的下一字节的序号。一个例子:

  • 16bits接收窗口

用于流量控制,表示接收方愿意接受的字节数量。

3.5.3 时间估计

3.5.4 可靠数据传输

由序号字段和确认字段衍生出来的几个传输确认的例子:

3.5.5 流量控制

TCP通过让发送方维护一个成为接受窗口的变量,来提供流量控制的效果。

3.5.6 TCP连接管理

建立一个TCP连接

1.

  • 客户端TCP向服务器端TCP发送一个特殊的TCP报文段(被称为SYN报文段

该报文段中不包含应用层数据(实际传输的数据),在首部的一个标识位(即SYN比特)被置为1。

  • 客户随机选择一个初始序号(client_isn),将此编号放置于该其实的TCP SYN报文段的序号字段中。

2. 

  • TCP SYN报文段到达服务器主机,服务器从数据报中提取出TCP SYN报文段,并为其分配TCP缓存与变量(TCP连接建立前分配资源,容易受到SYN洪泛攻击
  • 向该TCP客户端发送允许连接的报文段(被称作SYNACK报文段),报文段中:

  • SYN比特被置为1

  • TCP报文首部确认号字段被置为 client_isn + 1
  • 服务器选择自己的序号server_isn,放入序号字段中。

3.

  • 收到SYNACK报文段后,客服端分配TCP缓存与变量
  • 客户端主机向服务器发送一个报文段

  • 将server_isn + 1 作为确认号字段

  • SYN比特置为0
  • 序号字段为 client_isn + 1
  • 可携带需要传输的数据

拆除一个TCP连接

参与TCP连接的两端都可以选择终止连接。

  1. 客户应用进程想要关闭连接,于是发送一个特殊的TCP报文段。

  2. 报文段中首部有一个FIN比特标识位,被设置为1

  3. 服务器收到报文段后,返回一个确认报文段

  4. 服务器发送自己的终止报文段

  5. 报文段中首部有一个FIN比特标识位,被设置为1

  6. 客户端对终止报文段进行确认

3.6-3.7 拥塞控制

详见《RDMA...》那篇论文的解读