【计算机网络 (谢希仁) 习题题解】第5章 运输层 (2)——连续ARQ协议;TCP报文段


传输控制协议 TCP

TCP 最主要的特点:

  • TCP 是面向连接的运输层协议。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
  • 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的 (一对一)。
  • TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达。
  • TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存。
  • 面向字节流。TCP 中的 (stream) 指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块 (大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
    TCP面向字节流

TCP 的连接

TCP 把连接作为最基本的抽象

每一条 TCP 连接有两个端点。TCP 连接的端点叫做套接字 (socket) 或插口
端口号拼接到 (concatenated with) IP 地址即构成了套接字 [RFC 793]。因此,套接字的表示方法是在点分十进制的 IP 地址后面写上端口号,中间用冒号或逗号隔开。

套接字 socket = (IP 地址: 端口号)

每一条 TCP 连接唯一地被通信两端的两个端点 (即两个套接字) 所确定。即:

TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}

TCP 连接就是由协议软件所提供的一种抽象。TCP 连接的端点是个很抽象的套接字。同一个 IP 地址可以有多个不同的 TCP 连接,同一个端口号也可以出现在多个不同的 TCP 连接中。

随着互联网的不断发展以及网络技术的进步,同一个名词 socket 可表示多种不同的意思。例如:

  • 允许应用程序访问连网协议的应用编程接口 API,即运输层和应用层之间的一种接口,称为 socket API,并简称为 socket。
  • 在 socket API 中使用的一个函数名也叫做 socket。
  • 调用 socket 函数的端点称为 socket,如“创建一个数据报 socket”。
  • 调用 socket 函数时,其返回值称为 socket 描述符,可简称为 socket。
  • 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。

上面的这些 socket 的意思都和 RFC 793 定义的 socket 不同。


可靠传输的工作原理

理想的传输条件有两个特点:

  • 传输信道不产生差错。
  • 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。

实际的网络都不具备以上两个理想条件。但可以使用一些可靠传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。

停止等待协议

“停止等待”是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
停止等待协议
B 接收 M1 时检错出了差错,就丢弃 M1,其他什么也不做。
可靠传输协议是这样设计的:A 只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这叫做超时重传
要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。

注意三点:

  • A 在发送完一个分组后,必须暂时保留已发送的分组的副本。只有在收到相应的确认后才能清除暂时保留的分组副本。
  • 分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认。
  • 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。在运输层重传时间的准确设定是非常复杂的,这是因为已发送出的分组到底会经过哪些网络,以及这些网络将会产生多大的时延 (取决于网络当时的拥塞情况),这些都是不确定因素
    确认丢失和确认迟到

使用上述的确认和重传机制,就可以在不可靠的传输网络上实现可靠的通信

像上述的这种可靠传输协议常称为自动重传请求 ARQ (Automatic Repeat ReQuest)。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

停止等待协议的优点是简单,缺点是信道利用率太低。
信道利用率
仅仅是在时间 T D T_D TD 内才用来传送有用的数据 (包括分组的首部),因此信道的利用率 U U U 为:
U = T D T D + RTT + T A U = \frac{T_D}{T_D + \text{RTT} + T_A} U=TD+RTT+TATD

为了提高传输效率,发送方可以不使用低效率的停止等待协议,而采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。
流水线传输
当使用流水线传输时,使用连续 ARQ 协议滑动窗口协议

连续 ARQ 协议

连续 ARQ 协议
连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

接收方一般采用累计确认的方式。接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。

累计确认的优点是:容易实现,即使确认丢失也不必重传。缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。
例如,如果发送方发送了前 5 个分组,中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,只好把后面的三个分组都再重传一次。这叫做 Go-back-N (回退 N),表示需要再退回来重传已发送过的 N 个分组。


TCP 报文段的首部格式

TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。
TCP报文段

  • 源端口、目的端口:分别写入源端口号和目的端口号。TCP 的分用功能是通过端口实现的。
  • 序号:范围是 [ 0 , 2 32 − 1 ] [0, 2^{32}-1] [0,2321],使用 m o d    2 32 \mod 2^{32} mod232 运算。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。
    首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例,一报文段的序号字段值是 301,携带的数据共有 100 字节。这表明:本报文段的数据的第一个字节的序号是 301,下一个报文段 (若有的话) 的序号字段值应为 401。
    这个字段的名称也叫做报文段序号
  • 确认号:期望收到对方下一个报文段的第一个数据字节的序号
    若确认号 = N,则表明:到序号 N-1 为止的所有数据都已正确收到。
  • 数据偏移:指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。实际上是指出 TCP 报文段的首部长度。“数据偏移”的单位是 32 位字 (即 4 字节)。
  • 保留:保留为今后使用,目前应置为 0。
  • 窗口:窗口值是 [ 0 , 2 16 − 1 ] [0, 2^{16}-1] [0,2161] 之间的整数。窗口指的是发送本报文段的一方的接收窗口 (而不是自己的发送窗口)。
    窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。
    之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
  • 检验和:检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
    伪首部的格式与图 5-5 中 UDP 用户数据报的伪首部一样。把伪首部第 4 个字段中的 17 改为 6 (TCP 的协议号),把第 5 字段中的 UDP 长度改为 TCP 长度。
  • 紧急指针 (Urgent Point):仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。
  • 选项:最长可达 40 字节。
    TCP 最初只规定了一种选项,即最大报文段长度 MSS (Maximum Segment Size) [RFC 879]。MSS 是每一个 TCP 报文段中的数据字段的最大长度。在连接建立的过程中,双方都把自己能够支持的 MSS 写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的 MSS 值。MSS 的默认值是 536 字节长。
    随着互联网的发展,又陆续增加了几个选项。如窗口扩大选项、时间戳选项等 [RFC 7323]。以后又增加了有关选择确认 (SACK) 选项。
    窗口扩大选项:为了扩大窗口。窗口扩大选项占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于 TCP 首部中的窗口位数从 16 增大到 (16 + S)。移位值允许使用的最大值是 14。窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送 S = 0 的选项,使窗口大小回到 16。
    时间戳选项:占 10 字节,其中最主要的字段是时间戳值字段 (4 字节) 和时间戳回送回答字段 (4 字节)。时间戳选项有两个功能。①用来计算往返时间 RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。发送方在收到确认报文后,可准确计算出 RTT。②用于处理 TCP 序号超过 2 32 2^{32} 232 的情况,这又称为防止序号绕回 (Protect Against Wrapped Sequence numbers)。TCP 报文段每增加 2 32 2^{32} 232 个序号就会重复使用原来用过的序号。当使用高速网络时,在一次 TCP 连接的数据传送中序号很可能会被重复使用。为了使接收方能够把新的报文段和迟到很久的报文段区分开,可以在报文段中加上这种时间戳。

