0%

网络编程-网络设计推导简述

概念

MAC地址

MAC地址也叫物理地址、硬件地址,长度为 48 位,它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。

  • 其中前 24 位(00-16-EA)代表网络硬件制造商的编号
  • 后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。
  • 只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。

三张表

MAC地址表

  • 作用:交换机中保存MAC地址与端口的映射关系

    • 记录每一个MAC地址设备连接到哪一个端口上
    • 最初MAC地址为空,则记录首次发送数据设备的源MAC地址和进入端口
    • 发送时,没有目标MAC地址映射关系则将数据包发送给所有端口,即发送给所有设备
    • 设备接收到自己的数据包,做出响应,响应数据从哪个端口进入,此端口和目标MAC的映射关系会被记录
  • 来源:以太网各个节点之间通过交换机通信,不断完善缓存起来

路由表

  • 作用:路由器保存IP地址与端口的映射关系
  • 来源:各种路由算法 + 人工培植

ARP缓存表

  • 作用:设备和路由器中,用来保存IP地址和MAC地址的映射关系
  • 来源:不断通过ARP协议请求逐步完善

hub-集线器

将电信号转发到所有出口(广播),不做任何处理,解决多机通讯。

交换机

集线器只能进行广播,无法指定根据目标MAC进行发送,使用交换机能对指定目标发送数据。

交换机根据自身维护的MAC地址表,找到对应的端口将数据发送出去。

以太网

数据到达交换机,交换机内部通过自己维护的MAC地址表找到目标MAC映射的端口,把数据通过对应端口发送给对应的设备。

这种传输方式组成的小范围网络叫做以太网。

IP地址

  • 数据的发送如果是依赖于MAC地址的话,MAC地址在不人为修改的情况下,前24位为固定厂商编号,当我们需要根据前缀进行子网发布时,就得使用同一厂商的设备,因此引入了一个新的概念-IP地址。

  • 为每台设备分配一个32位的编号(IPV4),将其分成四个部分,中间用点相连,十进制表示为xxx.xxx.xxx

  • 此时每台设备拥有自己的MAC地址,同时又有自己的IP地址

  • IP地址是软件层面的,可以随时修改

  • MAC地址一般无法修改,每台设备独一无二

  • 有了IP地址之后,就可以根据前缀进行子网发送,无需使用同一厂家设备

路由器

作为交换机之间的桥梁,进行数据转发(不转发广播帧)。

  • 路由表:路由器保存IP地址与端口的映射关系
  • ARP缓存表:用来保存IP地址和MAC地址的映射关系

通讯

双机通讯

单机之间通信,通过网线相连。

多机通讯

随着需要通信的电脑数量多了,理论上可以为设备开更多的网口进行设备的接入,但实际上不能无限为电脑开网口。

引入集线器

因此引入了一个中间设备(集线器-hub),需要将网线插到中间设备(集线器-hub),由这个设备进行转发,让彼此通信。

集线器-hub,将电信号转发到所有出口(广播),不做任何处理,解决多机通讯。

所有连接到集线器的设备都有一个全局唯一的标识-MAC地址。当发送数据时,只要在头部拼接上源MAC地址目标MAC地址,就知道要发送给谁。

接收到数据的机器判断目标MAC地址是否为自己,是则接收,否则抛弃。

引入交换机

虽然设备可以通过MAC地址过滤数据,但是数据仍会发送给所有的设备,既不安全,也浪费网络资源。

因此引入另一个中间设备-交换机

数据在发送时会带上链路层头部数据,包含源MAC地址目标MAC地址

交换机通过自己维护的MAC地址表,找到目标MAC地址对应的端口,将数据发送出去。

交换机级联

随着机器数量增多,单个交换机端口不够用,需要将多个交换机连接起来。

左边交换机端口所连接的交换机,其上所有设备都会在左边交换机MAC地址表中记录。

左边交换机 右边交换机

这种方式一定程度缓解了多机通讯的压力,但是随着设备的增多,加入级联的交换机随着增多,每台交换机上的MAC地址表会变得越来越大,最终难以维护。

