1 集线器
要保证网络节点间的相互通信,最简单的想法就是每两个节点间都建立一根网线,如下图所示,这样A、B、C、D、E五个节点之间就可以任意通信了。
但这种方法显然不可行,因为电脑显然没有这么多网口,即使有这么多网口,每个节点连接的网线数量为n-1,显然是不现实的。其实只要保证任意两节点间有路径可以到达,那么理论上就是可以通信的,像下面的图所示:
更进一步,如果每个节点只连一根网线,是否可以做到互相通信呢,答案是可以的,这里就要引入集线器了。
每个节点与集线器相连,包转发操作由集线器实现,集线器的转发策略是向其所连的所有节点广播包,由接收节点自己判断是否是发给自己的包。
这里就引出了一个问题,比如A要向C发送一个包,A要在包里写入什么信息才能让C知道这个包是发给自己的?答案是通过mac地址,如下图所示,我只要在数据包头部写入源mac地址和目标mac地址,就可以让接受方判断包是谁发的,是否是发给自己的。
集线器的引入使布局干净了很多(节省了网线和网口,将复杂性转移到了集线器上),但是还是存在如下问题:
- 不安全,数据包会广播,任意节点都能获得数据包信息
- 网络负载大,广播引起不必要的网络传输
其实总结起来就是一个问题:集线器不能精准地将数据包发送到目标节点。
2 交换机
交换机就是为了解决集线器问题而产生的,现在企业中基本都使用交换机,集线器已经成为历史了。
交换机是怎么解决精准转发问题的呢?答案是通过mac地址表,mac地址表的格式如下:
MAC地址 | 端口 |
---|---|
aa | 1 |
bb | 2 |
cc | 3 |
记录了mac地址和对应的mac地址连接的端口号的信息。当有数据包到交换机时,交换机解析出数据包头带的目的mac地址,通过mac地址表找到端口,然后将数据包从该端口中发送出去就可以了。
那么问题来了,这个mac地址表里面的信息是怎么建立起来的呢?显然一开始交换机中是不可能有这些信息的。答案是在转发的过程中动态建立起来的,仍以上面的A到C的数据包举例,A发送数据包给交换机,交换机从数据包中解析出源mac地址为aa,此时mac地址表中的第一条记录就可以创建起来了,即
MAC地址 | 端口 |
---|---|
aa | 1 |
交换机查找目的mac地址对应的端口,发现找不到,此时交换机就回退到了集线器,开始广播,C接收到数据包后会返回给交换机一个响应,因此,第二条记录也可以创建起来了,即
MAC地址 | 端口 |
---|---|
aa | 1 |
cc | 3 |
mac地址表的记录就是这样一步步创建好的。
至此,交换机通过mac地址表的方式解决了集线器的问题。但随着集群规模的扩大,新的问题显现了。
交换机的端口数量是有限的,随着节点越来越多,一个交换机显然连接不了所有节点,但聪明的你肯定想到了解决办法,可以通过将交换机与交换机相连来无限扩大端口数量,因为两台交换机相连各自只占一个端口,剩下的端口就可以多出来了。如下图所示:
此时交换机1和交换机2各自维护一个mac地址表,分别如下所示:
MAC地址 | 端口 |
---|---|
aa | 1 |
bb | 2 |
cc | 3 |
dd | 5 |
ee | 4 |
ff | 4 |
gg | 4 |
hh | 4 |
MAC地址 | 端口 |
---|---|
aa | 3 |
bb | 3 |
cc | 3 |
dd | 3 |
ee | 5 |
ff | 1 |
gg | 2 |
hh | 4 |
端口数量有限的问题解决了,但新的问题又浮现了,即mac地址表的大小,当集群中有几万台甚至几百万台电脑时,mac地址表已经无法记录如此庞大的信息。
3 路由器
交换机是没有mac地址的,否则我们我们可以通过下表的方式简化mac地址表信息:
MAC地址 | 端口 |
---|---|
aa | 1 |
bb | 2 |
cc | 3 |
dd | 5 |
交换机2mac地址 | 4 |
这样上述交换机的问题就不存在了,俗话说没有什么事情是引入一个中间层解决不了的,虽然交换机没有mac地址,但我们可不可以引入一个具有mac地址的中间媒介,插入两个相连的交换机中间,这样不就解决问题了?其实这就是路由器承担的功能。
通过上面的功能描述,可以发现路由器应该具有如下特点:
- 每个端口都有一个独立的mac地址
- 具有转发包的功能
引入路由器后,拓扑结构如下图所示:
引入路由器后,数据包的帧结构又有了扩展,如下图所示:
具体的构造和发送过程如下(A到C):
- 在发送前只知道源mac地址,源ip地址和目标ip信息
- 根据子网掩码和目标ip判断目标ip是否在同一个子网内,C在同一个子网内
- A可以通过arp协议(arp缓存表记录了mac地址和ip的映射关系)获得C的mac地址,将C的mac地址填入,数据包帧结构构造完毕
- 交换机1通过mac地址表查询出端口,将数据包发送给C
具体的构造和发送过程如下(A到F):
-
在发送前只知道源mac地址,源ip地址和目标ip信息
-
根据子网掩码和目标ip判断目标ip是否在同一个子网内,F不在同一个子网内
-
A通过arp协议获得默认网关(路由器与当前交换器连接端口的ip)的mac地址,将F的mac地址填入,数据包帧结构构造完毕
-
交换机1通过mac地址表查询出端口,将数据包发送给路由器
-
路由器有2步工作:
a. 修改目的mac地址为F的mac地址(路由器同样根据arp协议获得F的mac地址)
b. 根据路由算法计算出从哪个端口出去,发送给交换机2
-
交换机1通过mac地址表查询出端口,将数据包发送给路由器
-
路由器有2步工作:
a. 修改目的mac地址为F的mac地址(路由器同样根据arp协议获得F的mac地址)
b. 根据路由算法计算出从哪个端口出去,发送给交换机2
-
交换机2根据mac地址表查询出端口,将数据包发送给F