互联网是如何组建的,为什么需要IP地址和MAC地址?

这是我初学计算机网络时经常思考的一个问题,最近花时间整理成文,分享给大家。

简单来说,数据包需要在网络中的主机、交换机、路由器之间传递,而IP地址是每个网络设备的唯一标识,使用IP地址作为每一次传输的起点和终点不行吗?

而实际的做法是,只记录源IP和目的IP,而是使用不同的MAC地址来完成数据包的接力传输。为什么?

IP地址是动态分配的,属于逻辑的唯一地址。而MAC地址的特点是,它是终生唯一的物理地址。

所以,MAC地址可以用来验证,这条消息是否确实是要发给这台网络设备的

1、MAC地址的设计早于IP地址

  • 在网络早期,还没有局域网和IP的概念

  • 可以让两台计算机之间直接发送数据,也就是扯一根网线。

    • 此时完全不需要MAC地址,因为网线的另一头就是目标主机,不涉及任何身份验证和寻址操作

  • 但是,如果想要实现一台主机能跟多台主机连通网络,采用这种一对一的形式就必须给一台主机安装N张网卡,获得N个网线插口,再通过网线把计算机都两两连接起来。

    • 此时也不需要MAC地址,只要记录每台主机对应的网卡,直接发送数据就行,因为网线的另一头就是目标主机

  • 但这种方案不好,所以后来使用了集线器,其实就是一个多通,把所有计算机都连接起来了。

    • 此时就需要MAC地址了,它的作用是确认身份

2、集线器下的局域网

  • 它采用的方案是,一台主机发出消息,它携带了源MAC地址和目的MAC地址,将它发送给集线器

  • 集线器会把这个数据包广播给所有连接的主机(除了发这个数据包的主机),也就是整个局域网。集线器是不会进行任何判断的,是否接收消息由收到消息的主机自行判断

  • 每台主机收到数据包后,会检查自己的MAC地址和数据包的目的MAC地址是否相同,如果相同就接收,不相同就丢弃

  • 所以从历史发展上,MAC地址就是服务于两个网络设备之间传递数据包的。

3、集线器升级为交换机

  • 集线器的全体广播行为限制了网络的性能,所以设计了交换机,希望做到单播

  • 交换机内部维护了一张MAC地址表,存储了MAC地址与交换机各端口之间的映射关系

  • 这样就可以读取数据包的目的MAC地址,找到该主机对应的端口,然后只向该端口发送数据。

  • 该端口的网线另一头就是目标主机,所以这种方式很有效。

4、交换机的MAC地址表如何建立

  • 交换机在接收到数据包之后,会根据它的端口和源MAC地址,在MAC地址表中建立起一条映射,这称为“学习一个MAC地址”

  • 之后,检查MAC地址表中是否包含目的MAC地址和端口号的映射条目,如果有就直接发送出去

  • 如果没有,就将数据从除了该数据包发送进来的端口以外的其他端口,广播出去。

  • 其余的所有主机都会收到这个数据包,检查自己的MAC地址与数据包的目的MAC地址是否相等。如果相等,就响应一个数据包,携带自己的MAC地址

  • 交换机收到这个数据包,也就建立起了一条端口和MAC地址的映射。下次这两台主机再通信,就不用广播了。

  • 一个接口可以对应多个MAC地址,而一个MAC地址只能对应一个接口。

5、多台交换机组成的局域网

  • 一台交换机就可以组起一个小的局域网,那么两个局域网之间想要发送消息,怎么办?

  • 其实还是一样的,把交换机看做原先的一台主机,只需要把两个局域网的交换机扯一根网线连接起来就行了,组成一个大的局域网

  • 也能正常工作,主机向另一个局域网的主机发送数据包,携带源MAC地址和目的MAC地址(此处假设目的MAC地址是已知的)

  • 注意,交换机是没有MAC地址的,它只相当于一个具有逻辑功能的集线器。

  • MAC地址表尚未建立的情况:

    • 数据包发到局域网1的交换机A,交换机A学习源MAC地址,发现没有目的MAC地址的条目,就进行广播

    • 局域网1的其他主机,以及交换机B都收到了数据包,交换机B学习源MAC地址,发现没有目的MAC地址的条目,就进行广播

    • 局域网2的所有主机都收到了数据包,目标主机进行了响应,源MAC是自己,目的MAC是局域网1的那台主机

    • 交换机B收到消息,学习MAC地址,把消息发给对应的端口,另一头是交换机A

    • 交换机A收到消息,学习MAC地址,把消息发给对应的端口,另一头是目标主机。

    • 整个通信的过程,主机和交换机都是不知道其他交换机的存在的,交换机只是对端口发送消息,不知道端口连接的是什么

  • MAC地址表已经建立的情况:

    • 数据包源MAC地址是主机A,目的MAC地址是主机B

    • 交换机A收到数据包,把数据包发送给F3端口

    • 交换机B收到数据包,把数据包发送给F5端口

    • 主机B收到消息

