diff --git a/notes/pics/arp-hops.png b/notes/pics/arp-hops.png new file mode 100644 index 00000000..a8e34915 Binary files /dev/null and b/notes/pics/arp-hops.png differ diff --git a/notes/pics/arp-request.png b/notes/pics/arp-request.png new file mode 100644 index 00000000..0d5c0d7e Binary files /dev/null and b/notes/pics/arp-request.png differ diff --git a/notes/pics/bgp.png b/notes/pics/bgp.png new file mode 100644 index 00000000..1d6184f9 Binary files /dev/null and b/notes/pics/bgp.png differ diff --git a/notes/pics/icmp-format.png b/notes/pics/icmp-format.png new file mode 100644 index 00000000..9fb7e298 Binary files /dev/null and b/notes/pics/icmp-format.png differ diff --git a/notes/pics/ip-classes.png b/notes/pics/ip-classes.png new file mode 100644 index 00000000..3549c71b Binary files /dev/null and b/notes/pics/ip-classes.png differ diff --git a/notes/pics/ip-fragment.png b/notes/pics/ip-fragment.png new file mode 100644 index 00000000..73788040 Binary files /dev/null and b/notes/pics/ip-fragment.png differ diff --git a/notes/pics/ip-header.png b/notes/pics/ip-header.png new file mode 100644 index 00000000..5a239cf4 Binary files /dev/null and b/notes/pics/ip-header.png differ diff --git a/notes/pics/nat.png b/notes/pics/nat.png new file mode 100644 index 00000000..fff6f366 Binary files /dev/null and b/notes/pics/nat.png differ diff --git a/notes/pics/route-lookup.png b/notes/pics/route-lookup.png new file mode 100644 index 00000000..89e8f191 Binary files /dev/null and b/notes/pics/route-lookup.png differ diff --git a/notes/pics/router-structure.png b/notes/pics/router-structure.png new file mode 100644 index 00000000..dd8ecac2 Binary files /dev/null and b/notes/pics/router-structure.png differ diff --git a/notes/pics/vpn-tunnel.png b/notes/pics/vpn-tunnel.png new file mode 100644 index 00000000..a5252a9d Binary files /dev/null and b/notes/pics/vpn-tunnel.png differ diff --git a/notes/计算机网络 - 网络层.md b/notes/计算机网络 - 网络层.md index 2f382744..e8227300 100644 --- a/notes/计算机网络 - 网络层.md +++ b/notes/计算机网络 - 网络层.md @@ -38,7 +38,7 @@ ## IP 数据报格式 -

+

- **版本** : 有 4(IPv4)和 6(IPv6)两个值; @@ -58,7 +58,7 @@ - **片偏移** : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。 -

+

## IP 地址编址方式 @@ -74,7 +74,7 @@ IP 地址的编址方式经历了三个历史阶段: IP 地址 ::= {\< 网络号 \>, \< 主机号 \>} -

+

### 2. 子网划分 @@ -104,27 +104,33 @@ CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为 网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。 -

+

ARP 实现由 IP 地址得到 MAC 地址。 -

- 每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。 如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。 -

+

## 网际控制报文协议 ICMP ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。 -

+

ICMP 报文分为差错报告报文和询问报文。 -

+| 类型 | 名称 | 种类 | 用途 | +| --- | --- | --- | --- | +| 0 | 回送回答 | 询问 | ping 收到的回答 | +| 3 | 终点不可达 | 差错报告 | 主机、网络或端口不可达,Traceroute 到达终点时收到端口不可达 | +| 5 | 改变路由(重定向) | 差错报告 | 路由器告诉主机有更好的下一跳 | +| 8 | 回送请求 | 询问 | ping 发出的请求 | +| 11 | 时间超过 | 差错报告 | TTL 减到 0 时由路由器发出,Traceroute 靠它得到沿途的路由器 | +| 12 | 参数问题 | 差错报告 | 首部字段的值有错 | +| 13、14 | 时间戳请求、回答 | 询问 | 很少使用 | ### 1. Ping @@ -155,9 +161,9 @@ Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报 VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。 -下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.1,目的地址是 10.2.0.3。数据报先发送到与互联网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的全球地址 125.1.2.3,目的地址是路由器 R2 的全球地址 194.4.5.6。路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目的地址为 10.2.0.3,就交付给 Y。 +下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.5,目的地址是 10.2.0.8。数据报先发送到与互联网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的全球地址 203.0.113.1,目的地址是路由器 R2 的全球地址 198.51.100.2。路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目的地址为 10.2.0.8,就交付给 Y。 -