有 6 个控制位,用来说明本报文段的性质:

  • 紧急 URG (URGent):当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据),而不要按原来的排队顺序来传送。
    当 URG 置 1 时,发送应用进程就告诉发送方的 TCP 有紧急数据要传送。于是发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针字段配合使用。
  • 确认 ACK (ACKnowledgement):仅当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
  • 推送 PSH (PuSH):当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送 (push) 操作。发送方 TCP 把 PSH 置 1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH = 1 的报文段,就尽快地 (即“推送”向前) 交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位 RST (ReSeT):当 RST = 1 时,表明 TCP 连接中出现严重差错 (如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也可称为重建位或重置位。
  • 同步 SYN (SYNchronization):在连接建立时用来同步序号。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1。因此,SYN 置为 1 表示这是一个连接请求或连接接受报文。
  • 终止 FIN (FINis):用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

5-16 在停止等待协议中如果不使用编号是否可行?为什么?

:不行。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。


5-17 在停止等待协议中,如果收到重复的报文段时不予理睬 (即悄悄地丢弃它而其他什么也没做) 是否可行?试举出具体的例子说明理由。

:不可行。接收方应采取两个行动。
①丢弃这个重复的分组,不向上层交付。
②向发送方发送确认。因为发送方之所以重传报文段,就表示发送方没有收到相应的确认。


5-18 假定在运输层使用停止等待协议。发送发在发送报文段 M0 后在设定的时间内未收到确认,于是重传 M0,但 M0 又迟迟不能到达接收方。不久,发送方收到了迟到的对 M0 的确认,于是发送下一个报文段 M1,不久就收到了对 M1 的确认。接着发送方发送新的报文段 M0,但这个新的 M0 在传送过程中丢失了。正巧,一开始就滞留在网络中的 M0 现在到达接收方。接收方无法分辨 M0 是旧的。于是收下 M0,并发送确认。显然,接收方后来收到的 M0 是重复的,协议失败了。
试画出类似于图5-9所示的双方交换报文段的过程。

图A-5


5-19 试证明:当用 n n n 比特进行分组的编号时,若接收窗口等于 1 (即只能按序接收分组),则仅在发送窗口不超过 2 n − 1 2^n-1 2n1 时,连续 ARQ 协议才能正确运行。窗口单位是分组。

图A-6
设发送窗口记为 W T W_T WT,接收窗口记为 W R W_R WR。假定用 3 比特进行编号。设接收窗口正好在 7 号分组处 (有阴影的分组)。发送窗口 W T W_T WT 的位置不可能比②更靠前,也不可能比③更靠后,也可能不是这种极端位置,如①。
对于①和②的情况,在 W T W_T WT 的范围内无重复序号,即 W T ≤ 2 n W_T \le 2^n WT2n
对于③的情况,在 W T + W R W_T + W_R WT+WR 的范围内无重复序号,即 W T + W R ≤ 2 n W_T + W_R \le 2^n WT+WR2n
现在 W R = 1 W_R = 1 WR=1,故发送窗口的最大值 W T ≤ 2 n − 1 W_T \le 2^n-1 WT2n1


5-20 在连续 ARQ 协议中,若发送窗口等于 7,则发送端在开始时可连续发送 7 个分组。因此,在每一分组发出后,都要置一个超时计时器。现在计算机里只有一个硬时钟。设这 7 个分组发出的时间分别为 t 0 , t 1 … t 6 t_0,t_1…t_6 t0,t1t6,且 t o u t t_{out} tout 都一样大。试问如何实现这 7 个超时计时器 (这叫软时钟法)?

:用相对发送时间实现一个链表。
A-7


5-21 假定使用连续 ARQ 协议中,发送窗口大小是 3,而序号范围是 [0, 15],而传输媒体保证在接收方能够按序收到分组。在某时刻,在接收方,下一个期望收到序号是 5。试问:
(1) 在发送方的发送窗口中可能出现的序号组合有哪些?
(2) 接收方已经发送出去的、但在网络中 (即还未到达发送方) 的确认分组可能有哪些?说明这些确认分组是用来确认哪些序号的分组。

:(1) 序号到 4 为止的分组都已收到。若这些确认都已到达发送方,则发送窗口的范围是 [5, 7]。假定所有的确认都丢失了,发送方没有收到这些确认。这时,发送窗口应为 [2, 4]。因此,发送窗口可以是 [2, 4],[3, 5],[4, 6],[5, 7] 中的任何一个。
(2) 接收方期望收到序号 5 的分组,说明序号为 2,3,4 的分组都已收到,并且发送了确认。对序号为 1 的分组的确认肯定被发送方收到了,否则发送方不可能发送 4 号分组。可见,对序号为 2,3,4 的分组的确认有可能仍滞留在网络中。这些确认是用来确认序号为 2,3,4 的分组。


5-22 主机 A 向主机 B 发送一个很长的文件,其长度为 L 字节。假定 TCP 使用的 MSS 为 1460 字节。
(1) 在 TCP 的序号不重复使用的条件下,L 的最大值是多少?
(2) 假定使用上面计算出文件长度,而运输层、网络层和数据链路层所使用的首部开销共 66 字节,链路的数据率为 10Mbit/s,试求这个文件所需的最短发送时间。

:(1) 序号字段占 32 位,范围为 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321],在一个 TCP 连接中传送的字节流中的每一个字节按顺序编号,故 L 的最大值为 2 32 2^{32} 232,即长度为 4 GB (4294967296 字节)。
(2) 这个文件至少需要分为 N = L / MSS = 2941759 个报文段发送。
所以首部开销共有 L2 = 66N = 194156094 字节。
所以传送文件的总共发送的字节数为 L3 = L + L2 = 4489123390 字节。
发送 L3 字节所需时间为 L3 / 数据率 = 3591.3 秒,即 59.85 分,约 1 小时。


5-23 主机 A 向主机 B 连续发送了两个 TCP 报文段,其序号分别为 70 和 100。试问:
(1) 第一个报文段携带了多少个字节的数据?
(2) 主机 B 收到第一个报文段后发回的确认中的确认号应当是多少?
(3) 如果 B 收到第二个报文段后发回的确认中的确认号是 180,试问 A 发送的第二个报文段中的数据有多少字节?
(4) 如果 A 发送的第一个报文段丢失了,但第二个报文段到达了 B。B 在第二个报文段到达后向 A 发送确认。试问这个确认号应为多少?

:(1) 第一个报文段的数据序号是 70 到 99,共 30 字节的数据。
(2) 确认号应为 100。
(3) 第二个报文段的数据序号是 100 到 179,共 80 字节的数据。
(4) 确认号应为 70。


5-25 为什么在 TCP 首部中要把 TCP 的端口号放入最开始的 4 个字节?

:在 ICMP 的差错报文中要包含 IP 首部后面的 8 个字节的内容,而这里面有 TCP 首部中的源端口和目的端口。当 TCP 收到 ICMP 差错报文时需要用这两个端口来确定是哪条连接出了差错。


5-26 为什么在 TCP 首部中有一个首部长度字段,而 UDP 的首部中就没有这个这个字段?

:TCP 首部除固定长度部分外,还有选项,因此 TCP 首部长度是可变的。UDP 首部长度是固定的。


5-27 一个 TCP 报文段的数据部分最多为多少个字节?为什么?如果用户要传送的数据的字节长度超过 TCP 报文字段中的序号字段可能编出的最大序号,问还能否用 TCP 来传送?

