5-16 在停止等待协议中如果不使用编号是否可行?为什么?
答:
不可行,分组和确认分组都必须进行编号,才能明确哪个分则得到了确认。
5-17 在停止等待协议中,如果收到重复的报文段时不予理睬(即悄悄地丢弃它而其他什么也没做)是否可行?试举出具体的例子说明理由。
答:
可行,比如收到重复的报文段不确认相当于确认丢失。
5-18 假定在运输层使用停止等待协议。发送发在发送报文段M0后再设定的时间内未收到确认,于是重传M0,但M0又迟迟不能到达接收方。不久,发送方收到了迟到的对M0的确认,于是发送下一个报文段M1,不久就收到了对M1的确认。接着发送方发送新的报文段M0,但这个新的M0在传送过程中丢失了。正巧,一开始就滞留在网络中的M0现在到达接收方。接收方无法分辨M0是旧的。于是收下M0,并发送确认。显然,接收方后来收到的M0是重复的,协议失败了。试画出类似于图>5-9所示的双方交换报文段的过程。
答:
我们可以看出,旧的M0被当成是新的M0!可见运输层不能使用停止等待协议(编号只有 0 和1 两种)。
5-19 试证明:当用 n 比特进行分组的编号时,若接收到窗口等于 1(即只能按序接收分组),当仅在发送窗口不超过 2 n − 1 2^n-1 2n−1时,连接 ARQ 协议才能正确运行。窗口单位是分组。
答:
Ⅰ、设发送窗口记为 WT,接收窗口记为 WR。假定用 3 比特进行编号。设接收窗口正好在 7 号分组处(有阴影的分组)。
Ⅱ、发送窗口 WT的位置不可能比 ② 的位置更靠前。因为接收窗口的位置表明接收方正在等待接收 7 号分组,而这时的发送方不可能已经收到了对 7 号分组的确认。因此发送窗口必须包括 7 号分组,也就是不可能比 ② 的位置更靠前(前方就是图的右方)。
Ⅲ、发送窗口 WT的位置不可能比 ③ 的位置更靠后。因为接收窗口的位置表明接收方已经对 6 号分组(以及以前的分组)发送了确认。但如果发送窗口 WT的位置再靠后一个分组,即在 6 号分组的左边,那就表明还没有发送 6 号分组。但接收方的位置表明接收方已经发送了对 6 号分组的确认。这显然是不可能的。
Ⅳ、发送窗口 WT的位置可能在某个位置的中间,如 ①。
对于 ① 和 ② 的情况,在 WT的范围内必须无重复序号,即 WT ⩽ 2 n 2^n 2n。
对于 ③ 的情况,在 WT+ WR的范围内无重复序号,即 WT + WR ⩽ 2 n 2^n 2n。
现在 WR = 1,故发送窗口的最大值:WT ⩽ 2 n − 1 2^n − 1 2n−1。
5-20 在连续 ARQ 协议中,若发送窗口等于 7,则发送端在开始时可连续发送 7 个分组。因此,在每一分组发送后,都要置一个超时计时器。现在计算机里只有一个硬时钟。设这 7 个分组发出的时间分别为 t0,t1,…t6,且tout都一样大。试问如何实现这 7 个超时计时器(这叫软件时钟法)?
答:
可采用链表记录,其信息域为分组的相对发送时间和分组编号来实现。当编号为 0 的分组定时时钟到期后,修改链表指针并重发此分组,同时将头指针指向编号为 1 的分组,以此类推。此类方法相当于数据结构算法里的链表建立的过程。我有一篇C++的链表文章,可以参考。
可以定义一个含有7个数据的数组,数组中的数据表示时间,当该组数据发送出去时,在对应序号的数组中填入时间值,该时间值是该组发送出去的时间+超时时间得到,如何不停的对该数组的值进行扫描,当接收到接收端的确认分组时,即将对应数组序号的时间值设置为空,准备记录下一个数据发发送时间,当系统时间大于数组中某一个时间值时,说明该分组以及超时了,需要进行重传。
5-21 使用连续 ARQ 协议中,发送窗口大小是 3,而序列范围 [0, 15],而传输媒体保证在接收方能够按序收到分组。在某时刻,接收方,下一个期望收到序号是 5。试问:
(1)在发送方的发送窗口中可能有出现的序号组合有哪几种?
(2)接收方已经发送出去的、但在网络中(即还未到达发送方)的确认分组可能有哪些?说明这些确认分组是用来确认哪些序号的分组。
答:
(1)在接收方,下一个期望收到的序号是 5。这表明序号到 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 字节,链路的数据率为 10 Mb/s,试求这个文件所需的最短发送时间
答:
(1)可能的序号共 2 32 2^{32} 232=4294967296 个。TCP 的序号是数据字段中每一个字节的编号,而不是每一个报文段的编号。因此,这一小题与报文段的长度无关,即用不到题目给出的 MSS 值。这个文件 L 的最大值就是可能的序号数,即 4294967296 字节。若1GB= 2 30 2^{30} 230B,则 L 的最大值为 4 GB。
(2)发送帧数等于数据字节/每帧的数据字节= 2 32 2^{32} 232/1460=2941758.422,需要发送 2941759 个帧。
帧首部的开销是 66×2941759 = 194156094 字节。
发送的总字节数 = 2 32 2^{32} 232 + 194156094 = 4489123390字节。
数据率 10 Mbilt/s = 1.25 MB/s = 1250000 字节/秒。
发送 4489123390 字节需时间为:4489123390/1250000 =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)B 期望收到下一个报文段的第一个数据字节的序号为 100,因此确认号为 100。
(3)A 发送的第二个报文段中的数据中的字节数是 180 – 100 = 80 字节(实际上,就是序号 100 到序号 179 的字节,即 179 – 100 + 1 = 80 字节)
(4)B 在第二个报文段到达后向 A 发送确认,其确认号应为 70。(报文段丢失,就会重复发送确认上一个未收到的报文段第一个序号,即 70)
5-24 一个 TCP 连接下面使用 256 kb/s 的链路,其端到端时延为 128 ms。经测试,发现吞吐量只有 120 kb/s。试问发送窗口 W 是多少?(提示:可以有两种答案,取决于接收端发出确认的时机)。
答:
设发送窗口 = W(bit),再设发送端连续发送完窗口内的数据所需要的时间 = T。有两种情况:
(a)接收端在收完一批数据的最后才发出确认,因此发送端经过 (256 ms + T) 后才能发送下一个窗口的数据。
(b)接收端每收到一个很小的报文段就发回确认,因此发送端经过比 256 ms 略多一些的时间即可在发送数据。因此每经过 256 ms 就能发送一个窗口的数据。
--------------------------------------------------(a)---------------------------------------------------------------------------------- (b)-----------------------------
(a):吞吐量=数据量/时间
数据量=W;时间=发送时延+往返时延=W/256kbit/s+256ms;
吞吐量=W/[(W/256kbit/s)+256ms]=120kbit/s;
求得W=57825.88bit,约等于7228字节。
(b):吞吐量=数据量/时间
数据量=W;时间=发送时延+往返时延=256ms(这里b是发送一点就确认接收一点,所以发送时延可以忽略不计。)
吞吐量=W/256ms=120kbit/s;
求得W=30720bit=3840字节。
5-25 为什么在 TCP 首部中要把 TCP 端口号放入最开始的 4 个字节?
答:
在 ICMP 的差错报文中要包含 IP 首部后面的8个字节的内容,而这里面有 TCP 首部中的源端口和目的端口。当 TCP 收到 ICMP 差错报文时需要用这两个端口来确定是哪条连接出了差错。
5-26 为什么在 TCP 首部中有一个首部长度字段,而 UDP 的首部中就没有这个这个字段?
TCP 首部除固定长度部分外,还有选项,因此 TCP 首部长度是可变的。
UDP 首部长度是固定的。
5-27 一个 TCP 报文段的数据部分最多为多少个字节?为什么?如果用户要传送的数据的字节长度超过 TCP 报文字段中的序号字段可能编出的最大序号,问还能否用 TCP 来传送?
答:
(1) 一个 TCP 那段的数据部分最多为 65495 字节,此数据部分加上 TCP 首部的 20 字节,再加上 IP 首部的 20 字节,正好是 IP 数据报的最大长度 65535。(当然,若 IP 首部包含了选择,则 IP 首部长度超过20字节,这时 TCP 报文段的数据部分的长度将小于 65495 字节。)
(2)如果数据的字节长度超过 TCP 报文段中的序号字段可能编出的最大序号,仍可用 TCP 传送。编号用完后可重复使用。但应设法保证不出现编号的混乱。
IP 数据报的最大长度 = 2 1 6 2^16 216 − 1 = 65535 字节
TCP 报文段的数据部分 = IP 数据报的最大长度 – IP 数据报的首部 – TCP 报文段的首部 = 65535 – 20 – 20 = 65495 字节
一个 TCP 报文段的最大载荷是 65515 字节.
IP数据报的最大长度为 2 1 6 2^16 216 − 1= 65535 字节,减去 IP 数据报首部 20 字节和 TCP 首部 20 字节后的 TCP 报文段的数据部分为 65495 字节。
5-28 主机 A 向主机 B 发送 TCP 报文段,首部中的源端口是 m 而目的端口是n。当 B 向 A 发送回信时,其 TCP 报文段的首部中源端口和目的端口分别是什么?
答:
当 B 向 A 发送回信时,其 TCP 报文段的首部中得到源端口就是 A 发送的 TCP 报文段首部的目的端口 n,而 B 发送的 TCP 报文段首部中的目的端口就是 A 发送的 TCP 报文段首都的源端口 m。
5-29 在使用 TCP 传送数据时,如果有一个确认报文段丢失了,也不一定会引起与该确认报文段对应的数据的重传。试说明理由。
答:
还未重传就收到了对更高序号的确认。因为 TCP 接收方只会对按序到达的最后一个分组发送确认。当对更高的序号确认了,意味着已经到达了,即不用重传了。
5-30 设 TCP 使用的最大窗口为 65535 字节,而传输信道不产生差错,带宽也不受限制。若报文段的平均往返时延为 20 ms,问所能得到的最大吞吐量是多少?
解:
最大吞吐量那就是单位时间内的最大发送数据量。
即每20ms可以发送65535×8=524280bit。
吞吐量=524280bit/20ms=26.2Mb/s。