物理层 [backcolor=rgba(255, 255, 255, 0.5)] 上面三种方式中,网线连接和集线器是完全在物理层工作,咱们就先见识下这两种方式。 [backcolor=rgba(255, 255, 255, 0.5)]网线连接 [backcolor=rgba(255, 255, 255, 0.5)] 是的,你没看错,是用一根网线连接在两个电脑上。网线水晶头的第 1、2 和第 3、6脚,分别起着发、收信号的作用,要想通过一根网线将两台电脑连接在一个局域网上,需要额外做的操作就是将网线其中一端的 1 号和 3 号线、2 号和 6 号线互换一下位置,这样就能在物理层实现一端发送的信号,另一端成功接收。 [backcolor=rgba(255, 255, 255, 0.5)] 当然,除了通过网线连接外,我们还需要配置这两台电脑的 IP 地址、子网掩码和默认网关,将这三项配置成为一个网络,否则是不通的。 [backcolor=rgba(255, 255, 255, 0.5)] 这样,一个宿舍的两台电脑就可以联机打魔兽了。 [backcolor=rgba(255, 255, 255, 0.5)] 问题来,如果又有一个舍友买了电脑,怎么把三台电脑连一起呢?先别说交换机这高档的东西,对于 15 年前的大学生来说,交换机太贵了,买不起。好在除了交换机外,还有个叫做 Hub 的东西,也就是集线器。 [backcolor=rgba(255, 255, 255, 0.5)]集线器 [backcolor=rgba(255, 255, 255, 0.5)] 这种设备有多个口,可以将宿舍里的多台电脑连接起来。和交换机不同的是,集线器很“傻”,它没有大脑,完全在物理层工作,将自己收到的每一个字节,都复制到其它端口上去。 [backcolor=rgba(255, 255, 255, 0.5)] 这就像,小明想找小红表白,他不知道小红在哪个小区,于是他就找其它小伙伴,让每个小伙伴负责一个小区,去每一户问是不是小红家,找到小红的小伙伴就将表白语告诉小红。 数据链路层[backcolor=rgba(255, 255, 255, 0.5)] 上面通过 Hub 实现局域网的方式,你可能已经发现了,Hub 采取的是广播的模式。如果每一台电脑发出的包,局域网内的其它电脑都能收到,那就麻烦了。这就需要解决几个问题: - 这个包是发给谁的?谁接收?
- 大家都在发生消息,会不会产生混乱?有没有先后的规则?
- 如果发生的时候出错了,怎么办?
[backcolor=rgba(255, 255, 255, 0.5)] 这几个问题,都是数据链路层,也就是 MAC 层要解决的问题。MAC 的全称是 Medium Access Control,即媒体介质访问控制。这里的控制,其实就是控制在往媒体上发数据时,谁先发、谁后发的问题,也就是防止发生混乱。这就解决了第二个问题。这个问题中的规则,学名叫多路访问。和我们交通管制一样,常见的有下面三种方式: - 方式一:分车道。每个车一个车道,你走你的,我走我的,互不干扰。这在计算机网络中叫做信道划分;
- 方式二:今天单号出现,明天双号出现,轮着来。这叫做轮流协议;
- 方式三:不管三七二十一,有事先出门,发现很堵,就回去等待 ,错过高峰期再走。这叫做随机接入协议。著名的以太网,用的就是这种方式。
[backcolor=rgba(255, 255, 255, 0.5)] 要解决第一个问题:发给谁?谁接收?这里用到一个物理地址,叫做链路层地址。但是因为第二层主要解决媒体接入控制的问题,所以它常常被称为 MAC 地址。 [backcolor=rgba(255, 255, 255, 0.5)] 解决第一个问题就牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标 MAC 地址和源 MAC 地址。
[backcolor=rgba(255, 255, 255, 0.5)] 接下来是类型。大部分的类型是 IP 数据包,其中 IP 里面包含 TCP、UDP,以及 HTTP 等,这些都是里层封装的事情。 [backcolor=rgba(255, 255, 255, 0.5)] 有了这个目标 MAC 地址,数据包在链路上广播,MAC 的网卡才能发现,这个包是给它的。MAC 的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP 包,发现端口是 80,而 nginx 就是监听 80 端口。 [backcolor=rgba(255, 255, 255, 0.5)] 于是就将请求提交给 nginx,nginx 返回一个网页,最后再经过层层封装,返回到 MAC 层。因为来的时候有源 MAC 地址,返回的时候,源 MAC 地址就变成了目标 MAC 地址,再返给请求的机器。 [backcolor=rgba(255, 255, 255, 0.5)] 对于以太网,第二层的最后面是 CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误,这主要解决了第三个问题。 [backcolor=rgba(255, 255, 255, 0.5)] 这里还有一个没有解决的问题,当源机器知道目标机器的时候,可以将模板地址放入包里。如果不知道呢?一个广播的网络里面接入了 N 台地址,我怎么知道每个 MAC 地址是谁呢?这就是 ARP 协议,也就是已知 IP 地址,求 MAC 地址的协议
[backcolor=rgba(255, 255, 255, 0.5)] 在一个局域网里,如果知道了 IP 地址,不知道 MAC 地址怎么办?这个在网络协议-概述中有提过,本地通信靠“吼”。 [backcolor=rgba(255, 255, 255, 0.5)] 发送一个广播包,广而告之,谁说这个 IP 谁来回答。具体询问和回答的报文就像下面这样:
[backcolor=rgba(255, 255, 255, 0.5)] 为了避免每次都用 ARP 协议,机器本地会进行 ARP 缓存。当然,缓存的 MAC 地址会有一个过期时间。 [backcolor=rgba(255, 255, 255, 0.5)] 上面解决了广播发出的包,局域网内所有机器都能收到的问题。那么 Hub 是采用怎么样的方式? [backcolor=rgba(255, 255, 255, 0.5)] 实际上,Hub 不管某个接口是否需要,所有的数据都会发送出去,然后让主机来判断是否需要相关数据。这种方式会有两个问题: - 机器数目大幅增多后,产生冲突的概率就提高了。这很好理解,那么多小伙伴去找小红,发生交通事故的概率要大于,直接去她家表白发生交通事故的概率;
- 把大量不需要发送的包发送出去,浪费资源。
[backcolor=rgba(255, 255, 255, 0.5)] 明显可以看出,要解决上面两个问题,只要我们知道哪个接口对应哪个 MAC 地址就好了。如果目标 MAC 地址不是这台电脑的,这个口就不用转发了。 [backcolor=rgba(255, 255, 255, 0.5)] 那么,谁能知道目标 MAC 地址是否就是连接某个口的电脑的 MAC 地址呢?这就需要一个能把 MAC 头拿下来,检查一下目标 MAC 地址,然后根据策略转发的设备,也就是我们之前提过的,二层设备-交换机。 [backcolor=rgba(255, 255, 255, 0.5)] 交换机怎么知道每个口对应的电脑的 MAC 地址呢?这需要交换机能学习。这个也是交换机和 Hub 最明显的区别。 [backcolor=rgba(255, 255, 255, 0.5)] 一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 电脑再哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。但是,这个时候,交换机会干一件很聪明的事情,就是交换机记住,MAC1 是来自一个明确的口,以后有包的目的地址是 MAC1 的,就直接发送到对应口就可以了。 [backcolor=rgba(255, 255, 255, 0.5)] 当交换机作为一个关卡一样,过来一段时间后,就有了整个网络的一个结构了。这个时候,基本上不用广播,全部可以准确转发。而交换机学习的结果,我们成为转发表。当然,每台机器的 IP 地址会变,所在的口也会变,所以转发表也是有一个过期时间的。
|