网络设计

集线器

第一层(物理层)-集线器:使用集线器进行多主机通信 集线器 A向B发送数据时只需要在头部指定源MAC地址和目标MAC地址就可以了,B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下。虽然集线器使整个布局干净不少,但原来我只要发给电脑 B 的消息,现在却要发给连接到集线器中的所有电脑,这样既不安全,又不节省网络资源。 第二层(数据链路层)-交换机:在集线器的基础上进行改进,让源主机只将数据包只发给目标MAC地址指向的那台电脑,引入交换机。

交换机

交换机 交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。

MAC地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5

通过这样传输方式而组成的小范围的网络,叫做以太网。最开始的时候,MAC 地址表是空的,当一个设备通过端口连接到交换机时,交换机会观察该端口收到的第一个数据帧的源MAC地址,并将其记录到MAC地址表中,与该端口关联起来。如果目的MAC地址在地址表中找不到对应的输出端口,交换机会采用泛洪策略,将数据帧转发到除输入端口之外的所有端口。 mac地址表学习 随着机器数量越多,交换机的端口也不够了,将多个交换机连接起来。 交换机串连 最终,两个交换机将分别记录 A ~ H 所有机器的映射记录。 左边交换机

MAC地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5
ee-ee-ee-ee-ee-ee 6
ff-ff-ff-ff-ff-ff 6
gg-gg-gg-gg-gg-gg 6
hh-hh-hh-hh-hh-hh 6

右边交换机

MAC地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 1
aa-aa-aa-aa-aa-aa 1
dd-dd-dd-dd-dd-dd 1
ee-ee-ee-ee-ee-ee 2
ff-ff-ff-ff-ff-ff 3
gg-gg-gg-gg-gg-gg 4
hh-hh-hh-hh-hh-hh 6

路由器

第三层(网络层)-路由器:接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC 地址,而且同时还能帮我把数据包做一次转发 路由器webp 路由器的每一个端口,都有独立的 MAC 地址 此时有一个问题,如何把发送给 C 和 D,甚至是把发送给 DEFGH…. 的数据包,统统先发送给路由器,这个时候光有mac地址就不够用了,这时候就引入了ip地址。通过软件层面来实现路由转发。 加上ip地址的路由器 假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,其实网络层没有体现出作用。 但假如 A 给 C 发送数据,A 就需要先转交给路由器,然后再由路由器转交给 C。 由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。 A ~ 路由器这段的包如下: A~路由器

路由器到 C 这段的包如下: 路由器~C

默认网关,就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个IP地址。 不同网络通信

如果是单个路由器,就不存在下一条的概念,直接通过查表获取目的ip地址对应的端口 单路由转发

现在A要给C发数据包,已经可以成功发到路由器这里了,最后一个问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地C呢。路由器收到的数据包有目的IP也就是C的IP地址,需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样。这个表就叫路由表。 路由表的结构:

目的地址 下一跳 端口
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1

路由寻址

终极路由寻址 如果路由器进行串联就涉及到了下一跳这个概念。 具体步骤:

  1. 首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)

  2. 首先在主机的arp缓存中查找默认网关的mac地址,如果找不到则通过ARP找到默认网关192.168.0.254的 MAC 地址。

  3. A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。封装在网络层头部,然后发包

  4. 交换机1收到数据包后,发现目标 MAC 地址是 ABAB,转发给路由器1

  5. 数据包来到了路由器 1,发现其目标 IP 地址是 192.168.2.2,查看其路由表,发现了下一跳的地址是 192.168.100.5

  6. 所以此时路由器 1 需要做两件事,第一件是再次匹配路由表,发现匹配到了端口为 2,于是将其封装到数据链路层,最后把包从 2 号口发出去。

  7. 此时路由器 2 收到了数据包,看到其目的地址是 192.168.2.2,查询其路由表,匹配到端口号为 1,准备从 1 号口把数据包送出去。

  8. 但此时路由器 2 需要知道 192.168.2.2 的 MAC 地址了,于是查看其 arp 缓存,找到其 MAC 地址为 FFFF,将其封装在数据链路层头部,并从 1 号端口把包发出去。

  9. 交换机 3 收到了数据包,发现目的 MAC 地址为 FFFF,查询其 MAC 地址表,发现应该从其 6 号端口出去,于是从 6 号端口把数据包发出去。

  10. F 最终收到了数据包!并且发现目的 MAC 地址就是自己,于是收下了这个包

总结

  • 当目标IP地址与源IP地址不在同一个网段时,主机不会直接通过ARP解析目标IP地址的MAC地址,而是将目标MAC地址设置为默认网关的MAC地址,并通过默认网关进行跨网段通信

  • ARP表(Address Resolution Protocol 表)用于将IP地址映射到MAC地址,主要在网络层和链路层之间进行转换

  • 交换机对帧的处理行为一共有三种,转发、泛洪、丢弃,主要在数据链路层上进行工作

  • 路由表用于将IP地址映射到下一跳IP地址或本地接口,主要在网络层上进行工作

  • 交换机的mac地址表包含与交换机端口相关联的所有的设备的mac地址,包括可能通过路由器连接的设备

  • 如果交换机接收到一个数据帧,但是在mac地址表中找不到对应的mac地址则会进行泛洪

  • 网络层(IP协议)的主要职责是寻址和路由选择,确保数据包能够从源设备正确寻址到目的设备。然而,实际的数据包传输功能——包括介质访问、物理传输以及可靠的端到端传输是由数据链路层、物理层和传输层提供的。网络层负责确定数据包的路径,但不直接管理或执行数据包的传输过程。

  • 交换机中有 MAC 地址表用于映射 MAC 地址和它的端口,是通过学习得到的

  • 路由器中有路由表用于映射 IP 地址(段)和它的端口,路由表是各种路由算法 + 人工配置逐步完善起来的。

  • 电脑和路由器中都有arp缓存表用于缓存IP和MAC地址的映射关系,arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。

  • 每个数据包在经过路由器时,IP地址保持不变,但MAC地址会根据下一跳的设备进行更新,主机之间的直接通信依赖于路由器的转发功能,而路由器依靠ARP协议解析网络中的MAC地址以实现准确的转发。

  • 当数据包来到第一个路由器时,会经历查找路由表、确定出接口、更改MAC地址、转发数据包,直到数据包到达下一跳路由器,如果下一跳ip地址和目的ip地址在同一局域网内,则直接通过arp协议查找目的主机的mac地址,如果下一跳ip地址和目的ip地址不在一个局域网内,则通过查表找到下一跳出口,然后通过arp协议获取出口mac地址,然后到下一个路由器。