文章目录
IP 数据报的格式如下:
| 首部(发送在前) | 数据部分 |
|---|---|
| 固定部分(20B)+ 可变部分 | 数据信息 |
IP 数据报首部的格式如下:

IP 首部的字段含义如下:
| 首部长度字段 | 首部长度 |
|---|---|
| 5 | 20B |
| 6 | 24B |
| 7 | 28B |
| … | … |
| 14 | 56B |
| 15 | 60B |
| 0/1 | 无意义(MSB) | DF(Don’t Fragment) | MF(More Fragment)(LSB) |
|---|---|---|---|
| 0 | - | 不能分片 | 若干数据片中的最后一个 |
| 1 | - | 可以分片 | 后面还有数据片 |
| 协议名 | ICMP | TCP | UDP |
|---|---|---|---|
| 协议字段值 | 1 | 6 | 17 |
【例 1】原始数据报的总长度为 4000B(首部 20B,数据部分 3980B),标识号为 12345,需要转发到一条 MTU = 1500B 的以太网链路上,则 IP 分片为:
| 数据片报 | 位于原始数据报数据部分的位置 | 数据部分长度 | 总长度 | 标识 | MF | DF | 片偏移 |
|---|---|---|---|---|---|---|---|
| 数据报片 1 | 0B ~ 1479B | 1500B - 20B = 1480B | 1500B | 12345 | 1 | 0 | 0 |
| 数据报片 2 | 1480B ~ 2959B | 2960B - 1480B = 1480B | 1500B | 12345 | 1 | 0 | 1480 / 8 = 185 |
| 数据报片 3 | 2960B ~ 3980B | 3980B - 2960B = 1020B | 1040B | 12345 | 0 | 0 | 2960 / 8 = 370 |
【例 2】原始数据报的总长度为 3820B(首部 20B,数据部分 3800B),标识号为 777,需要转发到一条 MTU = 1420B 的链路上,则 IP 分片为:
| 数据片报 | 位于原始数据报数据部分的位置 | 数据部分长度 | 总长度 | 标识 | MF | DF | 片偏移 |
|---|---|---|---|---|---|---|---|
| 数据报片 1 | 0B ~ 1399B | 1420B - 20B = 1400B | 1420B | 777 | 1 | 0 | 0 |
| 数据报片 2 | 1400B ~ 2799B | 2800B - 1400B = 1400B | 1420B | 777 | 1 | 0 | 1400 / 8 = 175 |
| 数据报片 3 | 2800B ~ 3800B | 3800B - 2800B = 1000B | 1020B | 777 | 0 | 0 | 2800 / 8 = 350 |
【例 3】若路由器向 MTU = 800B 的链路转发一个总长度为 1580B 的 IP 数据报(首部长度为 20B)时,进行了分片,且每个分片尽可能大,则第 2 个分片的总长度字段和 MF 标志位的值分别是( )
A. 796, 0
B. 796, 1
C. 800, 0
D. 800, 1
【解】数据部分大小 = 1580B-20B = 1560B,则每个分片的情况:
| 分片 | 首部 | 数据部分 | MF |
|---|---|---|---|
| 1 | 20B | 780B | 1 |
| 2 | 20B | 780B | 0 |
但是!数据部分的长度必须能被 8 整除,780 不能被 8 整除,所以要将 780 改成最大能被 8 整除的数即 776!
| 分片 | 首部 | 数据部分 | MF |
|---|---|---|---|
| 1 | 20B | 776B | 1 |
| 2 | 20B | 776B | 1 |
| 3 | 20B | 8B | 0 |
答案选 B。
IP 地址指明了连接到某个网络上的一个主机或路由器。
IP 地址 ::= {<网络号>, <主机号>}【例】
128.14.35.72在计算机中表示为10000000.00001110.00100011.00000111。
| 0b~7b | 8b~32b |
|---|---|
| 0 网络号 | 主机号 |
| 0b~15b | 16b~32b |
|---|---|
| 10 网络号 | 主机号 |
| 0b~23b | 24b~32b |
|---|---|
| 110 网络号 | 主机号 |
| 0b~32b |
|---|
| 1110 多播地址 |
| 0b~32b |
|---|
| 1111 保留为今后使用 |
(需记忆)有些 IP 地址用作特殊用途,不用做 IP 地址(-1 表示所有位上都是 1):
| 网络号 | 主机号 | 作为源地址 | 作为目的地址 | 例子 | 用途 |
|---|---|---|---|---|---|
| 0 | 0 | √ | x | 0.0.0.0 | 本网络上的本主机 |
| -1 | -1 | x | √ | 255.255.255.255 | 只在本网络上进行广播 |
| net-id | -1 | x | √ | 202.98.174.255 | 对网络号为 net-id 的所有主机进行广播 |
| 0 | host-id | √ | x | 0.0.0.250 | 在本网络上主机号为 host-id 的主机 |
| 127 | 非 0 且非 -1 | √ | √ | 127.0.0.1 | 用于本地软件环回测试 |
(需记忆)A 类、B 类、C 类地址的使用范围:
| 网络类别 | 最大可用网络数 | 每个网络中最大可用主机数 | 可用的网络号 |
|---|---|---|---|
| A | 27-2(减去 0 和 -1 的情况) | 224-2(减去 0 和 -1 的情况) | 1 ~ 126 |
| B | 214 | 216-2(减去 0 和 -1 的情况) | 128.0 ~ 191.255 |
| C | 221 | 28-2(减去 0 和 -1 的情况) | 192.0.0 ~ 223.255.255 |
IP 地址 ::= {<网络前缀>, <主机号>}IP 地址/网络前缀所占位数【例】
128.14.35.72/20,前 20 位是网络前缀:1000 0000. 0000 1110. 0010 0011. 0000 0111该地址块可表示为:
1000 0000. 0000 1110. 0010*或128.14.32/20若不需要指明网络地址时,可表示为:
/20地址块该地址块的最小地址:
1000 0000. 0000 1110. 0010 0000. 0000 0000,即128.14.32.0该地址块的最大地址:
1000 0000. 0000 1110. 0010 1111. 1111 1111,即128.14.47.255该地址块能分配的最大可用主机数 = 212-2
| 网络前缀 | 记法 | 用途 | 说明 |
|---|---|---|---|
| 32b | a.b.c.d/32 | 没有主机号,用于主机路由 | 对特定目的主机的 IP 地址专门指明一个路由,方便管理人员控制和测试网络 |
| 31b | a.b.c.d/31 | 只有两个主机号 0 和 1,用于点对点链路 | |
| 0b | a.b.c.d/0 | 用于默认路由 | 不管分组的目的地址在哪里,都由指定的路由器 R 来处理 |
| 网络类别 | 地址掩码 |
|---|---|
| A 类 | 255.0.0.0 |
| B 类 | 255.255.0.0 |
| C 类 | 255.255.255.0 |
| 二进制 | 十进制 |
|---|---|
| 1000 0000 | 128 |
| 1100 0000 | 192 |
| 1110 0000 | 224 |
| 1111 0000 | 240 |
| 1111 1000 | 248 |
| 1111 1100 | 252 |
| 1111 1110 | 254 |
| 1111 1111 | 255 |
【例】
128.14.35.72/20,则/20地址块的子网掩码:1111 1111. 1111 1111. 1111 0000. 0000 0000与
128.14.35.72进行按位与运算,得到网络前缀(网络地址):
| 十进制 IP 地址 | 128 | 14 | 35 | 72 |
|---|---|---|---|---|
| 二进制 IP 地址 | 1000 0000 | 0000 1110 | 0010 0011 | 0000 0111 |
| 二进制子网掩码 | 1111 1111 | 1111 1111 | 1111 0000 | 0000 0000 |
| 按位与运算结果 | 1000 0000 | 0000 1110 | 0010 0000 | 0000 0000 |
| 十进制网络地址 | 128 | 14 | 32 | 0 |
/27比地址块/30大。【例】某路由表中有转发接口相同的 4 条路由表项,其目的网络地址分别为 35.230.32.0/21, 35.230.40.0/21, 35.230.48.0/21 和 35.230.56.0/21,将该 4 条路由聚合后的目的网络地址为( )
A. 35.230.0.0/19
B. 35.230.0.0/20
C. 35.230.32.0/19
D. 35.230.32.0/20
【解】先将四个地址化为二进制,再找出公共前缀,即可得知选 C,如下表所示。
| 地址 | 8b | 8b | 8b | 8b |
|---|---|---|---|---|
| 地址 1 | 35 | 230 | 0010 0000 | 0 |
| 地址 2 | 35 | 230 | 0010 1000 | 0 |
| 地址 3 | 35 | 230 | 0011 0000 | 0 |
| 地址 4 | 35 | 230 | 0011 1000 | 0 |
IP 地址 ::= {<网络号>, <子网号>, <主机号>}【注】子网掩码和地址掩码其实是同一个概念,只不过指示的内容不同。
【例 1】假设申请到的 C 类网络为218.75.230.0,使用定长的子网掩码划分子网来满足需求:网络 1 需要 IP 地址数量为 9,网络 2 需要 IP 地址数量为 28,网络 3 需要 IP 地址数量为 15,网络 4 需要 IP 地址数量为 13,网络 5 需要 IP 地址数量为 4。
【解】因为有 5 个子网,因此可以从主机号借来 3 个比特作为子网号使用,则子网掩码为:11111111.11111111.11111111.1110000 --> 255.255.255.224
该 C 类网的格式如下表所示,子网号一共 3 个比特,可划分 8 个子网;主机号一共 5 个比特,说明每个子网可供 32 个主机使用:
| 网络号 | 子网号 | 主机号 |
|---|---|---|
| 218.75.230. | 000 | 00000 |
| 218.75.230. | 000 | 00001 |
| … | … | … |
| 218.75.230. | 000 | 11110 |
| 218.75.230. | 000 | 11111 |
| 218.75.230. | 001 | 00000 |
| … | … | … |
| 218.75.230. | 111 | 11110 |
| 218.75.230. | 111 | 11111 |
所以一共划分为 8 个子网,可供上述 5 个子网选择使用:
| 子网 | 网络地址 | 该子网的可分配地址 | 广播地址 |
|---|---|---|---|
| 1 | 218.75.230.0 | 218.75.230.1 ~ 218.75.230.30 | 218.75.230.31 |
| 2 | 218.75.230.32 | 218.75.230.33 ~ 218.75.230.62 | 218.75.230.63 |
| 3 | 218.75.230.64 | 218.75.230.65 ~ 218.75.230.94 | 218.75.230.95 |
| 4 | 218.75.230.96 | 218.75.230.97 ~ 218.75.230.126 | 218.75.230.127 |
| 5 | 218.75.230.128 | 218.75.230.129 ~ 218.75.230.158 | 218.75.230.159 |
| 6 | 218.75.230.160 | 218.75.230.161 ~ 218.75.230.190 | 218.75.230.191 |
| 7 | 218.75.230.192 | 218.75.230.193 ~ 218.75.230.222 | 218.75.230.223 |
| 8 | 218.75.230.224 | 218.75.230.225 ~ 218.75.230.254 | 218.75.230.255 |
【例 2】假设地址块为 192.168.252.0/24,使用定长的子网掩码划分子网来满足需求:网络 1 需要 IP 地址数量为 63,网络 2 需要 IP 地址数量为 23,网络 3 需要 IP 地址数量为 13,网络 4 需要 IP 地址数量为 4。
【解】因为有 4 个子网,因此可以从主机号借来 2 个比特作为子网号使用,则子网掩码为:11111111.11111111.11111111.11000000 --> 255.255.255.192
该地址块的格式如下表所示,子网号一共 2 个比特,可划分 4 个子网;主机号一共 6 个比特,说明每个子网可供 64 个主机使用:
| 网络号 | 子网号 | 主机号 |
|---|---|---|
| 218.75.230. | 00 | 000000 |
| 218.75.230. | 00 | 000001 |
| … | … | … |
| 218.75.230. | 00 | 111110 |
| 218.75.230. | 00 | 111111 |
| 218.75.230. | 01 | 000000 |
| … | … | … |
| 218.75.230. | 11 | 111110 |
| 218.75.230. | 11 | 111111 |
所以一共划分为 4 个子网,可供上述 4 个子网选择使用:
| 子网 | 网络地址 | 该子网的可分配地址 | 广播地址 |
|---|---|---|---|
| 1 | 218.75.230.0 | 218.75.230.1 ~ 218.75.230.62 | 218.75.230.63 |
| 2 | 218.75.230.64 | 218.75.230.65 ~ 218.75.230.126 | 218.75.230.127 |
| 3 | 218.75.230.128 | 218.75.230.129 ~ 218.75.230.190 | 218.75.230.191 |
| 4 | 218.75.230.192 | 218.75.230.193 ~ 218.75.230.254 | 218.75.230.255 |
【例 1】假设申请到的地址块为218.75.230.0/24,使用变长的子网掩码划分子网来满足需求:网络 1 需要 IP 地址数量为 9,网络 2 需要 IP 地址数量为 28,网络 3 需要 IP 地址数量为 15,网络 4 需要 IP 地址数量为 13,网络 5 需要 IP 地址数量为 4。
【解】各网络的情况如下表所示:
| 网络序号 | 需要 IP 地址数量 | 主机号位数 | 网络前缀位数 | 地址块 | 可使用的地址数量 |
|---|---|---|---|---|---|
| 1 | 9 | 4 (24=16) | 32-4=28 | /28 | 16 |
| 2 | 28 | 5 (25=32) | 32-5=27 | /27 | 32 |
| 3 | 15 | 4 (24=16) | 32-4=28 | /28 | 16 |
| 4 | 13 | 4 (24=16) | 32-4=28 | /28 | 16 |
| 5 | 4 | 2 (22=4) | 32-2=30 | /30 | 4 |
从地址块 218.75.230.0/24 中取出 5 个地址块(/30,/28,/28,/28,/27):
| IP 地址 | 用途 |
|---|---|
| 218.75.230.0 ~ 218.75.230.31 | 供网络 2 使用,拥有 32 个地址,主机号为 0 |
| 218.75.230.32 ~ 218.75.230.47 | 供网络 1 使用,拥有 16 个地址,主机号为 32 |
| 218.75.230.48 ~ 218.75.230.63 | 供网络 3 使用,拥有 16 个地址,主机号为 48 |
| 218.75.230.64 ~ 218.75.230.79 | 供网络 4 使用,拥有 16 个地址,主机号为 64 |
| 218.75.230.80 ~ 218.75.230.83 | 供网络 5 使用,拥有 4 个地址,主机号为 80 |
| 218.75.230.84 ~ 218.75.230.255 | 剩余待分配 |
【例 2】假设地址块为 192.168.252.0/24,使用变长的子网掩码划分子网来满足需求:网络 1 需要 IP 地址数量为 63,网络 2 需要 IP 地址数量为 23,网络 3 需要 IP 地址数量为 13,网络 4 需要 IP 地址数量为 4。
【解】各网络的情况如下表所示:
| 网络序号 | 需要 IP 地址数量 | 主机号位数 | 网络前缀位数 | 地址块 | 可使用的地址数量 |
|---|---|---|---|---|---|
| 1 | 63 | 6 (26=64) | 32-6=26 | /26 | 64 |
| 2 | 23 | 5 (25=32) | 32-5=27 | /27 | 32 |
| 3 | 13 | 4 (24=16) | 32-4=28 | /28 | 16 |
| 4 | 4 | 2 (22=4) | 32-2=30 | /30 | 4 |
从地址块 192.168.252.0/24 中取出 5 个地址块(/30,/28,/27,/26):
| IP 地址 | 用途 |
|---|---|
| 192.168.252.0 ~ 192.168.252.63 | 供网络 1 使用,拥有 64 个地址,主机号为 0 |
| 192.168.252.64 ~ 192.168.252.95 | 供网络 2 使用,拥有 32 个地址,主机号为 64 |
| 192.168.252.96 ~ 192.168.252.111 | 供网络 3 使用,拥有 16 个地址,主机号为 96 |
| 192.168.252.112 ~ 192.168.252.115 | 供网络 4 使用,拥有 4 个地址,主机号为 112 |
| 192.168.252.116 ~ 192.168.252.255 | 剩余待分配 |
【注】若还要继续分配网络,则不能在 192.168.252.116 处开始分配,因为 116 不能被 4、8、16、32、64、… 整除,所以该地址不能分配大小为 4、8、16、32、64、… 的地址块。那么应该从哪里开始分配地址呢?见下表:
| 分配的地址块大小 | 起始地址 |
|---|---|
| 4 | 192.168.252.120 |
| 8 | 192.168.252.120 |
| 16 | 192.168.252.128 |
| 32 | 192.168.252.128 |
| 64 | 192.168.252.128 |
| 128 | 192.168.252.128 |
| … | … |
【例 3】若将 101.200.16.0/20 划分为 5 个子网,则可能的最小子网的可分配 IP 地址数是( )
A. 126
B. 254
C. 510
D. 1022
【解】地址块 101.200.16.0/20 主机号位数为 32-20=12,即 101. 200. 0001 0000. 0000 0000,包含地址数量为 212=4096 个。
若要求最小子网,则不能采用均匀分配,要采用不均匀的子网划分,因此采用哈夫曼编码的方式确定子网号。
去掉网络地址和广播地址,可分配 IP 地址数为 254 个,选 B。
(请参考《(考研复习)子网划分小题解析》)
数据报传送过程中 IP 地址(逻辑地址)与 MAC 地址(硬件地址)的变化情况:

【例 1】下图中各主机和路由器各接口的 MAC 地址和所配置的 IP 地址都已标注在它们的旁边,假设主机 H1 要给 H2 发送一个 IP 数据报,该 IP 数据报会被封装成以太网帧进行发送,则当 H2 收到该帧时,其首部中的源 MAC 地址以及所封装的 IP 数据报首部中的源 IP 地址分别是( )
A. 00-a1-b2-c3-d4-61,192.168.1.254
B. 00-a1-b2-c3-d4-61,192.168.0.1
C. 00-a1-b2-c3-d4-51,192.168.0.1
D. 00-a1-b2-c3-d4-51,192.168.1.254
【解】答案为选项 B,见下表:
| 传输区间 | 网络层 IP 数据报首部的源 IP 地址 | 网络层 IP 数据报首部的目的 IP 地址 | 数据链路层帧首部的源 MAC 地址 | 数据链路层帧首部的目的 MAC 地址 |
|---|---|---|---|---|
| H1 --> R | 192.168.0.1 | 192.168.1.1 | 00-a1-b2-c3-d4-51 | 00-a1-b2-c3-d4-52 |
| R --> H2 | 192.168.0.1 | 192.168.1.1 | 00-a1-b2-c3-d4-61 | 00-a1-b2-c3-d4-62 |
【例 2】路由器 R 通过以太网交换机 S1 和 S2 连接两个网络,R 的接口、主机 H1 和 H2 的 IP 地址与 MAC 地址如下图所示。若 H1 向 H2 发送一个 IP 分组 P,则 H1 发出的封装 P 的以太网帧的目的 MAC 地址、H2 收到的封装 P 的以太网帧的源 MAC 地址分别是( )
A. 00-a1-b2-c3-d4-62,00-1a-2b-3c-4d-52
B. 00-a1-b2-c3-d4-62,00-1a-2b-3c-4d-61
C. 00-1a-2b-3c-4d-51,00-1a-2b-3c-4d-52
D. 00-1a-2b-3c-4d-51,00-a1-b2-c3-d4-61
【解】答案为选项 D,见下表:
| 传输区间 | 网络层 IP 数据报首部的源 IP 地址 | 网络层 IP 数据报首部的目的 IP 地址 | 数据链路层帧首部的源 MAC 地址 | 数据链路层帧首部的目的 MAC 地址 |
|---|---|---|---|---|
| H1 --> R | 192.168.3.2 | 192.168.4.2 | 00-a1-b2-c3-d4-52 | 00-a1-b2-c3-d4-51 |
| R --> H2 | 192.168.3.2 | 192.168.4.2 | 00-a1-b2-c3-d4-61 | 00-a1-b2-c3-d4-62 |
【注】查表转发的结果可以指明IP数据报的下一跳路由器的 IP 地址,但无法指明该 IP 地址所对应的 MAC 地址。因此,在数据链路层封装该 IP 数据报成为帧时,帧首部中的目的 MAC 地址字段就无法填写,该问题需要使用网际层中的地址解析协议 ARP 来解决。