路由器

为了解决MAC地址表庞大问题,引入路由器作为交换机之间的桥梁。

路由器每个端口有自己的MAC地址,作为设备与交换机相连,交换机只需记录路由器端口MAC交换机连端口的映射,简化了MAC地址表

之后数据的发送经由路由器进行转发。

路由器的每一个端口,都有独立的 MAC 地址!

交换机1和交换机2都多了一条路由器端口的MAC地址与交换机自己端口的映射。

IP地址

由于MAC地址不人为修改的情况下,理论上不可变,当我们需要根据前缀进行子网发布时,就得使用同一厂商的设备,因此引入了一个新的概念-IP地址。

IP地址是软件层面的,可以随时修改,可以规划自己需要的网络拓扑结构。

假如我想要发送数据包给 ABCD 其中一台设备,不论哪一台,就可以这样描述:”将 IP 地址为 192.168.0 开头的全部发送给到路由器”。

之后交由路由器转发给对应的设备。

路由器转发

数据除了数据链路层头部外增加网络层头部

如上图所示,如果设备A发送数据给设备B,由于连着同一个交换机,其实网络层没有起到作用,直接通过数据链路层头部MAC地址经由交换机将数据投递给对应的设备

假设设备A发送数据给设备C,此时就需要先将数据交给路由器

再由路由器转交给C。

问题

如何知道是否要通过路由器转发?

  • 如果源 IP目的 IP 处于一个子网,直接将包通过交换机发出去
  • 如果源 IP目的 IP 不处于一个子网,就交给路由器去处理

什么叫做子网?

​ 将源 IP目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网

​ 假设某台机器的子网掩码定为 255.255.255.0

则结果为

A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0

B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0

C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0

D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0

如果 A 给 C 发消息,A 和 C 的 IP 地址分别 和 A 机器配置的子网掩码做&运算,发现不相等,则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心。

如何知道那个设备是路由器?

通过和子网掩码做&运算知道了与目标设备是否处于一个子网内,不在同个子网需要交给路由器转发,但是如何知道路由器的IP地址?

设备需要设置一个IP地址作为默认网关,当需要转发给不同子网的机器时,发给这个 IP 地址。

只知道IP不知道MAC如何发送数据?

网络层同个IP进行数据传输,但是到了数据链路层需要通过MAC进行发送,如何获取目标MAC地址呢?

使用ARP缓存表,记录着 IP 与 MAC 地址的对应关系。

设备A为了获取设备B的MAC地址,会广播一条ARP请求,设备B收到后将自己的MAC地址响应给设备A,设备A将MAC地址缓存起来。

总结

设备

  • 设备IP、目标IP
  • 通过子网掩码判断彼此是否处于同个子网
    • 同个子网,通过ARP缓存表获取对方MAC地址,发送数据
    • 不同子网,获取默认网关IP,通ARP找到网关的MAC地址,发送数据,交给网关处理

交换机

  • 数据包必须含有目标MAC地址
  • 通过MAC地址表查询MAC地址对应的端口
    • 存在端口,按照该端口发送
    • 不存在映射关系,所有端口都发送

路由器

  • 数据包必须含有目标IP地址
  • 通过路由表查询映射关系
    • 查到则按照该端口发送
    • 查不到,返回路由不可达的响应数据包

流程

路由器 1 连接了路由器 2,所以其路由表有了下一跳地址这一个概念

此时设备A设备F发送数据

  • 首先 A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与 F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254)。
  • A 通过 ARP 找到 默认网关 192.168.0.254 的 MAC 地址。
  • A 将源 MAC 地址(AAAA)与网关 MAC 地址(ABAB)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)封装在网络层头部,然后发包:

注意:这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化

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

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

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

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

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

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

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

至此,经过物理层、数据链路层、网络层这前三层的协议,以及根据这些协议设计的各种网络设备(网线、集线器、交换机、路由器),理论上只要拥有对方的 IP 地址,就已经将地球上任意位置的两个节点连通了。