物理层
假如我们自己来尝试搭建一个局域网,首先要有两台以上的机器还有用来连接机器的设备。先从最简单的两台机器开始。我可以用两台电脑,用一根网线互相连接,不过要把1,3和2,6线口互换才能做到一端发送一端接收。然后给两台电脑配置同一网段的ip,这样两台电脑的局域网就好了。
现在电脑多起来了,上面的方式肯定不好使了。我们可以用一个集线器就是bub,所有电脑都连接这个hub上,集线器通过广播的方式发送信息,每台电脑向网络中发消息都会通过集线器广播。
这样物理层,也就是一层设备搭建就完成了。但是我们还要考虑以下几个题
1. 消息要发向谁?谁来接收消息
2. 多台机器同时发送消息会不会出现乱套,有没有先后循序的机制
3. 发送消息过程中如果出错如何处理
链路层
以上的三个问题其实就是二层要考虑的问题,也就是网络链路层,也就是mac层,先来看看 一个消息体组成成分:
目标MAC制定了数据要发送的主机物理链路地址,这就解决了第一个问题。接下来就是类型,大部分类型是IP数据包,IP数据包中有包含TCP包,UDP包以及HTTP包等,这些都是上层的协议内容了。 数据包被广播出去后,对应目标MAC的主机接收到数据包,打开mac头发现ip是自己的,然后就继续打开TCP包发现端口是自己的也就是80,假如要访问的网站服务通过Nginx代理,Nginx监听的就是80端口。然后请求就交给Nginx,Nginx返回一个网页,把返回数据也打到一个数据包中原路返回,不过目标MAC和源MAC要反过来。
对于第二个问题我们称之为“多路访问”,有以下解决方案
一是信道划分,分多个通道,你走你的我走我的,互不干扰
二是轮流协议,就是这段时间一部分通道可用,过一段时间另外一部分通道可用。
三是“随机接入协议”,不管三七二十一就是发,走不通就回去。
以太网就是用第三个协议。
对于以太网,最后一段是CRC,也即是循环冗余检测,他通过XOR异或算法检测发送过程中是否出现了错误,主要解决第三个问题。
还有个问题就是我已经知道目标MAC地址的话就把他放到请求包头中,如果不知道呢,这个时候要通过IP获取MAC地址,就是ARP协议。为了避免每次访问都要经过ARP协议,主机会把获取到的MAC地址在本地缓存,并定期清理。
到此为止用hub就可以搭建一个稍大一点的局域网。但是hub有个缺点就是所有的请求都是广播,不管接收者是谁就一并转发。导致每个主机都要判断这个请求是不是我需要的。这样一是资源比较浪费,而且一旦机器多起来了难免不出现混乱。还是需要一个能记住MAC地址的设备。这就是二层设备交换机。交换机在转发请求的时候第一次除了广播消息之外还会把目标MAC记录下来,这样下次同样发送到这个目标mac的数据包就不用转发给其他机器了,一段时间后交换机通过学习就会有所有主机的MAC地址,之后每次转发都只会转发到目标MAC主机。所以通过交换机你就可以搭建更大的局域网而无忧了。