互联网是如何组建的,为什么需要IP地址和MAC地址?_第1张图片

6、用交换机组成互联网的弊端

  • 首先,连接起来很麻烦。两台交换机连接属于一对一的连接,如果想以这种方式把世界的所有计算机连接成一个局域网,每台交换机至少得连接几百个其他的交换机。

    但是这个问题是有解决方案的,使用一样的策略,给交换机之间做一个交换机,这个大的交换机把所有小的交换机连接起来,小的交换机再把每台计算机连接起来,就能实现全球互连。

  • 其次,这也是最大的问题:每一台交换机都必须维护整个局域网的所有主机的MAC地址与端口映射信息

  • 如果局域网规模过于庞大,首先交换机的内存不足以存下这么大的MAC地址表,如果引入缓存淘汰策略,那么在网络的高峰期,基本相当于是缓存全部失效,只能全部走广播,整个互联网会瘫痪掉。

  • 其次,在这么大的MAC地址表上,查询指定的条目的效率是O(n),效率很低。

7、如何有效地连接无数个交换机

  • 已经分析过了,如果使用交换机来连接交换机,那么不管连接了多少层交换机,本质都是把所有的主机都连接在了一个交换机上

  • 所以把交换机连接起来的最好办法,其实是隔离交换机

    给每个局域网都引入一台“设备”,它也有自己的MAC地址,连接在交换机上(或者别的路由器上)。

    做一台大的交换机,连接所有的“设备”。如果经由这个“设备”进行通信,那么每个交换机只需要保存这台“设备”的MAC地址映射就够了,而不需要保存它背后的若干台主机的MAC地址。

  • 隔离的目的达到了,还需要连通。所以这台“设备”还需要具备发送数据包的能力。

  • 此时就出现了问题:原本的数据包,目的MAC地址是目标主机,那么这个数据包肯定不会被“设备”接收到,也就无从发送。

  • 后续表述起来比较麻烦,暂且透露这个“设备”叫路由器。

8、如何让路由器能正确接收局域网发给它的数据包

有两种方式。

  • 第一种是规范MAC地址。

    • 比如规定MAC地址的前几位代表指定路由器的地址

    • 这样路由器就可以根据目标MAC地址的前几位,判断是不是发给自己的,然后接收它

    • 这个逻辑上可行,但是很难做到,因为首先,世界上现有的网卡都不可用了,因为MAC地址不合规范。其次,全世界的网络设备生产商都要统一这个规范。

  • 第二种方案,是给每台网络设备发放一个逻辑地址,这就是IP地址。

    • 具体的处理方式还是和上面一样,规定IP地址的前几位表示路由器的地址,路由器就能收到这个数据包

    • 这就解释了为什么需要IP地址,因为不方便去重新定义MAC地址了,所以又增加了一种地址指向同一台设备。

9、路由器如何正确转发数据包

主机要发送一个数据包,它包含源IP和目的IP

  • 如果源IP和目的IP属于同一个子网,就由交换机在局域网内直接转发,不经过路由器

  • 如果源IP和目的IP不属于同一个子网,就交给路由器进行转发

主机只能直接给相同子网的设备发送数据包,这是因为它们之间存在局域网连接。

那么主机要发给别的子网,如何知道哪个设备是路由器,进而把数据包交给它?

  • 每个主机都配置了一个默认网关,就是它局域网内路由器的IP

  • 可以通过ARP获得这个路由器的MAC地址

路由器如何把数据包发送到目的地?

路由器连接着很多其他的路由器或者交换机,所以它也是需要做端口选择的工作。

和MAC地址表类似,路由器需要维护一个路由表,包含每个IP地址对应的子网掩码,下一跳的IP地址,以及它对应的端口。

这样,路由器只需要查看数据包的目的IP地址,查看路由表,选择一个端口把数据发送出去即可。

也就是说,根据路由表可以得到目标的IP地址,然后借助ARP缓存表或者ARP协议,就能得到目标MAC地址

你可能感兴趣的:(仓鼠的计算机基础,网络,网络协议,服务器)