+

## 网络地址转换 NAT @@ -165,7 +171,7 @@ VPN 使用公用的互联网作为本机构各专用网之间的通信载体。 在以前,NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。为了更有效地利用全球 IP 地址,现在常用的 NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。 -

+

## 路由器的结构 @@ -173,7 +179,7 @@ VPN 使用公用的互联网作为本机构各专用网之间的通信载体。 分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。 -

+

## 路由器分组转发流程 @@ -184,7 +190,9 @@ VPN 使用公用的互联网作为本机构各专用网之间的通信载体。 - 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器; - 报告转发分组出错。 -

+实际的路由器用最长前缀匹配统一处理以上几种情况:特定主机路由的前缀长度为 32,默认路由为 0,查找时在匹配的表项中选前缀最长的一个。 + +

## 路由选择协议 @@ -241,4 +249,4 @@ BGP 只能寻找一条比较好的路由,而不是最佳路由。 每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。 -

+

diff --git a/tools/diagram/src/arp-hops.svg b/tools/diagram/src/arp-hops.svg new file mode 100644 index 00000000..841ea676 --- /dev/null +++ b/tools/diagram/src/arp-hops.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + IP 地址不变,MAC 地址逐段改变 + + + + + H1 + 192.168.1.10 + + + + + + + + + + R1 + + + + + + + + + + R2 + + + + + H2 + 10.0.2.20 + + 局域网 1 + + 链路 2 + + 局域网 3 + R1-1 + R1-2 + R2-1 + R2-2 + + 帧首部 + + MAC H1 → R1-1 + + IP .1.10 → 10.0.2.20 + + + 帧首部 + + MAC R1-2 → R2-1 + + IP .1.10 → 10.0.2.20 + + + 帧首部 + + MAC R2-2 → H2 + + IP .1.10 → 10.0.2.20 + + 淡紫色是帧首部中的 MAC 地址,每经过一段链路就换成这一段两端的地址; + 浅蓝色是 IP 首部中的地址,从 H1 到 H2 一直不变(.1.10 即 192.168.1.10)。 + H1 发送前用 ARP 查的是下一跳 R1-1 的 MAC 地址,而不是 H2 的;R1、R2 转发时也各自查下一跳。 + diff --git a/tools/diagram/src/arp-request.svg b/tools/diagram/src/arp-request.svg new file mode 100644 index 00000000..07f0043e --- /dev/null +++ b/tools/diagram/src/arp-request.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + ARP:A 查询 192.168.1.20 的 MAC 地址 + + + + + + + A + 192.168.1.10 + + + + + + B + 192.168.1.20 + + + + + + C + 192.168.1.30 + + + + + + D + 192.168.1.40 + + ① 广播 ARP 请求,目的 MAC ff:ff:ff:ff:ff:ff + “谁是 192.168.1.20?请告诉 192.168.1.10” + + + + 不是自己的 IP,丢弃 + 丢弃 + + ② B 单播 ARP 响应:192.168.1.20 的 MAC 是 52:54:00:aa:00:20 + + + ③ A 的 ARP 缓存 + + 192.168.1.20 → 52:54:00:aa:00:20 + A 之后发给 192.168.1.20 的帧, + 直接使用缓存中的 MAC 地址; + B 收到请求时也顺便记下 A 的映射。 + 缓存项有过期时间,过期后重新查询。 + diff --git a/tools/diagram/src/bgp.svg b/tools/diagram/src/bgp.svg new file mode 100644 index 00000000..c8645f8e --- /dev/null +++ b/tools/diagram/src/bgp.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + BGP:自治系统之间交换路由 + + AS1 + 内部用 OSPF + + AS2 + 内部用 OSPF + + AS3 + 内部用 RIP + + AS4 + 内部用 OSPF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BGP 会话(TCP 179) + + + + 203.0.113.0/24,路径 AS3 + ① AS3 通告自己的网络 + + + + 203.0.113.0/24,路径 AS4 AS3 + ② AS4 把自己加到路径前面再转告 + 浅青色是各 AS 的 BGP 发言人。AS1 从 AS4 和 AS2 都可能收到到 203.0.113.0/24 的路由,按策略和路径长度选一条; + 路径中出现自己的 AS 号说明有环路,直接丢弃。 + diff --git a/tools/diagram/src/icmp-format.svg b/tools/diagram/src/icmp-format.svg new file mode 100644 index 00000000..2836a64b --- /dev/null +++ b/tools/diagram/src/icmp-format.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + ICMP 报文:以 ping 发出的回送请求为例 + + IP 首部(协议 = 1) + + ICMP 报文 + + + + 类型 + 8(回送请求) + + 代码 + 0 + + 检验和 + 16 位 + + 标识符 + 区分不同的 ping 进程 + + 序号 + 每发一个加 1 + + 数据 + 通常带上发送时间,用来计算往返时间 + + 所有 ICMP 报文 + 前 4 字节相同 + + 其余部分 + 取决于类型 + ICMP 封装在 IP 数据报中,但它不是传输层协议,而是网络层的一部分。 + 目的主机返回回送回答(类型 0),标识符、序号和数据原样带回。 + 差错报告报文的数据部分是出错数据报的 IP 首部和数据的前 8 字节,源主机据此知道是哪个报文出了错。 + diff --git a/tools/diagram/src/ip-classes.svg b/tools/diagram/src/ip-classes.svg new file mode 100644 index 00000000..6348aade --- /dev/null +++ b/tools/diagram/src/ip-classes.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + 分类的 IP 地址 + 0 + 31 + A 类 + + 0 + + 网络号 7 位 + + 主机号 24 位 + 首字节 1~126 + 每个网络 2²⁴ − 2 台主机,例如 10.1.2.3 + B 类 + + 10 + + 网络号 14 位 + + 主机号 16 位 + 首字节 128~191 + 每个网络 65534 台主机,例如 172.16.5.4 + C 类 + + 110 + + 网络号 21 位 + + 主机号 8 位 + 首字节 192~223 + 每个网络 254 台主机,例如 192.168.1.10 + D 类 + + 1110 + + 多播组号 + 首字节 224~239 + 多播地址 + E 类 + + 1111 + + 保留 + 首字节 240~255 + 保留 + A 类中 0 开头和 127 开头的网络保留不分配,127.0.0.1 是本机回环地址。 + diff --git a/tools/diagram/src/ip-fragment.svg b/tools/diagram/src/ip-fragment.svg new file mode 100644 index 00000000..537a6d54 --- /dev/null +++ b/tools/diagram/src/ip-fragment.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + IP 分片:UDP 发送 3000 字节,经过 MTU 为 1500 的以太网 + 原始数据报 + + IP 首部 + + + UDP 首部 + 应用数据 3000 字节 + 数据部分 3008 字节 + + 0 + + 1480 + + 2960 + + 3008 + + + IP 首部 + + + UDP 首部 + 数据 1480 字节 + 分片 1:总长度 1500,MF = 1,片偏移 = 0 / 8 = 0 + + + IP 首部 + + 数据 1480 字节 + 分片 2:总长度 1500,MF = 1,片偏移 = 1480 / 8 = 185 + + + IP 首部 + + 48 字节 + 分片 3:总长度 68,MF = 0,片偏移 = 2960 / 8 = 370 + 每片的数据部分最多 1500 − 20 = 1480 字节,正好是 8 的倍数。三个分片的标识相同, + 目的主机按标识收集分片、按片偏移排列,收齐后重组;只有第一个分片带有 UDP 首部和端口号。 + diff --git a/tools/diagram/src/ip-header.svg b/tools/diagram/src/ip-header.svg new file mode 100644 index 00000000..13ec07f6 --- /dev/null +++ b/tools/diagram/src/ip-header.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + IPv4 首部 + 0 + 15 + 16 + 31 + + 版本 + 4 位 + + 首部长度 + 4 位 + + 区分服务 + 8 位 + + 总长度 + 16 位 + + 标识 + 16 位 + + 标志 + 3 位 + + 片偏移 + 13 位 + + 生存时间 + 8 位 + + 协议 + 8 位 + + 首部检验和 + 16 位 + + 源 IP 地址 + 32 位 + + 目的 IP 地址 + 32 位 + + 选项 + 长度可变 + + 填充 + 补齐 4 字节 + + 数据(例如 TCP 报文段、UDP 数据报) + + 固定 20 字节 + + 0~40 字节 + 淡紫色的三个字段用于分片:标志的后两位是 DF(为 1 时不允许分片)和 MF(为 1 时后面还有分片)。 + 首部长度以 4 字节为单位,片偏移以 8 字节为单位;总长度包括首部和数据,最大 65535 字节。 + 协议字段指出数据部分交给谁处理:1 是 ICMP,6 是 TCP,17 是 UDP。 + diff --git a/tools/diagram/src/nat.svg b/tools/diagram/src/nat.svg new file mode 100644 index 00000000..c1e1274b --- /dev/null +++ b/tools/diagram/src/nat.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + NAPT:两台主机共用一个全球地址 + + 专用网 192.168.0.0/24 + + + + + H1 + 192.168.0.3 + + + + + H2 + 192.168.0.4 + + + + + + + + + + NAT 路由器 + 203.0.113.5 + + + + + + + + + + 服务器 + 198.51.100.7 + + + + ① H1 的请求经过 NAT,源地址和端口被改写 + + + 192.168.0.3:30000 → 198.51.100.7:443 + + + 203.0.113.5:40001 → 198.51.100.7:443 + + + NAPT 转换表:内部地址 ↔ 外部地址 + + 192.168.0.3:30000 ↔ 203.0.113.5:40001 + + 192.168.0.4:30000 ↔ 203.0.113.5:40002 + ② 响应按目的端口 40001 查表,改回 H1 + + + 198.51.100.7:443 → 203.0.113.5:40001 + + + 198.51.100.7:443 → 192.168.0.3:30000 + H1、H2 的源端口都是 30000,NAT 为它们分配 + 不同的外部端口,响应回来时靠外部端口区分。 + 外部主机无法主动连接 H1:转换表中没有对应的表项,除非在 NAT 上配置端口映射。 + diff --git a/tools/diagram/src/route-lookup.svg b/tools/diagram/src/route-lookup.svg new file mode 100644 index 00000000..d27582f1 --- /dev/null +++ b/tools/diagram/src/route-lookup.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + 路由器 R0 转发分组:最长前缀匹配 + R0 的路由表 + + 目的网络 + + 下一跳 + + 192.168.1.0/24 + + 直接交付(eth0) + + 10.1.0.0/16 + + R2 + + 10.1.4.0/22 + + R3 + + 0.0.0.0/0 + + R1(默认路由) + 目的地址 10.1.5.9 + 10.1.5.9 + 00001010.00000001.00000101.00001001 + 10.1.0.0/16 + 00001010.00000001.00000000.00000000 + 10.1.4.0/22 + 00001010.00000001.00000100.00000000 + /16 和 /22 都匹配,选前缀更长的 /22,交给 R3。 + 目的地址 8.8.8.8 + 只有默认路由 0.0.0.0/0 匹配,交给 R1。 + 目的地址 192.168.1.7 + 在直接相连的网络中,用 ARP 查出 MAC 地址后直接交付。 + 0.0.0.0/0 的前缀长度为 0, + 能匹配任何地址,只在没有 + 其它表项匹配时才使用。 + 没有任何表项匹配(也没有默认路由)时,丢弃分组并向源主机发送 ICMP 终点不可达报文。 + diff --git a/tools/diagram/src/router-structure.svg b/tools/diagram/src/router-structure.svg new file mode 100644 index 00000000..821da3a0 --- /dev/null +++ b/tools/diagram/src/router-structure.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + 路由器的结构 + + 路由选择部分(控制) + + + + + + + + + 路由选择处理机:运行 RIP、OSPF、BGP, + 与相邻路由器交换信息,计算出路由表, + 再生成转发表下发到各输入端口 + + 分组转发部分(数据) + 输入端口 + 转发表 + 输出端口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 交换结构 + 把分组从输入端口 + 送到输出端口 + + 输入端口按目的地址查转发表,决定送往哪个输出端口;分组到达得比处理得快时就在端口排队,队列满了就丢弃。 + diff --git a/tools/diagram/src/vpn-tunnel.svg b/tools/diagram/src/vpn-tunnel.svg new file mode 100644 index 00000000..28c24f5a --- /dev/null +++ b/tools/diagram/src/vpn-tunnel.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + VPN 隧道:场所 A 的 X 访问场所 B 的 Y + + 场所 A 10.1.0.0/16 + + 场所 B 10.2.0.0/16 + + + + + X + 10.1.0.5 + + + + + Y + 10.2.0.8 + + + + + + + + + + R1 + 203.0.113.1 + + + + + + + + + + R2 + 198.51.100.2 + + 互联网 + + 隧道 + + + + + 源 10.1.0.5 + 目的 10.2.0.8 + 数据 + + + 源 203.0.113.1 + 目的 198.51.100.2 + + + + 加密后的 + 原数据报 + + + 源 10.1.0.5 + 目的 10.2.0.8 + 数据 + ① X 发出的数据报 + ② R1 加密后加上新的首部 + ③ R2 解密,恢复原数据报 + + + 互联网上的路由器只看到 R1、R2 的全球地址,看不到专用地址和数据内容。 + 图中的全球地址取自 RFC 5737 规定的文档示例地址段。 +