1.试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的?
答:运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供服务 运输层为应用进程之间提供端到端的逻辑通信,但网络层是为主机之间提供逻辑通信(面向主机,承担路由功能,即主机寻址及有效的分组交换)。 各种应用进程之间通信需要“可靠或尽力而为”的两类服务质量,必须由运输层以复用和分用的形式加载到网络层。
2.网络层提供数据报或虚电路服务对上面的运输层有何影响?
答:网络层提供数据报或虚电路服务不影响上面的运输层的运行机制。 但提供不同的服务质量。
3.当应用程序使用面向连接的TCP和无连接的IP时,这种传输是面向连接的还是面向无连接的?
答:都是。这要在不同层次来看,在运输层是面向连接的,在网络层则是无连接的。
4.试用画图解释运输层的复用。画图说明许多个运输用户复用到一条运输连接上,而这条运输连接有复用到IP数据报上。
答:
在图中,主机H3同时和主机H1和主机H2进行通信。H1和H3两个应用进程(HTTP和SMTP)进行通信,这需要使用两个TCP连接。这两个TCP连接所传送的报文段,使用下面的网络层IP数据报进行传送。H2和H3的应用进程(HTTP)进行通信,这需要使用一个TCP进行连接。这个TCP连接所传送的报文段,也要使用下面的网络层IP数据报进行传送。在网络层所传送的IP数据报已看不到运输层以上的复用情况。
5.试举例说明有些应用程序愿意采用不可靠的UDP,而不用采用可靠TCP。
答:VOIP:由于语音信息具有一定的冗余度,人耳对VOIP数据报损失由一定的承受度,但对传输时延的变化较敏感。有差错的UDP数据报在接收端被直接抛弃,TCP数据报出错则会引起重传,可能带来较大的时延扰动。因此VOIP宁可采用不可靠的UDP,而不愿意采用可靠的TCP。
6.接收方收到有差错的UDP用户数据报时应如何处理?
答:丢弃。
7.如果应用程序愿意使用UDP来完成可靠的传输,这可能吗?请说明理由。
答:可能,但应用程序中必须额外提供与TCP相同的功能。
8.为什么说UDP是面向报文的,而TCP是面向字节流的?
答:发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。发送方TCP对应用程序交下来的报文数据块,视为无结构的字节流(无边界约束,课分拆/合并),但维持各字节。
9.端口的作用是什么?为什么端口要划分为三种?
答:端口的作用是对TCP/IP体系的应用进程进行统一的标志,使运行不同操作系统的计算机的应用进程能够互相通信。熟知端口,数值一般为0——1023.标记常规的服务进程;登记端口号,数值为1024——49151,标记没有熟知端口号的非常规的服务进程。
10.试说明运输层中伪首部的作用。
答:用于计算运输层数据报校验和。
11.某个应用进程使用运输层的用户数据报UDP,然而继续向下交给IP层后,又封装成IP数据报。既然都是数据报,可否跳过UDP而直接交给IP层?哪些功能UDP提供了但IP没提提供?
答:不可跳过UDP而直接交给IP层IP数据报IP报承担主机寻址,提供报头检错;只能找到目的主机而无法找到目的进程。UDP提供对应用进程的复用和分用功能,以及提供对数据差分的差错检验。
12.一个应用程序用UDP,到IP层把数据报在划分为4个数据报片发送出去,结果前两个数据报片丢失,后两个到达目的站。过了一段时间应用程序重传UDP,而IP层仍然划分为4个数据报片来传送。结果这次前两个到达目的站而后两个丢失。试问:在目的站能否将这两次传输的4个数据报片组装成完整的数据报?假定目的站第一次收到的后两个数据报片仍然保存在目的站的缓存中。
答:不行。重传时,IP数据报的标识字段会有另一个标识符。仅当标识符相同的IP数据报片才能组装成一个IP数据报。前两个IP数据报片的标识符与后两个IP数据报片的标识符不同,因此不能组装成一个IP数据报。
13.一个UDP用户数据的数据字段为8192字节。在数据链路层要使用以太网来传送。试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值。
答:UDP数据报 = 首部8字节 + 数据部分组成。
因为数据字段为8192字节,所以数据报总长度 = 8192 + 8 = 8200 字节。
以太网的最大传输单元MTU = 1500。
因为要划分为几个IP数据报,而每个IP数据报的首部占20字节,所以字段部分最大占1480字节。
划分的时候,可以划分为 8200 / 1480 = 5,余 800 字节。
所以应当划分为 6 个IP数据报片,前 5 个都是 1480 字节,第 6 个是 800 字节。一个字段即为8个字节。
第一个IP数据报字段长度:1480,第一片偏移字段:1480 * 0 / 8 = 0
第二个IP数据报字段长度:1480,第二片偏移字段:1480 * 1 / 8 = 185
第三个IP数据报字段长度:1480,第三片偏移字段:1480 * 2 / 8 = 370
第四个IP数据报字段长度:1480,第四片偏移字段:1480 * 3 / 8 = 555
第五个IP数据报字段长度:1480,第五片偏移字段:1480 * 4 / 8 = 740
第六个IP数据报字段长度:800, 第六片偏移字段:1480 * 5 / 8 = 925
UDP数据报的首部存在于第一个IP数据报片中,所以第一个IP数据报字段为:首部8字节 + 1472数据部分。
14.一UDP用户数据报的首部十六进制表示是:06 32 00 45 00 1C E2 17.试求源端口、目的端口、用户数据报的总长度、数据部分长度。这个用户数据报是从客户发送给服务器还是服务器发送给客户?使用UDP的这个服务器程序是什么?
解:源端口:1586(前4个字节0632)
目的端口:69(00 45)
用户数据报总长度:28 字节(00 1C,其中首部占8字节)
数据部分长度:20 字节
这个用户数据报是:从客户发送给服务器
服务器程序:TFTP。
UDP数据报由首部字段和数据字段组成,其中首部占8个字节(TCP数据报首部占20字节),格式如下:
以上求出的长度为UDP数据报的总长度28字节,由于UDP数据报的首部占8字节,所以数据字段长度占20字节
因为目的端口号 69 < 1023,是常用的服务端口,所以这个数据报是发往服务器端的
0~1023:常用的服务端口
1024~49151是被注册的端口,也成为“用户端口”
其中 1024~5000为临时端口
因为端口号为69,所以使用 UDP 的这个服务器程序是TFTP
TFTP:是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
15.使用TCP对实时话音数据的传输有没有什么问题?使用UDP在传送数据文件时会有什么问题?
答:如果语音数据不是实时播放(边接受边播放)就可以使用TCP,因为TCP传输可靠。接收端用TCP讲话音数据接受完毕后,可以在以后的任何时间进行播放。但假定是实时传输,则必须使用UDP。 UDP不保证可靠付,但UCP比TCP的开销要小很多。因此只要应用程序接受这样的服务质量就可以使用UDP。
16.在停止等待协议中如果不使用编号是否可行?为什么?
答:不可行,分组和确认分组都必须进行编号,才能明确哪个分则得到了确认。
17.在停止等待协议中,如果收到重复的报文段时不予理睬(即悄悄地丢弃它而其他什么也没做)是否可行?试举出具体的例子说明理由。
答:可行,比如收到重复的报文段不确认相当于确认丢失。
18.假定在运输层使用停止等待协议。发送发在发送报文段M0后再设定的时间内未收到确认,于是重传M0,但M0又迟迟不能到达接收方。不久,发送方收到了迟到的对M0的确认,于是发送下一个报文段M1,不久就收到了对M1的确认。接着发送方发送新的报文段M0,但这个新的M0在传送过程中丢失了。正巧,一开始就滞留在网络中的M0现在到达接收方。接收方无法分辨M0是旧的。于是收下M0,并发送确认。显然,接收方后来收到的M0是重复的,协议失败了。试画出类似于图5-9所示的双方交换报文段的过程。
答:
我们可以看出,旧的M0被当成是新的M0!可见运输层不能使用停止等待协议(编号只有 0 和1 两种)。
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。
20.在连续 ARQ 协议中,若发送窗口等于 7,则发送端在开始时可连续发送 7 个分组。因此,在每一分组发送后,都要置一个超时计时器。现在计算机里只有一个硬时钟。设这 7 个分组发出的时间分别为 t0,t1,…t6,且tout都一样大。试问如何实现这 7 个超时计时器(这叫软件时钟法)?
答:
方法1:可采用链表记录,其信息域为分组的相对发送时间和分组编号来实现。当编号为 0 的分组定时时钟到期后,修改链表指针并重发此分组,同时将头指针指向编号为 1 的分组,以此类推。此类方法相当于数据结构算法里的链表建立的过程。我有一篇C++的链表文章,可以参考。
方法2:可以定义一个含有7个数据的数组,数组中的数据表示时间,当该组数据发送出去时,在对应序号的数组中填入时间值,该时间值是该组发送出去的时间+超时时间得到,如何不停的对该数组的值进行扫描,当接收到接收端的确认分组时,即将对应数组序号的时间值设置为空,准备记录下一个数据发发送时间,当系统时间大于数组中某一个时间值时,说明该分组以及超时了,需要进行重传。
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 的分组的。
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 小时。
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)
24.一个 TCP 连接下面使用 256 kb/s 的链路,其端到端时延为 128 ms。经测试,发现吞吐量只有 120 kb/s。试问发送窗口 W 是多少?(提示:可以有两种答案,取决于接收端发出确认的时机)。
答:设发送窗口 = W(bit),再设发送端连续发送完窗口内的数据所需要的时间 = T。有两种情况:
(a)接收端在收完一批数据的最后才发出确认,因此发送端经过 (256 ms + T) 后才能发送下一个窗口的数据。
(b)接收端每收到一个很小的报文段就发回确认,因此发送端经过比 256 ms 略多一些的时间即可在发送数据。因此每经过 256 ms 就能发送一个窗口的数据。
(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字节。
25.为什么在 TCP 首部中要把 TCP 端口号放入最开始的 4 个字节?
答:在 ICMP 的差错报文中要包含 IP 首部后面的8个字节的内容,而这里面有 TCP 首部中的源端口和目的端口。当 TCP 收到 ICMP 差错报文时需要用这两个端口来确定是哪条连接出了差错。
26.为什么在 TCP 首部中有一个首部长度字段,而 UDP 的首部中就没有这个这个字段?
TCP 首部除固定长度部分外,还有选项,因此 TCP 首部长度是可变的。UDP 首部长度是固定的。
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 字节。
28.主机 A 向主机 B 发送 TCP 报文段,首部中的源端口是 m 而目的端口是n。当 B 向 A 发送回信时,其 TCP 报文段的首部中源端口和目的端口分别是什么?
答:当 B 向 A 发送回信时,其 TCP 报文段的首部中得到源端口就是 A 发送的 TCP 报文段首部的目的端口 n,而 B 发送的 TCP 报文段首部中的目的端口就是 A 发送的 TCP 报文段首都的源端口 m。
29.在使用 TCP 传送数据时,如果有一个确认报文段丢失了,也不一定会引起与该确认报文段对应的数据的重传。试说明理由。
答:还未重传就收到了对更高序号的确认。因为 TCP 接收方只会对按序到达的最后一个分组发送确认。当对更高的序号确认了,意味着已经到达了,即不用重传了。
30.设 TCP 使用的最大窗口为 65535 字节,而传输信道不产生差错,带宽也不受限制。若报文段的平均往返时延为 20 ms,问所能得到的最大吞吐量是多少?
解: 最大吞吐量那就是单位时间内的最大发送数据量。
即每20ms可以发送65535×8=524280bit。
吞吐量=524280bit/20ms=26.2Mb/s。
31.通信信道带宽为 1 Gb/s,端到端时延为 10 ms。TCP 的发送窗口为 65535 字节。试问:可能达到的最大吞吐量是多少?信道的利用率是多少?
解:吞吐量=发送数据/时间
发送数据最大=65535×8=524280bit。
时间=发送时延+往返时延=524280bit/(1Gbit/s)+20ms=20.524ms。
最大吞吐量=524280bit/20.524ms=25.5Mbit/s。
信道利用率=吞吐量/带宽=(25.5Mbit/s)/(1Gbit/s)×100%=2.55%。
32.什么是 Karn 算法?在 TCP 的重传机制中,若不采用 Karn 算法,而是在收到确认时都认为是对重传报文段的确认,那么由此得出的往返时延样本和重传时间都会偏小。试问:重传时间最后会减小到什么程度?
答:Karn 算法允许 TCP 能够区分开有效的和无效的往返时间样本,从而改进往返时间的估算。
若不采用 Karn 算法,而是在收到确认时都认为是对重传报文段的确认,那么由此得出的往返时间样本和重传时间都会偏小。如下图所示,TCP 发送了报文段后,没有收到确认,于是超时重传报文段。但刚刚重传了报文段后,马上就收到了确认。显然,这个确认是对原来发送的报文段的确认。
但是,根据题意,我们就认为这个确认是对重传的报文段的确认。这样得出的往返时间就会很小。这样的往返时间最后甚至可以减小到很接近于零、
因此,上述的这种做法是不可取的。
33.假定 TCP 在开始建立连接时,发送方设定超时重传时间是RTO = 6秒。
(1)当发送方接到对方的连接确认报文段时,测量出 RTT 样本值为1.5秒。试计算现在的RTO值。
(2)当发送方发送数据报文段并接收到确认时,测量出RTT样本值为2.5秒。试计算现在的RTO值。
解:(1)当第一次测量RTT样本时,RTTS就取值RTT样本值为1.5s。RTTS=1.5s
根据RFC2988的建议,RTTD取值为RTT样本值的一半。
RTTD=0.75s
根据公式可得:RTO=RTTS+4RTTD=1.5s+3s=4.5s
(2)新的RTT样本为2.5s。(根据RFC6298推荐,α取1/8,β取1/4。)
即新的RTTS=(1-α)×(旧的RTTS)+α×(新的RTT样本)=1.625s
新的RTTD=(1-β)×(旧的RTTD)+β×|RTTS-新的RTT样本|=0.78s
根据公式:RTO=RTTS+4RTTD=1.625s+4×0.78s=4.75s
34.已知第一次测得 TCP 的往返时延的当前值 RTT 是 30 ms。现在收到了三个接连的确认报文段,它们比相应的数据报文段的发送时间分别滞后的时间是:26 ms,32 ms 和24 ms。设 α = 0.1。试计算每一次的新的加权平均往返时间值RTTS。讨论所得出的结果。
解:公式:即新的RTTS=(1-α)×(旧的RTTS)+α×(新的RTT样本)
第一次:RTTs=(1-0.1)×30ms+0.1×26ms=29.6ms
第二次:RTTS=(1-0.1)×29.6ms+0.1×32ms=29.86ms
第三次:RTTS=(1-0.1)×29.86ms+0.1×24ms=29.256ms
三次的加权平均时间相差不大,当RTT样本值变化不大时,RTTs的变化也是很小的。
35.用TCP通过速率为1Gbit/s的链路传送一个10MB的文件。假定链路的往返时延RTT=50ms。TCP选用了窗口扩大选项,使窗口达到可选用的最大值。在接收端,TCP的接收窗口为1MB,而发送端采用拥塞控制算法,从慢开始传送。假定拥塞窗口以分组为单位计算,在一开始发送1个分组,而每个分组长度都是1KB.假定网络不会发生拥塞和分组丢失,并且发送端发送数据的速率足够快,因此发送时延可以忽略不计,而接收端每一次收完一批分组后就立即发送确认ACK分组。
(1)经过多少个RTT后,发送窗口大小达到1MB?
(2)发送端把整个10MB文件传送成功共需要多少个RTT?传送成功是指发送完整个文件,并收到所有的确认。TCP扩大的窗口够用么?
(3)根据整个文件发送成功所花费的时间(包括收到所有的确认),计算此传输链路的有效吞吐率。链路带宽的利用率是多少?
解:(1)根据拥塞算法,就是每一次接收端发出确认时,发送端口就会增加为原来的2倍。则1MB=1024KB。那么就是 2 1 0 2^10 210KB=1MB,也就是来回十次就可以了,经过10个RTT,发送窗口大小达到1MB。
(2)
(3)
36.假定TCP采用一种仅使用线性增大和乘法减小的简单拥塞控制算法,而不使用慢开始。发送窗口不采用字节为计算单位,而是使用分组pkt为计算单位。在一开始发送窗口为1pkt。假定分组的发送时延非常小,可以忽略不计。所有产生的时延就是传播时延。假定发送窗口总是小于接收窗口。接收端每收到一分组后,就立即发回确认ACK。假定分组的编号为i,在一开始发送的是i=1的分组。以后当i=9,25,30,38,50时,发生了分组的丢失。再假定分组的超时重传时间正好是下一个RTT开始的时间。试画出拥塞窗口(也就是发送窗口)与RTT的关系曲线,画到发送第51个分组为止。