:65495 字节。此数据部分加上 TCP 首部的 20 字节,再加上 IP 首部的 20 字节,正好是 IP 数据报的最大长度 65535 字节。当然,若 IP 首部包含了选择,则 IP 首部长度超过 20 字节,这时 TCP 报文段的数据部分的长度将小于 65495 字节。

数据的字节长度超过 TCP 报文段中的序号字段可能编出的最大序号,还能用 TCP 来传送。因为序号可以循环使用。如果在一次 TCP 连接的数据传送中序号被重复使用,可以在报文段中加上时间戳选项,使接收方能够把新的报文段和迟到很久的报文段区分开。


5-28 主机 A 向主机 B 发送 TCP 报文段,首部中的源端口是 m 而目的端口是 n。当 B 向 A 发送回信时,其 TCP 报文段的首部中源端口和目的端口分别是什么?

:分别是 n 和 m。


5-48 网络允许的最大报文段长度为 128 字节,序号用 8 位表示,报文段在网络中的寿命为 30 秒。求发送报文段的一方所能达到的最高数据率。

:具有相同编号的报文段不应该同时在网络中传输,必须保证当序列号循环重复使用的时候,具有相同序列号的报文段已经从网络中消失。
序号用 8 位表示,序号范围是 [ 0 , 2 8 − 1 ] [0, 2^{8}-1] [0,281],共 256 个序号。
报文段的寿命为 30 s,那么在 30 s 的时间内发送方发送的报文段的数目不能多于 255 个。
网络允许的最大报文段长度为 128 B,一共发送的比特数为 255 × 128 × 8 bit = 261120 bit。
每一条 TCP 连接所能达到的最高数据传输速率为 261120 bit / 30 s = 8.704 kbit/s。


5-65 假定主机 A 向 B 发送一个 TCP 报文段。在这个报文段中,序号是 50,而数据一共有 6 字节长。试问,在这个报文段中的确认字段是否应当写入 56?

:在这个报文段中的确认字段应当写入的是 A 期望下次收到 B 发送的数据中的第一个字节的编号,而这个数值是 A 已经收到的数据的最后一个字节的编号加 1。
然而这些在题目中并未给出。因此,现在无法知道这个报文段中的确认字段应当写入什么数值。


5-66 主机 A 通过 TCP 连接向 B 发送一个很长的文件,因此这需要分成很多个报文段来发送。假定某一个 TCP 报文段的序号是 x,那么下一个报文段的序号是否就是 x + 1 呢?

:首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
仅在此报文段中仅有 1 个字节的数据使,下一个报文段的序号才是 x + 1。


5-67 TCP 的吞吐量应当是每秒发送的数据字节数,还是每秒发送的首部和数据之和的字节数?吞吐量应当是每秒发送的字节数,还是每秒发送的比特数?

:TCP 的吞吐量本来并没有标准的定义,TCP 的吞吐量可定义为每秒发送的数据字节数。
计算机内部的数据传送是以每秒多少字节作为单位的,而在通信线路上的数据率则常用每秒多少比特作为单位。


5-70 假定用 TCP 协议在 40 Gbit/s 的线路上传送数据。
(1) 如果 TCP 充分利用了线路的带宽,那么需要多长的时间 TCP 会发生序号绕回?
(2) 假定现在 TCP 的首部中采用了时间戳选项。时间戳占用了 4 字节,共 32 位。每隔一定的时间 (这段时间叫做一个嘀嗒) 时间戳的数值加 1。假定设计的时间戳是每隔 859 微秒,时间戳的数值加 1。试问要经过多长时间才发生时间戳数值的绕回。

:(1) TCP 报文段中序号字段占 32 位,共 2 32 = 4294967296 2^{32} = 4294967296 232=4294967296 个序号。
表示可以传输 4294967296 字节,即 34359738368 bit。
所求时间为 34359738368 bit / (40 Gbit/s) = 859 ms。

(2) 所求时间为 2 32 × 859 × 1 0 − 6 s = 3.689 × 1 0 6 s 2^{32} \times 859 \times 10^{-6} s = 3.689 \times 10^6 s 232×859×106s=3.689×106s = 42.7 天。


5-71 在 5.5 节中指出:例如,若用 2.5 Gbit/s 速率发送报文段,则不到 14 秒钟序号就会重复。请计算验证这句话。

:TCP 首部中的序号字段占 32 位,共 2 32 = 4294967296 2^{32} = 4294967296 232=4294967296 个序号,可为 2 32 2^{32} 232 个字节编号而不会重复。
不会重复发送的时间是 2 32 × 8 b i t / ( 2.5 G b i t / s ) = 13.74 s < 14 s 2^{32} \times 8 bit / (2.5 Gbit/s) = 13.74 s < 14 s 232×8bit/(2.5Gbit/s)=13.74s<14s


【计算机网络 (谢希仁) 习题题解】目录

  • 14
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值