192.168.0.127或255.255.255.255(本网络的广播地址),则路由器不转发广播 IP 数据报(路由器 R 会隔离广播域)。如果因特网中数量巨大的路由器收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。【注】默认网关和默认路由的区别:
- 默认网关:是一个 IP 地址;是与主机直接相连的路由器端口。
- 默认路由:是路由表中的一项,一般通往互联网的方向。
【例】某网络拓扑如下图所示,其中 R 为路由器,主机 H1~H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干台以太网交换机(无 VLAN 功能)和路由器两类网络互连设备可供选择。

请回答以下问题:
(1)设备 1、设备 2 和设备 3 分别应选择什么类型网络设备?
(2)设备 1、设备 2 和设备 3 中,哪几个设备的接口需要配置 IP 地址?并为对应的接口配置正确的 IP 地址。
(4)若主机 H3 发送一个目的地址为 192.168.1.127 的 IP 数据报,网络中哪几个主机会收到该数据报?
【解】(1)H1 和 H2 的网络前缀相同,因此设备 1 是交换机;同理,H3 和 H4 的网络前缀相同,因此设备 2 也是交换机。由于 H1 和 H3 的网络前缀不相同,因此设备 3 是路由器。
(2)路由器 IF1 = 192.168.1.254/30,IF2 = 192.168.1.1,IF3 = 192.168.1.65。
(4)192.168.1.127 为 H3 所在网络的广播地址,因此主机 H3 和 H4 都能收到该数据报。
【例】如图所示有三个子网,两个路由器,以及路由器 1 的部分路由表。现在源主机 H1 向目的主机 H2 发送分组。试着讨论 R1 收到 H1 向 H2 发送的分组后查找路由表的过程。(来源《使用子网时的分组转发算法》)

