diff --git a/notes/pics/arp-hops.png b/notes/pics/arp-hops.png index a8e34915..19a21c56 100644 Binary files a/notes/pics/arp-hops.png and b/notes/pics/arp-hops.png differ diff --git a/notes/pics/icmp-format.png b/notes/pics/icmp-format.png index 9fb7e298..30e0ed08 100644 Binary files a/notes/pics/icmp-format.png and b/notes/pics/icmp-format.png differ diff --git a/notes/pics/ip-fragment.png b/notes/pics/ip-fragment.png index 73788040..424646c7 100644 Binary files a/notes/pics/ip-fragment.png and b/notes/pics/ip-fragment.png differ diff --git a/notes/pics/ip-header.png b/notes/pics/ip-header.png index 5a239cf4..8eda75bd 100644 Binary files a/notes/pics/ip-header.png and b/notes/pics/ip-header.png differ diff --git a/notes/pics/nat.png b/notes/pics/nat.png index fff6f366..a712ebb5 100644 Binary files a/notes/pics/nat.png and b/notes/pics/nat.png differ diff --git a/notes/计算机网络 - 网络层.md b/notes/计算机网络 - 网络层.md index f2f922d1..6f7a6d45 100644 --- a/notes/计算机网络 - 网络层.md +++ b/notes/计算机网络 - 网络层.md @@ -41,14 +41,15 @@

-- 版本:有 4(IPv4)和 6(IPv6)两个值; +- 版本:上图是 IPv4 的首部,版本为 4。IPv6 的首部格式不同,基本首部固定为 40 字节,没有首部检验和,路由器也不分片; - 首部长度:占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充; -- 区分服务:用来获得更好的服务,一般情况下不使用; +- 区分服务:前 6 位 DSCP 标记服务等级,供路由器区别对待(多用于企业网和运营商内部,公网上一般不保证),后 2 位 ECN 用于显式拥塞通知; - 总长度:包括首部长度和数据部分长度; - 生存时间:TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报; - 协议:指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等; -- 首部检验和:因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量; +- 首部检验和:因为数据报每经过一个路由器,TTL 等字段都会改变,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量; - 标识:在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符; +- 标志:MF 为 1 表示后面还有分片,DF 为 1 表示不允许分片; - 片偏移:和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。

@@ -77,7 +78,7 @@ IP 地址 ::= {\< 网络号 \>, \< 子网号 \>, \< 主机号 \>} 要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。 -注意,外部网络看不到子网的存在。 +需要注意的是,外部网络看不到子网的存在。 ### 3. 无分类 @@ -85,11 +86,11 @@ IP 地址 ::= {\< 网络号 \>, \< 子网号 \>, \< 主机号 \>} IP 地址 ::= {\< 网络前缀号 \>, \< 主机号 \>} -CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。 +CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。把地址和掩码 255.255.240.0 按位与,得到网络地址 128.14.32.0,这个地址块从 128.14.32.0 到 128.14.47.255,共 2¹² = 4096 个地址,去掉全 0 和全 1 的主机号后可分配给 4094 台主机。 CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。 -一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 **构成超网** 。 +一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为构成超网。 在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。 @@ -111,14 +112,14 @@ ARP 实现由 IP 地址得到 MAC 地址。 ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。 -

+

ICMP 报文分为差错报告报文和询问报文。 | 类型 | 名称 | 种类 | 用途 | | --- | --- | --- | --- | | 0 | 回送回答 | 询问 | ping 收到的回答 | -| 3 | 终点不可达 | 差错报告 | 主机、网络或端口不可达,Traceroute 到达终点时收到端口不可达 | +| 3 | 终点不可达 | 差错报告 | 主机、网络或端口不可达,UDP 方式的 Traceroute 到达终点时收到端口不可达 | | 5 | 改变路由(重定向) | 差错报告 | 路由器告诉主机有更好的下一跳 | | 8 | 回送请求 | 询问 | ping 发出的请求 | | 11 | 时间超过 | 差错报告 | TTL 减到 0 时由路由器发出,Traceroute 靠它得到沿途的路由器 | @@ -135,7 +136,7 @@ Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主 Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。 -Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。 +Linux 的 traceroute 默认发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。Windows 的 tracert 发送的是 ICMP 回送请求,目的主机返回回送回答。 - 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文; - 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。 @@ -152,9 +153,9 @@ Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报 - 172.16.0.0 \~ 172.31.255.255 - 192.168.0.0 \~ 192.168.255.255 -VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。 +VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它经过了公用的互联网。 -下图中,场所 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。 +下图中,场所 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。

@@ -176,7 +177,7 @@ VPN 使用公用的互联网作为本机构各专用网之间的通信载体。 ## 路由器分组转发流程 -- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。 +- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N; - 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付; - 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器; - 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器; @@ -200,7 +201,7 @@ VPN 使用公用的互联网作为本机构各专用网之间的通信载体。 ### 1. 内部网关协议 RIP -RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。 +RIP 是一种基于距离向量的路由选择协议。距离是指跳数,路由器到直接相连的网络的距离为 1,每经过一个路由器加 1。跳数最多为 15,超过 15 表示不可达。 RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。 @@ -208,12 +209,14 @@ RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经 - 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1; - 对修改后的 RIP 报文中的每一个项目,进行以下步骤: - - 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中; - - 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。 + - 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中; + - 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做; - 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。 RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。 +故障消息传得慢,是因为路由器只知道邻居报来的距离,不知道这条路是否绕回了自己:例如在不采用水平分割时,R1 到 Net1 的链路断开后,R2 仍报告“到 Net1 距离为 2”(实际经过 R1),R1 就改为经 R2、距离 3,R2 再改为 4……两者互相抬高距离,直到 16 才确认不可达。RIP 用水平分割(不把从某邻居学到的路由再报告给它)缓解这个问题,但涉及更多路由器的环路仍会收敛缓慢。 + ### 2. 内部网关协议 OSPF 开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。 @@ -222,15 +225,15 @@ RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15 OSPF 具有以下特点: -- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。 -- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。 -- 只有当链路状态发生变化时,路由器才会发送信息。 +- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法; +- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示; +- 只有当链路状态发生变化时,路由器才会发送更新(此外每 30 分钟刷新一次,并定期发送 Hello 报文维持与相邻路由器的关系)。 -所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。 +所有路由器都具有全网(划分区域时为本区域)的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛得很快。 ### 3. 外部网关协议 BGP -BGP(Border Gateway Protocol,边界网关协议) +边界网关协议(Border Gateway Protocol, BGP)用于自治系统之间的路由选择。 AS 之间的路由选择很困难,主要是由于: @@ -249,6 +252,8 @@ BGP 只能寻找一条比较好的路由,而不是最佳路由。 - 谢希仁. 计算机网络(第 7 版)[M]. 电子工业出版社, 2017. - Kurose J F, Ross K W. 计算机网络:自顶向下方法(第 7 版)[M]. 机械工业出版社, 2018. - [RFC 791: Internet Protocol](https://www.rfc-editor.org/rfc/rfc791) +- [RFC 2474: Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers](https://www.rfc-editor.org/rfc/rfc2474) +- [RFC 3168: The Addition of Explicit Congestion Notification (ECN) to IP](https://www.rfc-editor.org/rfc/rfc3168) - [RFC 792: Internet Control Message Protocol](https://www.rfc-editor.org/rfc/rfc792) - [RFC 826: An Ethernet Address Resolution Protocol](https://www.rfc-editor.org/rfc/rfc826) - [RFC 1918: Address Allocation for Private Internets](https://www.rfc-editor.org/rfc/rfc1918)