第四章
4-04 试简单说明下列协议的作用:
IP,ARP,RARP和ICMP。
IP协议:实现网络互连。使参与互连的性能各异的网络从用户看起来好像是一个统一的网络。网际协议IP是TCP/IP体系中两个最主要的协议之一,与IP协议配套使用的还有四个协议。
ARP协议:是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。将 IP地址 映射到 MAC地址
RARP:是解决同一个局域网上的主机或路由器的硬件地址和IP地址的映射问题。将 MAC地址 映射到 IP地址
ICMP:提供差错报告和询问报文,以提高IP数据交付成功的机会
因特网组管理协议IGMP:用于探寻、转发本局域网内的组成员关系。
4-05 IP地址如何表示?
分为ABCDE 5类;
每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。
各类地址的网络号字段net-id分别为1,2,3,0,0字节;主机号字段host-id分别为3字节、2字节、1字节、4字节、4字节。
特点:
(1)IP 地址是一种分等级的地址结构。分两个等级的好处是:
第一,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
(2)实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口。
当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机(multihomed host)。
由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
(3) 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
(4) 所有分配到网络号 net-id 的网络,范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
4-07 试说明IP地址与MAC地址的区别。为什么要使用这两种不同的地址?
IP 地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。从而把整个因特网看成为一个单一的、抽象的网络
在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。
MAC地址在一定程度上与硬件一致,基于物理、能够标识具体的链路通信对象、IP地址给予逻辑域的划分、不受硬件限制。
4-15 一个 3200 位长的 TCP 报文传到 IP 层,加上160 位的首部后成为数据报。下面的互联网由两个局域网通过路由器连接起来,但第二个局域网所能传送的最长数据顿中的数据部分只有1200位,因此数据报在路由器必须进行分片。试问第二个局域网向其上层要传送多少比特的数据(这里的“数据”当然指的是局域网看见的数据)?
答:第二个局域网所能传送的最长数据帧中的数据部分只有1200bit,即每个IP数据片的数据部分=1200-160(bit),由于片偏移是以8字节即64bit为单位的,所以IP数据片的数据部分最大不超过1024bit,这样3200bit的报文要分4个数据片,所以第二个局域网向上传送的比特数等于(3200+4×160),共3840bit。
解决过程
1. 计算需要分片的数据报
路由器在进行分片时,会根据MTU大小进行分片。由于每个分片的IP头部是160位,而第二个局域网的最大传输单元(MTU)为1200位,所以每个分片的最大数据部分为:
[{每个分片的数据部分} = 1200 - 160 = 1040 {位} ]
2. 分片数量
数据报总长度为3360位,其中160位是IP头部,剩下的3200位是数据部分。每个分片的数据部分最大为1040位。因此,数据部分需要分成几个分片:
3200/1040= 3.077 需要分成4个分片(向上取整)
所以,总共需要4个分片。
3. 每个分片的数据量
4. 第二个局域网向上层传送的总数据
在第二个局域网传输过程中,IP头部仍然存在,且每个分片都会有一个新的IP头部(160位)。因此,第二个局域网每个分片传送的数据为:
第二个局域网总共传输的数据量为:
3 x (160 + 1040) + (160 + 80) = 3 x1200 + 240 = 3600 + 240 = 3840 {位}
答案:第二个局域网向其上层传送的总数据量是3840位。
4-18 设某路由器建立了如下转发表:
现共收到5个分组,其目的地址分别为:
(1) 128.96.39.10
(2) 128.96.40.12
(3) 128.96.40.151
(4) 192.4.153.17
(5) 192.4.153.90
试分别计算其下一跳。
(1)分组的目的站IP地址为:128.96.39.10。先与子网掩码255.255.255.128相与,得128.96.39.0,可见该分组经接口0转发。
(2)分组的目的IP地址为:128.96.40.12。
① 与子网掩码255.255.255.128相与得128.96.40.0,不等于128.96.39.0。
② 与子网掩码255.255.255.128相与得128.96.40.0,经查路由表可知,该项分组经R2转发。
(3)分组的目的IP地址为:128.96.40.151,与子网掩码255.255.255.128相与后得128.96.40.128,与子网掩码255.255.255.192相与后得128.96.40.128,经查路由表知,该分组转发选择默认路由,经R4转发。
(4)分组的目的IP地址为:192.4.153.17。与子网掩码255.255.255.128相与后得192.4.153.0。与子网掩码255.255.255.192相与后得192.4.153.0,经查路由表知,该分组经R3转发。
(5)分组的目的IP地址为:192.4.153.90,与子网掩码255.255.255.128相与后得192.4.153.0。与子网掩码255.255.255.192相与后得192.4.153.64,经查路由表知,该分组转发选择默认路由,经R4转发。
注:(5)选择将目的主机IP地址与第3行的子网掩码进行按位与运算,得到的结果和第三行比较不符合
4-19 某单位分配到一个地址块129.250/16。该单位有4000台机器,平均分布在16个不同的地点。试给每一个地点分配一个地址块,并算出每个地址块中 IP 地址的最小值和最大值。
4000/16=250,平均每个地点250台机器。如选255.255.255.0为掩码,则每个网络所连主机数=2^8-2=254>250,共有子网数=2^8-2=254>16,能满足实际需求。
可给每个地点分配如下子网号码
地点: 子网号(subnet-id) 子网网络号 主机IP的最小值和最大值
1: 00000001 129.250.1.0 129.250.1.1---129.250.1.254
2: 00000010 129.250.2.0 129.250.2.1---129.250.2.254
3: 00000011 129.250.3.0 129.250.3.1---129.250.3.254
4: 00000100 129.250.4.0 129.250.4.1---129.250.4.254
5: 00000101 129.250.5.0 129.250.5.1---129.250.5.254
6: 00000110 129.250.6.0 129.250.6.1---129.250.6.254
7: 00000111 129.250.7.0 129.250.7.1---129.250.7.254
8: 00001000 129.250.8.0 129.250.8.1---129.250.8.254
9: 00001001 129.250.9.0 129.250.9.1---129.250.9.254
10: 00001010 129.250.10.0 129.250.10.1---129.250.10.254
11: 00001011 129.250.11.0 129.250.11.1---129.250.11.254
12: 00001100 129.250.12.0 129.250.12.1---129.250.12.254
13: 00001101 129.250.13.0 129.250.13.1---129.250.13.254
14: 00001110 129.250.14.0 129.250.14.1---129.250.14.254
15: 00001111 129.250.15.0 129.250.15.1---129.250.15.254
16: 00010000 129.250.16.0 129.250.16.1---129.250.16.254
注释:IP地址共有32位
4-20 一个数据报长度为 4000字节(固定首部长度)。现在经过一个网络传送,但此网络能够传送的最大数据长度为1500 字节。试问应当划分为几个短些的数据报片?各数据报片的数据字段长度、片偏移字段和MF 标志应为何数值?
IP数据报固定首部长度为20字节
总长度(字节) | 数据长度(字节) | MF | 片偏移 | |
原始数据报 | 4000 | 3980 | 0 | 0 |
数据报片1 | 1500 | 1480 | 1 | 0 |
数据报片2 | 1500 | 1480 | 1 | 185 |
数据报片3 | 1040 | 1020 | 0 | 370 |
好的,我们来一起分析如何将一个 4000 字节的数据报(固定首部长度)在最大传输单元 (MTU) 为 1500 字节的网络中进行分片。
1. 计算每个分片的数据字段长度:
- 因为是固定首部长度,我们假设 IP 首部长度为 20 字节。
- 每个分片的最大数据字段长度 = MTU - IP 首部长度 = 1500 - 20 = 1480 字节。
2. 计算需要划分的片数:
- 总数据长度 = 4000 - 20 (原始数据报首部) = 3980 字节。
- 所需片数 = ⌈总数据长度 / 每个分片的最大数据字段长度⌉ = ⌈3980 / 1480⌉ = ⌈2.69⌉ = 3 片。(⌈x⌉ 表示向上取整)
3. 计算每个分片的数据字段长度、片偏移和 MF 标志:
- 第 1 片:
- 数据字段长度:1480 字节
- 片偏移:0 (第一个分片偏移为 0)
- MF 标志:1 (后面还有分片)
- 第 2 片:
- 数据字段长度:1480 字节
- 片偏移:1480 / 8 = 185 (偏移量以 8 字节为单位)
- MF 标志:1 (后面还有分片)
- 第 3 片:
- 数据字段长度:3980 - 1480 - 1480 = 1020 字节
- 片偏移:(1480 + 1480) / 8 = 370
- MF 标志:0 (这是最后一个分片)
总结如下表:
片序号 | 数据字段长度(字节) | 片偏移 | MF 标志 |
---|---|---|---|
1 | 1480 | 0 | 1 |
2 | 1480 | 185 | 1 |
3 | 1020 | 370 | 0 |
关键概念解释:
- MTU (Maximum Transmission Unit): 最大传输单元,指网络一次能够传输的最大数据包大小。
- 片偏移 (Fragment Offset): 指当前分片的数据在原始数据报中的偏移量,以 8 字节为单位。用于在接收端重组分片。
- MF (More Fragments): 更多分片标志。MF=1 表示后面还有分片,MF=0 表示这是最后一个分片。
4-22 有如下的4个/24地址块,试进行最大可能的聚合。
212.56.132.0/24
212.56.133.0/24
212.56.134.0/24
212.56.135.0/24
212=(11010100)2,56=(00111000)2
132=(10000100)2,
133=(10000101)2
134=(10000110)2,
135=(10000111)2
所以共同的前缀有22位,即11010100 00111000 100001,聚合的CIDR地址块是:212.56.132.0/22
要进行最大可能的聚合,我们需要找到这些地址块中共同的最长前缀。我们把这些地址转换成二进制形式,然后进行比较:
- 212.56.132.0/24:
11010100.00111000.10000100.00000000
- 212.56.133.0/24:
11010100.00111000.10000101.00000000
- 212.56.134.0/24:
11010100.00111000.10000110.00000000
- 212.56.135.0/24:
11010100.00111000.10000111.00000000
观察以上二进制形式,我们可以发现前 22 位是完全相同的:11010100.00111000.100001
。
因此,这四个 /24 地址块可以聚合为一个 /22 的地址块:212.56.132.0/22。
解释:
- /24 表示前 24 位是网络地址,后 8 位是主机地址。
- /22 表示前 22 位是网络地址,后 10 位是主机地址。
通过将四个 /24 聚合为一个 /22,我们有效地减少了路由表中的条目数量,提高了路由效率。因为一个 /22 的地址块包含了 2^(32-22) = 2^10 = 1024 个地址,而四个 /24 的地址块总共包含 4 * 2^(32-24) = 4 * 2^8 = 4 * 256 = 1024 个地址。所以聚合前后地址数量没有变化,只是表示方法更简洁了。
总结:
这四个 /24 地址块 212.56.132.0/24、212.56.133.0/24、212.56.134.0/24 和 212.56.135.0/24 可以聚合为 212.56.132.0/22。
4-27 以下地址中的哪一个和86.32/12 匹配?请说明理由。
(1)86.33.224.123; (2) 86.79.65.216; (3) 86.58.119.74; (4) 86.68.206.154。
86.32/12 86.00100000 下划线上为12位前缀说明第二字节的前4位在前缀中。
给出的四个地址的第二字节的前4位分别为:0010 ,0100 ,0011和0100。因此只有(1)是匹配的。
要判断哪个地址与 86.32/12 匹配,我们需要将给定的地址和选项都转换成二进制形式,并比较它们的前 12 位是否相同。
1. 将 86.32/12 转换为二进制:
- 86 的二进制:
01010110
- 32 的二进制:
00100000
所以 86.32/12 的前 12 位二进制为:01010110 0010
2. 将选项中的地址转换为二进制,并比较前 12 位:
- (1) 86.33.224.123
- 86:
01010110
- 33:
00100001
- 前 12 位:
01010110 0010
- 86:
- (2) 86.79.65.216
- 86:
01010110
- 79:
01001111
- 前 12 位:
01010110 0100
- 86:
- (3) 86.58.119.74
- 86:
01010110
- 58:
00111010
- 前 12 位:
01010110 0011
- 86:
- (4) 86.68.206.154
- 86:
01010110
- 68:
01000100
- 前 12 位:
01010110 0100
- 86:
3. 比较结果:
只有选项 (1) 86.33.224.123 的前 12 位二进制 (01010110 0010
) 与 86.32/12 的前 12 位二进制 (01010110 0010
) 相同。
结论:
因此,地址 (1) 86.33.224.123 与 86.32/12 匹配。
补充说明:
/12 表示网络地址的前 12 位是固定的,其余 20 位是主机地址。这意味着该网络包含 2^20 个 IP 地址。在这个范围内,只要前 12 位与 86.32/12 相同,就都属于同一个网络。虽然 32 和 33 的十进制数值不同,但它们的前 12 位二进制是相同的,所以 86.33.x.x 也在 86.32/12 这个网络范围内。
用更直观的方式理解:86.32/12 对应的地址范围是 86.32.0.0 到 86.47.255.255。因为 33 在 32 到 47 之间,所以 86.33.224.123 属于这个范围。
4-33 某单位分配到一个地址块 136.23.12.64/26。现在需要进一步划分为 4 个一样大的子网。试问:
(1)每个子网的网络前缀有多长?
(2)每一个子网中有多少个地址?
(3)每一个子网的地址块是什么?
(4)每一个子网可分配给主机使用的最小地址和最大地址是什么?
(1)每个子网前缀28位。
(2)每个子网的地址中有4位留给主机用,因此共有16个地址。
(3)四个子网的地址块是:
第一个地址块136.23.12.64/28,可分配给主机使用的
最小地址:136.23.12.01000001=136.23.12.65/28
最大地址:136.23.12.01001110=136.23.12.78/28
第二个地址块136.23.12.80/28,可分配给主机使用的
最小地址:136.23.12.01010001=136.23.12.81/28
最大地址:136.23.12.01011110=136.23.12.94/28
第三个地址块136.23.12.96/28,可分配给主机使用的
最小地址:136.23.12.01100001=136.23.12.97/28
最大地址:136.23.12.01101110=136.23.12.110/28
第四个地址块136.23.12.112/28,可分配给主机使用的
最小地址:136.23.12.01110001=136.23.12.113/28
最大地址:136.23.12.01111110=136.23.12.126/28
好的,我们来一步一步解答这个问题。
1. 理解原始地址块:
136.23.12.64/26 表示:
- 网络地址:136.23.12.64
- 子网掩码:26 位,即前 26 位是网络地址,后 6 位是主机地址。
2. 划分成 4 个子网:
要划分成 4 个子网,我们需要借用 2 位主机位(因为 2^2 = 4)。这意味着子网掩码要增加 2 位。
(1) 每个子网的网络前缀有多长?
原始网络前缀是 26 位,增加 2 位后,每个子网的网络前缀变为 28 位。
(2) 每一个子网中有多少个地址?
子网掩码变为 28 位后,剩余的主机位为 32 - 28 = 4 位。因此,每个子网中有 2^4 = 16 个地址。
(3) 每一个子网的地址块是什么?
我们先将原始网络地址 136.23.12.64 转换为二进制:
10001000.00010111.00001100.01000000
前 26 位是网络部分:10001000.00010111.00001100.01
现在我们需要使用接下来的两位来区分 4 个子网,也就是第 27 和 28 位。它们的变化情况如下:
- 子网 1:
10001000.00010111.00001100.01000000
(第27、28位为00) --> 136.23.12.64/28 - 子网 2:
10001000.00010111.00001100.01010000
(第27、28位为01) --> 136.23.12.80/28 - 子网 3:
10001000.00010111.00001100.01100000
(第27、28位为10) --> 136.23.12.96/28 - 子网 4:
10001000.00010111.00001100.01110000
(第27、28位为11) --> 136.23.12.112/28
(4) 每一个子网可分配给主机使用的最小地址和最大地址是什么?
每个子网有 16 个地址,其中第一个地址是网络地址,最后一个地址是广播地址,中间的 14 个地址可以分配给主机使用。
- 子网 1 (136.23.12.64/28):
- 最小可用地址:136.23.12.65
- 最大可用地址:136.23.12.78
- 子网 2 (136.23.12.80/28):
- 最小可用地址:136.23.12.81
- 最大可用地址:136.23.12.94
- 子网 3 (136.23.12.96/28):
- 最小可用地址:136.23.12.97
- 最大可用地址:136.23.12.110
- 子网 4 (136.23.12.112/28):
- 最小可用地址:136.23.12.113
- 最大可用地址:136.23.12.126
总结:
子网 | 地址块 | 网络前缀 | 地址数 | 最小可用地址 | 最大可用地址 |
---|---|---|---|---|---|
1 | 136.23.12.64/28 | 28 | 16 | 136.23.12.65 | 136.23.12.78 |
2 | 136.23.12.80/28 | 28 | 16 | 136.23.12.81 | 136.23.12.94 |
3 | 136.23.12.96/28 | 28 | 16 | 136.23.12.97 | 136.23.12.110 |
4 | 136.23.12.112/28 | 28 | 16 | 136.23.12.113 | 136.23.12.126 |
记住,划分的关键是借用主机位来增加网络前缀,从而创建更多的子网。
4-37假定网络中的路由器B的路由表有如下的项目(这三列分别表示“目的网络”“距离”和“下一跳路由器"):
目的网络 | 距离 | 下一跳路由器 |
---|---|---|
N1 | 7 | A |
N2 | 2 | C |
N6 | 8 | F |
N8 | 4 | E |
N9 | 4 | F |
现在B收到从C发来的路由信息(这两列分别表示“目的网络”和“距离”):
目的网络 | 距离 |
---|---|
N2 | 4 |
N3 | 8 |
N6 | 4 |
N8 | 3 |
N9 | 5 |
试求出路由器B更新后的路由表(详细说明每一个步骤)。
路由器B更新后的路由表如下:
N1 7 A 无新信息,不改变
N2 5 C 相同的下一跳,更新
N3 9 C 新的项目,添加进来
N6 5 C 不同的下一跳,距离更短,更新
N8 4 E 不同的下一跳,距离一样,不改变
N9 4 F 不同的下一跳,距离更大,不改变
第五章
5-08 为什么说UDP是面向报文的,而TCP是面向字节流的?
答:发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。
发送方TCP对应用程序交下来的报文数据块,视为无结构的字节流(无边界约束,可分拆/合并),但维持各字节
5-09 端口的作用是什么?为什么端口号要划分为三种?
答:端口的作用是对TCP/IP体系的应用进程进行统一的标志,使运行不同操作系统的计算机的应用进程能够互相通信。
熟知端口,数值一般为0~1023.标记常规的服务进程;
登记端口号,数值为1024~49151,标记没有熟知端口号的非常规的服务进程;
5-13 一个 UDP用户数据报的数据字段为8192字节。在链路层要使用以太网来传送。试问应当划分为几个IP数据报片?说明每一个IP数据报片的数据字段长度和片偏移字段的值。
答:6个
数据字段的长度:前5个是1480字节,最后一个是800字节。
片偏移字段的值分别是:0,1480,2960,4440,5920和7400.
注:UDP首部固定8字节
5-22 主机A向主机B发送一个很长的文件,其长度为L字节。假定TCP使用的MSS为1460字节。
(1)在TCP的序号不重复使用的条件下,L的最大值是多少?
(2)假定使用上面计算出的文件长度,而运输层、网络层和数据链路层所用的首部开销共66字节,链路的数据率为10Mbit/s,试求这个文件所需的最短发送时间。
解:(1)L_max的最大值是2^32=4GB,G=2^30.
(2) 满载分片数Q={L_max/MSS}取整=2941758发送的总报文数
N=Q*(MSS+66)+{(L_max-Q*MSS)+66}=4489122708+682=4489123390
总字节数是N=4489123390字节,发送4489123390字节需时间为:N*8/(10*10^6)=3591.3秒,即59.85分,约1小时。
注:
转换过程:
-
Mbit/s 转换为 Byte/s:
- 10 Mbit/s 表示每秒传输 10,000,000 比特。
- 因为 1 Byte = 8 bits,所以 10,000,000 bits 等于 10,000,000 / 8 = 1,250,000 Bytes。
- 因此,10 Mbit/s = 1,250,000 Byte/s。
-
Byte/s 转换为 MB/s:
- 1,250,000 Byte/s。
- 因为 1 MB = 1,048,576 Bytes,所以 1,250,000 Bytes 大约等于 1,250,000 / 1,048,576 ≈ 1.19 MB。
- 但是,在网络速率的描述中,通常使用 1 MB = 1,000,000 Bytes 来进行近似计算,以简化表示。 所以,1,250,000 Bytes/s 近似等于 1,250,000 / 1,000,000 = 1.25 MB/s。
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)80字节。
(4)70
这个问题考察了TCP协议中序号和确认号的工作方式,这是TCP可靠传输机制的核心。我们逐个分析:
(1) 第一个报文段携带了多少字节的数据?
TCP 序号是针对字节进行编号的。第一个报文段的序号是 70,这意味着该报文段数据的第一个字节的序号是 70。第二个报文段的序号是 100,这意味着第二个报文段数据的第一个字节的序号是 100。
因此,第一个报文段携带的数据字节数为:100 - 70 = 30 字节。
(2) 主机B收到第一个报文段后发回的确认中的确认号应当是多少?
TCP 确认号(Acknowledgment Number)是期望接收的下一个字节的序号。B 收到序号为 70 的报文段,该报文段携带了 30 字节的数据,因此 B 期望接收的下一个字节的序号是 70 + 30 = 100。
所以,B 发回的确认中的确认号应当是 100。
(3) 如果B收到第二个报文段后发回的确认中的确认号是180,试问A发送的第二个报文段中的数据有多少字节?
第二个报文段的序号是 100,B 发回的确认号是 180,这意味着 B 已经成功接收了序号从 100 到 179 的所有字节。
因此,第二个报文段携带的数据字节数为:180 - 100 = 80 字节。
(4) 如果A发送的第一个报文段丢失了,但第二个报文段到达了B。B在第二个报文段到达后向A发送确认。试问这个确认号应为多少?
如果第一个报文段(序号 70)丢失,而第二个报文段(序号 100)到达了 B,这意味着 B 仍然期望接收序号为 70 的字节。即使收到了序号为 100 的报文段,B 也无法处理,因为它缺少中间的数据(序号 70 到 99 的字节)。
因此,B 发送的确认号仍然是 70。这是一种选择确认(Selective Acknowledgment)的简化情况。B 通过发送确认号 70,告诉 A:“我仍然在等待从 70 开始的数据,你发来的 100 我暂时无法处理。” 这促使 A 重传丢失的报文段。
总结:
- 序号:标识报文段中数据的第一个字节的序号。
- 确认号:期望接收的下一个字节的序号。
通过序号和确认号的配合,TCP 实现了可靠的数据传输,即使在网络中存在丢包、乱序等情况,也能保证数据的正确性和完整性。特别是第四问,很好地体现了TCP的可靠性机制,即接收方会持续请求丢失的数据,直到收到为止。
5-31 通信信道带宽为1Gbit/s,端到端传播时延为10ms.TCP的发送窗口为65535字节。试问:可能达到的最大吞吐量是多少?信道的利用率是多少?
答:
L=65536×8+40×8=524600 将发送窗口 65536 字节转换成比特,并加上了 40 字节(320 比特)的 TCP/IP 头部开销。这表示一个完整的 TCP 段的大小。
C=10^9b/s: 带宽
L/C=0.0005246s: 发送一个 TCP 段所需的时间。
Td=10×10^-3s: 端到端传播时延。
Throughput=L/(L/C+2×Td)=524600/(0.0205246+2*0.01)=25.5Mb/s: 这是根据公式计算出的吞吐量。该公式考虑了发送时间和往返传播时延。
Efficiency=(L/C)/(L/C+2×Td)=0.0255: 这是信道利用率。
最大吞吐量为25.5Mb/s。信道利用率为25.5/1000=2.55%
- 发送方发送一个 TCP 段需要 L/C 的时间。
- 发送方发送完一个 TCP 段后,需要等待接收方的确认 (ACK)。这个等待时间主要取决于往返传播时延 (2 * Td)。
- 因此,发送方发送一个 TCP 段并收到确认的总时间是 L/C + 2 * Td。
- 吞吐量是单位时间内成功传输的数据量,因此是 L / (L/C + 2 * Td)。
- 信道利用率是发送数据的时间占总时间的比例,即 (L/C) / (L/C + 2 * Td)。
5-37 在TCP的拥塞控制中,什么是慢开始、拥塞避免、快重传和快恢复算法?这里每一种算法各起什么作用?“乘法减小”和“加法增大”各用在什么情况下?
答:慢开始:
在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送端的拥塞窗口cwnd,可以分组注入到网络的速率更加合理。
拥塞避免:
当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。拥塞避免算法使发送的拥塞窗口每经过一个往返时延RTT就增加一个MSS的大小。
快重传算法规定:
发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应该立即重传丢手的报文段而不必继续等待为该报文段设置的重传计时器的超时。
快恢复算法:
当发送端收到连续三个重复的ACK时,就重新设置慢开始门限 ssthresh
与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为ssthresh
若收到的重复的AVK为n个(n>3),则将cwnd设置为ssthresh
若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。
若收到了确认新的报文段的ACK,就将cwnd缩小到ssthresh
乘法减小:
是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5。
当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数。
加法增大:
是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
5-38 设TCP的ssthresh的初始值为8(单位为报文段)。当拥塞窗口上升到12时网络发生了超时,TCP使用慢开始和拥塞避免。试分别求出RTT=1到RTT=15的各拥塞窗口大小。你能说明拥塞窗口每一次变化的原因吗?
答:拥塞窗口大小分别为:1,2,4,8,9,10,11,12,1,2,4,6,7,8,9
题目回顾
-
初始条件:
- 初始拥塞阈值(ssthresh):8 个报文段
- 拥塞窗口(cwnd)初始大小:1 个报文段(假设)
-
事件描述:
- 当 cwnd 增长到 12 个报文段时,网络发生了 超时(Timeout)。
- 超时后,TCP进入慢开始(Slow Start)和拥塞避免(Congestion Avoidance)阶段。
TCP拥塞控制概述
-
慢开始(Slow Start):
- cwnd 每经过一个RTT 翻倍增长,即 cwnd = cwnd × 2,直到 cwnd ≥ ssthresh。
-
拥塞避免(Congestion Avoidance):
- cwnd 每经过一个RTT 线性增长,即 cwnd = cwnd + 1,当 cwnd ≥ ssthresh 时。
-
超时处理:
- 当发生超时时:
- ssthresh 设置为发生超时时的 cwnd 一半,即 ssthresh = cwnd / 2。
- cwnd 重置为 1 个报文段,进入 慢开始 阶段。
- 当发生超时时:
详细拥塞窗口变化表
下面是 RTT=1 到 RTT=15 的拥塞窗口变化表,包含每一步骤的原因说明。
RTT 序号 | 拥塞窗口大小 (cwnd) | 阶段 | 变化原因说明 |
---|---|---|---|
RTT 1 | 1 | 慢开始(Slow Start) | 初始 cwnd 为 1,进入慢开始阶段。每RTT 翻倍增长。 |
RTT 2 | 2 | 慢开始(Slow Start) | cwnd 从 1 增长到 2(1 × 2 = 2)。 |
RTT 3 | 4 | 慢开始(Slow Start) | cwnd 从 2 增长到 4(2 × 2 = 4)。 |
RTT 4 | 8 | 慢开始(Slow Start) | cwnd 从 4 增长到 8(4 × 2 = 8)。此时达到 ssthresh=8,即将进入拥塞避免阶段。 |
RTT 5 | 9 | 拥塞避免(Congestion Avoidance) | cwnd 从 8 增长到 9(8 + 1 = 9)。进入线性增长阶段。 |
RTT 6 | 10 | 拥塞避免(Congestion Avoidance) | cwnd 从 9 增长到 10(9 + 1 = 10)。 |
RTT 7 | 11 | 拥塞避免(Congestion Avoidance) | cwnd 从 10 增长到 11(10 + 1 = 11)。 |
RTT 8 | 12 | 拥塞避免(Congestion Avoidance) | cwnd 从 11 增长到 12(11 + 1 = 12)。超时发生,需要调整。 |
RTT 9 | 1 | 慢开始(Slow Start) | 超时后,ssthresh 被设置为 12 / 2 = 6,cwnd 重置为 1,重新进入慢开始阶段。 |
RTT 10 | 2 | 慢开始(Slow Start) | cwnd 从 1 增长到 2(1 × 2 = 2)。 |
RTT 11 | 4 | 慢开始(Slow Start) | cwnd 从 2 增长到 4(2 × 2 = 4)。 |
RTT 12 | 6 | 慢开始(Slow Start) | cwnd 从 4 增长到 6(4 × 2 = 8),但由于 ssthresh=6,cwnd 增长至 6,然后转入拥塞避免阶段。 |
RTT 13 | 7 | 拥塞避免(Congestion Avoidance) | cwnd 从 6 增长到 7(6 + 1 = 7)。进入线性增长阶段。 |
RTT 14 | 8 | 拥塞避免(Congestion Avoidance) | cwnd 从 7 增长到 8(7 + 1 = 8)。 |
RTT 15 | 9 | 拥塞避免(Congestion Avoidance) | cwnd 从 8 增长到 9(8 + 1 = 9)。 |
详细变化原因解释
-
RTT 1 到 RTT 4:
- 阶段:慢开始
- 原因:在慢开始阶段,cwnd 每个RTT 翻倍增长,以快速发现网络的可用带宽。
-
RTT 5 到 RTT 8:
- 阶段:拥塞避免
- 原因:当 cwnd 达到 ssthresh=8 时,TCP 切换到拥塞避免阶段,采用线性增长策略以避免网络拥塞。
- RTT 8:cwnd 增长到 12 时发生超时,表明网络发生了拥塞,需进行调整。
-
RTT 9 到 RTT 10:
- 阶段:慢开始
- 原因:超时后,ssthresh 被设置为发生超时时的 cwnd 一半,即 6,cwnd 重置为 1,重新进入慢开始阶段。
-
RTT 11 到 RTT 15:
- 阶段:慢开始过渡到拥塞避免
- 原因:在慢开始阶段,cwnd 继续翻倍,直到达到新的 ssthresh=6。一旦达到 ssthresh,进入拥塞避免阶段,采用线性增长策略。
总结
- 最大拥塞窗口:在 RTT 8 时达到 12,此时发生超时。
- 拥塞窗口变化特点:
- 慢开始 阶段实现快速增长,以迅速利用可用带宽。
- 拥塞避免 阶段实现稳定的线性增长,以防止网络拥塞。
- 超时 事件触发调整策略,重新设定 ssthresh 并重置 cwnd,确保网络稳定性。
通过上述步骤,TCP 能够动态调整数据传输速率,以适应网络当前的拥塞状况,确保数据传输的高效与可靠。
这个问题考察的是对UDP首部格式的理解和解析能力。UDP首部共8个字节,包含以下字段(每个字段2个字节):
- 源端口号
- 目的端口号
- 长度(UDP数据报的总长度,包括首部和数据)
- 检验和
我们来逐个分析你提供的十六进制UDP首部:CB84000D001C001C
(1) 源端口号:
- 前两个字节
CB84
是源端口号的十六进制表示。 - 将其转换为十进制:CB (12 * 16 + 11 = 203) 和 84 (8 * 16 + 4 = 132),合起来是 203 * 256 + 132 = 52100。
(2) 目的端口号:
- 接下来的两个字节
000D
是目的端口号的十六进制表示。 - 将其转换为十进制:00 (0) 和 0D (13),合起来是 0 * 256 + 13 = 13。
(3) 用户数据报的总长度:
- 接下来的两个字节
001C
是用户数据报的总长度的十六进制表示。 - 将其转换为十进制:00 (0) 和 1C (1 * 16 + 12 = 28),合起来是 0 * 256 + 28 = 28 字节。
(4) 数据长度:
- 用户数据报的总长度包括首部和数据两部分。UDP首部固定为 8 个字节。
- 因此,数据长度 = 总长度 - 首部长度 = 28 - 8 = 20 字节。
(⑤) 分组方向:
- 目的端口号为 13,这是一个熟知端口号,通常可以推断出该分组是客户端到服务器方向的请求。因为客户端需要连接服务器提供的服务。
(6) 客户进程:
-
判断UDP分组方向的主要依据:
在没有明确说明的情况下,判断UDP分组方向的主要依据是端口号。
-
熟知端口(Well-known Ports): 范围是 0 到 1023。这些端口号分配给一些常见的网络服务,例如:
- 7:Echo
- 13:Daytime
- 20/21:FTP
- 23:Telnet
- 25:SMTP
- 53:DNS
- 80:HTTP
如果目的端口号是熟知端口,通常可以推断出该分组是客户端到服务器方向的请求。因为客户端需要连接服务器提供的服务。
-
注册端口(Registered Ports): 范围是 1024 到 49151。这些端口号由IANA(互联网号码分配机构)注册,分配给特定的应用程序。
-
动态/私有端口(Dynamic/Private Ports): 范围是 49152 到 65535。这些端口号由客户端程序在需要时动态分配,也称为短暂端口(Ephemeral Ports)。
总结:
- (1) 源端口号:52100
- (2) 目的端口号:13
- (3) 用户数据报总长度:28 字节
- (4) 数据长度:20 字节
- (⑤) 分组方向:客户到服务器方向
- (6) 客户进程:Daytime
5-74 流量控制和拥塞控制的最主要的区别是什么?发送窗口的大小取决于流量控制还是拥塞控制?
流量控制和拥塞控制是TCP协议中两个重要的机制,它们的目标都是为了提高网络传输的效率和可靠性,但它们关注的层面和解决的问题有所不同。
最主要的区别:
-
流量控制(Flow Control): 解决的是发送方发送速度过快导致接收方来不及处理的问题,是端到端的控制,作用于发送方和接收方之间。它通过接收方告知发送方自己的接收能力(接收窗口rwnd),限制发送方的发送速率,防止接收方因缓冲区溢出而丢包。
-
拥塞控制(Congestion Control): 解决的是网络拥塞导致丢包的问题,是全局性的控制,涉及网络中的所有主机、路由器以及其他影响网络传输性能的因素。它通过发送方根据网络状况(例如丢包、延迟等)动态调整发送速率,避免网络过载。
用一个比喻来说明:
- 流量控制就像一个水龙头和水桶。水龙头(发送方)的出水量需要根据水桶(接收方)的大小来调节,防止水桶溢出。
- 拥塞控制就像多条水管同时向一个排水管道排水。需要根据排水管道的容量来调节每条水管的出水量,防止排水管道堵塞。
发送窗口的大小取决于流量控制还是拥塞控制?
发送窗口的实际大小同时取决于流量控制和拥塞控制,取两者中的最小值。
- 拥塞窗口(cwnd): 由发送方维护,根据网络拥塞情况动态调整。
- 接收窗口(rwnd): 由接收方维护,告知发送方自己的接收能力。
发送方实际的发送窗口(Effective Window)大小计算公式为:
Effective Window = min(cwnd, rwnd)
也就是说,即使接收方有足够的缓冲区(rwnd很大),如果网络发生拥塞(cwnd很小),发送方也会限制自己的发送速率。反之,即使网络状况良好(cwnd很大),如果接收方处理能力有限(rwnd很小),发送方也会受到接收方的限制。
总结:
特性 | 流量控制 | 拥塞控制 |
---|---|---|
目标 | 防止接收方缓冲区溢出 | 防止网络拥塞 |
作用范围 | 端到端(发送方和接收方之间) | 全局性(涉及网络中的所有主机和路由器) |
控制机制 | 接收方通过rwnd告知发送方接收能力 | 发送方根据网络状况(丢包、延迟等)动态调整cwnd |
窗口 | 接收窗口(rwnd) | 拥塞窗口(cwnd) |
决定发送窗口 | 与拥塞窗口共同决定,取最小值:min(cwnd, rwnd) | 与接收窗口共同决定,取最小值:min(cwnd, rwnd) |
关注点 | 接收方处理能力 | 网络整体状况 |