【解】源主机 H1 首先判断目的主机 H2 是否在本网络上:
| 十进制目的主机 IP 地址 | 128 | 30 | 33 | 138 |
|---|---|---|---|---|
| 二进制目的主机 IP 地址 | 128 | 30 | 33 | 1000 1010 |
| 二进制本网络的子网掩码 | 255 | 255 | 255 | 1000 0000 |
| 按位与运算结果 | 128 | 30 | 33 | 1000 0000 |
| 十进制网络地址 | 128 | 30 | 33 | 128 |
因此得出的网络地址与本网络的网络地址不匹配,说明 H2 不在 H1 所在的网络中,必须把分组交给路由器 R1,让 R1 根据转发表来处理这个分组。
用 H2 的 IP 地址(128.30.33.138)与转发表每一行的子网掩码进行按位与运算,看是否匹配目的地址:
| 目的网络 | 子网掩码 | 下一跳 | 子网掩码与 H2 的 IP 地址的按位与运算 | 是否匹配 |
|---|---|---|---|---|
| 128.30.33.0/25 | 255.255.255.128 | 接口 0 | 128.30.33.128 | x |
| 128.30.33.128/25 | 255.255.255.128 | 接口 1 | 128.30.33.128 | √(此时不再往下匹配) |
| 128.30.36.0/24 | 255.255.255.0 | R2 |
于是 R1 把分组从接口 1 交付给 H2。
【例】路由器 R0 的路由表见下表,若进入路由器 R0 的分组的目的地址为 132.19.237.5,该分组应该被转发到( )下一跳路由器。
| 目的网络 | 下一跳 |
|---|---|
| 132.0.0.0/8 | R1 |
| 132.0.0.0/11 | R2 |
| 132.19.232.0/22 | R3 |
| 0.0.0.0/0 | R4 |
A. R1
B. R2
C. R3
D. R4
【解】见下表:
| 目的网络 | 子网掩码 | 下一跳 | 子网掩码与目的地址的按位与运算 | 是否匹配 |
|---|---|---|---|---|
| 132.0.0.0/8 | 255.0.0.0 | R1 | 132.0.0.0 | √ |
| 132.0.0.0/11 | 255.224.0.0 | R2 | 132.0.0.0 | √ |
| 132.19.232.0/22 | 255.255.252.0 | R3 | 132.19.236.0 | x |
| 0.0.0.0/0 | 0.0.0.0 | R4 | 0.0.0.0 | √ |
0.0.0.0/0 为默认路由,只有路由表中的所有网络都不能和分组的目的网络匹配时才使用。有三个目的网络均匹配,则选择前缀最长的路由,所以答案为选项 B。
| 网络类别 | 地址范围 | 网段个数 |
|---|---|---|
| A | 10.0.0.0 ~ 10.255.255.255 | 1 个 A 类网段 |
| B | 172.16.0.0 ~ 172.31.255.255 | 16 个 B 类网段 |
| C | 192.168.0.0 ~ 192.168.255.255 | 256 个 C 类网段 |
{本地 IP 地址: 端口}到{全球IP 地址: 端口}的映射,将多个私有 IP 地址映射到一个全球 IP 地址【注】将 NAT 和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation,NAPT),但一般又称为 NAT。
【例 1】假设主机 A 端口号为 30000,主机 B 端口号为 80,(1)用户主机 A 向目的主机 B 发送分组,(2)用户主机 B 向目的主机 A 发送响应分组,请分析 NAT 路由器的工作流程。

