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.000001 01.00001001
+ 10.1.0.0/16
+ 00001010.00000001 .00000000.00000000
+ 10.1.4.0/22
+ 00001010.00000001.000001 00.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 规定的文档示例地址段。
+