计网传输层

经过前面对物理层、数据链路层、网络层的学习,我们明白了如何实现点到点的可靠的传输,明白了网络中的一系列路由算法,走进传输层,我们首先要明白这一层实现的是端到端的可靠的传输,是基于不可靠的网络层之上的。

为什么之前为确保可靠而使用的超时重传和确认机制在这里会导致不可靠呢?这是因为与简单的主线(Bus)相比,我们这里所处于的是网络之中,网络里的节点是具备缓存能力的,由此可能导致分组的滞留,而简单的超时重传等机制产生的重复分组会在网络通信中引发很大的问题。基于这个现状,我们聪慧的前辈们想出利用选号和三次握手机制建立和拆除TCP 连接的方法克服了网络中重复分组引发的问题,在不可靠的IP 层之上实现的可靠的数据传输协议TCP。

本章还涉及了UDP 协议的相关内容,与TCP 面向连接、可靠的特点相比较,UDP 是一个无连接的、不可靠的传输层协议。

上图为本章考试重点,非原书结构,仅供参考。

传输协议的要素

建立连接

图6-1 是正常的三次握手建立连接的过程。(此图中的ack 值为下一次想要接收的第一个字节编号减一所得,下图亦然)。

图6-2 这种情况是老的CR(Connection Request)重复分组出现了,它虽然引起了主机2 发送相应的分组,但是主机1 根据主机2 发送分组的ack 值可以发现这是异常情况,所以拒绝(REJECT)。

图6-3 这种情况是老的CR(Connection Request)重复分组和和老的数据重复分组出现的情况。虽然老的CR 重复分组引起了主机2 发送相应的分组,但是主机1 根据主机2发送分组的ack 值可以发现这是异常情况,产生拒绝(REJECT);对于数据重复分组。主机2 根据分组的ack 值可以发现这是异常情况。

断开连接

图6-4 是正常的三次握手断开连接的过程。

图6-5 这种情况是最后主机1 发出的ack 丢失的情况,这时候,当主机2 的计时器时后,主机2 就会释放连接。

图6-6 这种情况是主机2 给主机1 的DR(Disconnection Request)的应答丢失了,这种情况下,当主机1 的计时器超时后,主机1 会重新发送DR。

图6-7 这种情况是主机2 给主机1 的DR(Disconnection Request)的应答和主机1后续的DR 都丢失了,这种情况下,主机1 经过N 次重传之后,就会放弃,并且释放连接;而主机2 在计时器超时之后也会释放连接。

UDP

UDP 简介

UDP(User Datagram Protocol),用户数据报协议。它的协议号是17。

UDP 的一些特点

第一,UDP 是无连接的,不可靠的。
第二,分组头部开销小。TCP 有20 字节的头部开销,UDP 只有8 字节。UDP 头的布局结构如下所示:

第三,UDP 尤其适用的一个领域是在客户-服务器的情形下。
第四,UDP 的一个应用是DNS(Domain Name System)<程序与DNS 服务器之间>。
第五,UDP 不考虑流控制、错误控制,在收到一个坏的数据段之后它也不重传。所有这些工作都留给用户进程。
其他UDP 的相关知识大家请见6.4 节。

TCP

TCP 数据段的头

上图显示了TCP 数据段的布局结构,每一行为32 位,即4 个字节。
第一行是源端口(Source port)和目标端口(Destination port)信息。
第二行是序列号(Sequence number),表示此次发送数据的第一个字节的编号
第三行是确认号(Acknowledge number),表示下次想要接收数据的第一个字节的编号。
第四行由几个部分组成,第一部分是TCP 头长度(TCP header length),它占4 位,单位是“4 字节”,所以我们可以简单计算一下:24*4B=64B(其中有20B 是TCP 数据段的头的固定长度,另外44B 是可选项Options);第二部分是未使用的4 位域;第三部分是8 个1 位标志:CWR 和ECE 用作拥塞控制的信号、URG 置1 表示使用了紧急指针、ACK 置1 表示确认号字段是有效的、PSH 位表示这是带有PUSH 标志的数据、RST 位被用于重置一个已经混乱的连接(一般而言,如果得到的数据段被设置了RST 位,那说明你这一端有了问题)、SYN 被用于建立连接的过程、FIN 被用于释放一个连接;第四部分是窗口大小(Window size),它表示这个TCP 数据段发送方当前可用的缓冲区大小,表示的是这一方的接收能力。
第五行由两部分组成:第一部分是校验和(Checksum),它校验的范围包括TCP数据段的头部、数据以及伪TCP 头,下面我们来看看什么是伪TCP

伪TCP 头的第一行是源地址,第二行是目标地址,第三行由三部分组成:8 位0,TCP的协议号(6)以及TCP 数据段(包括TCP 头)的字节计数。第五行的第二部分是紧急指针(Urgent pointer),它指向一段程序,调用后清除内存里的相关内容。
第六行可选项(Options)是可选的,前面我们计算过了,它的长度是0B~44B。

TCP 连接建立(三次握手)

TCP 是面向连接的,所以有三个重要阶段:建立连接、使用连接和拆除连接,这一部分我们讨论三次握手法建立TCP 连接。

由于网络中节点的缓存能力的影响,使得分组可能滞留在网络之中,由于超时重传机制等原因产生的重复分组可能会引起严重的问题,于是
我们利用选号和三次握手来保证可靠的传输。

上图是三次握手建立连接的示意图,通常在第三次发送消息的时候,TCP 数据段里已经携带了数据,故将SYN 位置为了0。在这里我仅是列出了最为重要的SYN、ACK标志位的值

TCP 连接断开(三次握手)

下面我们来看一看是如何用三次握手法断开TCP 连接的。抽象图示如下:

在这里我仅是列出了最为重要的FIN 标志位的值。

拥塞控制与慢启动算法

网络的拥塞里存在两个方面的问题,对应着每个发送方维护的两个窗口:网络容量(对应拥塞窗口)和接收方的容量(对应接收方准许的窗口)。拥塞控制的本质是降低发送方的发送速率,所以发送方的速率应该取以上两者里的小值。

拥塞控制实际上是由网络层(RED)和传输层(TCP 慢启动)共同完成的。接下来让我们一起看看什么是TCP 慢启动。

以上图示即展示了TCP 慢启动的过程,一开始通过成倍增加(指数级)拥塞窗口的大小不断试探网络连接情况,当到达阈值的时候,开始线性地增长拥塞窗口的大小。当一次超时发生的时候,将阈值设置成为当前拥塞窗口的一半,而拥塞窗口被重置为初始的值。

拥塞窗口一直增长,直至发生超时或达到接收方准许的窗口大小。
让我们再来看看网络层和传输层是如何合作完成拥塞控制,降低发送方的发送速率的。

当网络中路由器的被使用缓冲区的大小到达路由器的阈值的时候,路由器开始执行RED协议,随意丢弃某些分组,被丢弃的分组的发送方因此会超时,这时通过TCP 慢启动会降低发送方速率。