【解】(1)用户主机 A 向目的主机 B 发送分组的过程如下。
| IP 首部 | 运输层首部 | 应用层报文 |
|---|---|---|
| 源 IP:192.168.0.3;目的 IP:213.18.2.4 | 源端口:30000;目的端口:80 | xxx |
| WAN 端(外网) | LAN 端(内网) |
|---|---|
| 172.38.1.5: 40001 | 192.168.0.3: 30000 |
| IP 首部 | 运输层首部 | 应用层报文 |
|---|---|---|
| 源 IP:172.38.1.5;目的 IP:213.18.2.4 | 源端口:40001;目的端口:80 | xxx |
(2)用户主机 B 向目的主机 A 发送响应分组的过程如下。
| IP 首部 | 运输层首部 | 应用层报文 |
|---|---|---|
| 源 IP:213.18.2.4;目的 IP:172.38.1.5 | 源端口:80;目的端口:40001 | xxx |
| IP 首部 | 运输层首部 | 应用层报文 |
|---|---|---|
| 源 IP:213.18.2.4;目的 IP:192.168.0.3 | 源端口:80;目的端口:30000 | xxx |
【例 2】假定一个 NAT 路由器的公网地址为 205.56.79.35,并且有如下表项:
| 转换端口 | 源 IP 地址 | 源端口 |
|---|---|---|
| 2056 | 192.168.32.56 | 21 |
| 2057 | 192.168.32.56 | 20 |
| 1892 | 192.168.48.26 | 80 |
| 2256 | 192.168.55.106 | 80 |
它收到一个源 IP 地址为 192.168.32.56,源端口为 80 的分组,其动作是( )。
A. 转换地址,将源 IP 变为 205.56.79.35,端口变为 2056,然后发送到公网
B. 添加一个新的条目,转换 IP 地址以及端口然后发送到公网
C. 不转发,丢弃该分组
D. 直接将分组转发到公网上
【解】NAT 的表项需要管理员添加,这样可以控制一个内网到外网的网络连接。题目中主机发送的分组在 NAT 表项中找不到(端口 80 是从源端口找,而不是转换端口),所以服务器就不转发该分组。选 C。
与 IPv4 相比,IPv6 数据报首部的某些字段作了以下更改:
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF68E6:0:0:0:0:0:0:FFFF–>68E6::FFFF0:0:0:0:0:0:128.10.2.1–>::128.10.2.10:0:0:0:0:0:0:FFFF–>::FFFF0:0:0:0:0:0:0:0–>::这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包