- 交换机的如何记录mac地址的呢?
- 其实交换机中维系了一张表
- 一个mac地址对应一个端口
-
如果机器1想要跟机器3通讯,
-
他就会将数据发送到交换机
-
交换机会到自己维系的这张地址端口去看,发现mac3对应的是三号口
-
他就会将一号口发过来的消息从三号口发出去
-
3最终就收到这个消息了
-
优化
-
交换机这种工作方式下,我不再需要将这个数据进行广播。
-
第二点,交换机的一个特点是它是全双工的
-
全双工
-
上面提到的集线器大多是双绞线
-
双绞线在工作的时候只能有一台设备进行数据发送的。
-
交换机这里使用的就是我们现在的网线了
-
网线里面是有八根线的,正常情况下至少有四根线在工作。
-
这种方式下,可以实现数据的全双工,
-
在一号发送的时候,同时也可以进行数据的接受,链路上的数据也不会产生冲突。
那么交换机上面的表是怎么建立起来的呢?
-
我们拿到交换机的时候,可以连接一些设备,
-
一开始的时候,交换机里面是没有这张表的,或者是一张空表。
-
那他是怎么建立起映射关系的呢?
-
比如我们首先A要向B发送数据,
-
A发送数据上来以后,发现这张表中没有任何数据
-
同时A发送上来以后,他确定一个消息,这个A的地址对应的是一号口,
-
所以他将macA对应一号口这件事情记录到这张表里面。
-
现在他的目的地址是B,他去找B的时候发现找不到,
-
找不到的时候,就往每个端口分别进行发送,
-
其中四号端口是B,B做出了回应,
-
这个时候就会将macB记录到这个表中,他对应的是四号口
-
经过一点时间的记录以后,交换机最终就维护起了一个所有mac地址和端口的映射关系
-
交换机所在的这一层是数据链路层
-
数据链路层的数据分数据头,数据部分
-
数据头中记录了原地址、目的地址,这里的地址指的mac地址
优点
- 这个方式是对集线器巨大的改进,可以看到我们日常生活中其实集线器已经很少见了,因为大多数时候我们都使用交换机,交换机的效率更高
- 交换机还有一个特点,就是可以进行桥接
- 比如我们有两个交换机,我们就可以通过他们上面的两个端口进行桥接
- 桥接之后会产生一个现象
- 假如我们这台设备上有A、B两个设备,另一台有C、D两个设备。
- 经过一段时间,交换机1中就维系了一个表
- A对应1号口,B对应4号口
- A向C发送消息的时候,他其实没有找到,那他就会全部广播发送,
- 广播到最后一个口的时候,就会到第二个交换机,
- 交换机2里面其实已经记录了,C对应4号口,D对应3号口
- 他就找到了C,最终发到了交换机2的4号口。
- 发送完之后,交换机2会记录,A对应1号口,当然之后B也往这边发送数据的时候,他会记录B对应1号
- 交换机1同样会记录
- 我们的家庭交换机一般情况下,表的大小是在几千左右,
- 注意:这里的mac和端口映射的表不是我们通常所说的路由表,因为他还没有到路由那一层,他只是交换机
缺点
那我们看一下,当前设计方式下,还有什么弊端。
- 几千的存储量是比较小的,如果我们想要在全球范围内建立目前的计算机互联网络,几千个端口肯定是不够的,那可能需要几十亿个,如果没有对应的路由信息的话,他就会一直广播,就会导致全球范围内的消息洪泛
- 目前,使用交换机和mac地址结合的这种方式,可以在一个比较小的局域网内达到一个高效的传输,比如说几千个设备组成的局域网,这个网络可能是整个校园网,或者一个工作室或者一个家庭中的网络。
补充
- 网络内部使用交换机,他的效率还是很高的。
- 上面讲的集线器这种其实是在物理层,下面讲的交换机mac地址的这种方式是在数据链路层
- 比较有意思的是,mac地址位于数据链路层,却叫物理地址。
- 物理层是比较早期的一种设计方式,通过电信号,后来我们其实比较关注数据层面,所以就放到了数据链路层
- 每一台设备需要有一个标识,这个标识从概念上来讲确实是一个物理地址。
路由器:
演变
- 上面交换机的方式,他最大的一个优势是在网络内部可以进行高效的传输。
- 当网络扩大以后,比如多个网络合成一个大的网络
- 这个大网络下,可能交换机中的表可能记录不过来,我需要不停地广播,广播的效率又比较低。
- 所以在跨网络的时候,我们提出了一种新的方案,我们定义一个新的设备,通过新的设备连接不同的网络,新的设备我们叫他路由器。有时候也会叫做网关。因为他是在跨两个网络之间的一个连接点。
- 有了路由器之后,我们不同网络之间的设备
- 比如设备1和设备2进行通信的时候,
- 他就是通过路由器进行转发,如果是设备1 和设备3进行通讯,就不需要经过路由器,直接在网络内部进行转发就可以了。
- 网络内部通过这个交换机通讯,他的效率是很高的。所以1和3 的通信直接走交换机。1和2 之间的通讯才会走路由器。
ip
- Ip地址的出现:
- 网络其实是一个比较抽象的概念,并没有说,我划定北京朝阳区是一个网络,我划定北京市海淀区是另一个网络,
- 我们需要标识这个网络,以及网络中的每个设备,就需要提供另一个标识,这个表示就是ip地址,
- IP地址有两个作用:
- 一个是用来标识网络,
- 一个是用来标识设备的,
- 上面是用mac地址标识设备,这里又提出了ip地址
- ip地址主要是用来标识设备在哪个网络下,是为了在抽象网络中做出的一个关联。
- 所以每台地址又有了一个ip地址。
- mac地址:设备唯一性,设备一般不会变
- Ip地址:设备所在网络位置的唯一性,网络位置是会变的,比如搬家换网络了。
- 比如:
- 我家庭的网络是:192.168.0.0/24(这个网络号也是一种类似于IP的形式,他就用来标识我整个网络2)
- 我的设备:我的设备是192.168.0.102(这个ip地址就用来标识我当前的设备)
我ping一下192.168.1.254,发现是可以ping通的。
- 1.254是隔壁老王的ip,我们共用了光猫。
- 能ping通的原因:
- 当前的这个网络中,每一台设备都有自己维护的路由表的,路由器也是有路由表的
- 我的ip是0.102,我自己的路由表自己会记录192.168.0.1,
- 0.1是在什么地方呢?0.1在路由器上。他就会把数据包发到路由器上,
- 这个路由器自己也有一张路由表,因为路由器自己也是也linux系统,
- 他这个路由表中记录了192.168.1.0这个网络的端口,进过这个端口转发到网络1
- 然后1.254和网络1是在同一端口中,所以很容易找到了1.254
-
可以看出路由器工作的主要原理:
-
它既有网络1的ip,又有网络2的ip
-
这里还有两个问题:
-
1.路由表是如何建立的?
-
路由表其实是比上面交换机中的这个地址端口映射表要复杂很多,
-
他用到了很多路由的算法,这里就不展开讲了
-
路由器经过一系列的算法会自动建立出一个完善的路由表
-
2.从路由器转发到网络1后,是怎么到达1.254的?就是网络内的传输是怎么进行的?
-
如果你认为ip地址能直接找到,那是不是不需要mac地址了?
-
有了ip地址,还需要mac地址吗?
-
我们先回到引入路由器的初衷,是为了跨网络的时候进行数据的转发,这个ip其实是一个抽象的ip,ip是不能直接用作通讯的,我们只能使用mac地址进行直接通讯。
-
因为mac地址是一个真实的地址。
-
所以路由器端口到1.254的过程是这样的,
-
首先,他会去查1.254的mac地址,根据一个ip地址去查mac地址,这里其实有个协议叫ARP协议,
-
ARP协议其实是去网络中广播谁的ip是1.254,1.254收到以后就会回复mac地址
-
然后就可以在mac层进行传输了。
Mac层又叫数据链路层,路由器这一层又叫网络层,实际上网络传输全都是走的mac地址
- 这个ip层数据包可以对照mac层看一下
- 我们可以把刚才mac的包拿过来
- Mac的数据头有一个源地址,一个目的地址,这里的地址指的是mac地址
- Mac的数据部分就是一整个ip的包
- Ip的包也分头和数据部分
- ip的头部分包的就是ip的源地址、目的地址
- 最终里面才是ip的数据
- 当然越往上还有tcp、http层的头,一层一层往上包,最后才是我们传输的那个数据部分。
- 我们看整个网络传输的过程 0.102 -> 1.254
- 第一步,0.102 -> 0.1,是先用ARP协议查0.1的mac地址,我的目的地ip是0.102,目的mac地址是1.254的mac地址,这样包可以传到0.1
- 第二步,0.1传到网络1在路由器中记录的端口ip(假设是1.52)虽然是本机,但是也是网卡之间的传输,目的地mac地址变成1.52的mac地址
- 第三部,1.52 -> 1.254,mac目的地址就变成了1.254的mac地址,最终将数据发送过来
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
《设计思想解读开源框架》
第一章、 热修复设计
-
第一节、 AOT/JIT & dexopt 与 dex2oat
-
第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题
-
第三节、热修复设计之热修复原理
-
第四节、Tinker 的集成与使用(自动补丁包生成)
第二章、 插件化框架设计
-
第一节、 Class 文件与 Dex 文件的结构解读
-
第二节、 Android 资源加载机制详解
-
第三节、 四大组件调用原理
-
第四节、 so 文件加载机制
-
第五节、 Android 系统服务实现原理
第三章、 组件化框架设计
-
第一节、阿里巴巴开源路由框——ARouter 原理分析
-
第二节、APT 编译时期自动生成代码&动态类加载
-
第三节、 Java SPI 机制
-
第四节、 AOP&IOC
-
第五节、 手写组件化架构
第四章、图片加载框架
-
第一节、图片加载框架选型
-
第二节、Glide 原理分析
-
第三节、手写图片加载框架实战
第五章、网络访问框架设计
-
第一节、网络通信必备基础
-
第二节、OkHttp 源码解读
-
第三节、Retrofit 源码解析
第六章、 RXJava 响应式编程框架设计
-
第一节、链式调用
-
第二节、 扩展的观察者模式
-
第三节、事件变换设计
-
第四节、Scheduler 线程控制
第七章、 IOC 架构设计
-
第一节、 依赖注入与控制反转
-
第二节、ButterKnife 原理上篇、中篇、下篇
-
第三节、Dagger 架构设计核心解密
第八章、 Android 架构组件 Jetpack
-
第一节、 LiveData 原理
-
第二节、 Navigation 如何解决 tabLayout 问题
-
第三节、 ViewModel 如何感知 View 生命周期及内核原理
-
第四节、 Room 架构方式方法
-
第五节、 dataBinding 为什么能够支持 MVVM
-
第六节、 WorkManager 内核揭秘
-
第七节、 Lifecycles 生命周期
-
第七节、 Lifecycles 生命周期
[外链图片转存中…(img-qHci9a85-1712889647586)]
本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
[外链图片转存中…(img-E2Ne42It-1712889647586)]