四、从物理层到 MAC层
第一层(物理层)
网线,有两个头。一头插在一台电脑的网卡上,另一头插在另一台电脑的网卡上。普通的网线这样是通不了的,所以水晶头要做交叉线,用的就是所谓的1-3、2-6 交叉接法。水晶头的第 1、2 和第 3、6 脚,它们分别起着收、发信号的作用。将一端的 1 号和 3 号线、2 号和 6 号线互换一下位置,就能够在物理层实现一端发送的信号,另一端能收到。
当然电脑连电脑,除了网线要交叉,还需要配置这两台电脑的 IP 地址、子网掩码和默认网关。这三个概念上一节详细描述过了。要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是 192.168.0.1/24,另一个是 192.168.0.2/24,否则是不通的。
两台电脑之间的网络包,包含 MAC 层吗?当然包含,要完整。IP层要封装了 MAC 层才能将包放入物理层。到此为止,两台电脑已经构成了一个最小的局域网,也即LAN。
怎么把三台电脑连在一起呢?Hub,也就是集线器。这种设备有多个口,可以将宿舍里的多台电脑连接起来。但是,和交换机不同,集线器没有大脑,它完全在物理层工作。它会将自己收到的每一个字节,都复制到其他端口上去。这是第一层物理层联通的方案。
第二层(数据链路层)
Hub 采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。这就需要解决几个问题:
- 这个包是发给谁的?谁应该接收?
- 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
- 如果发送的时候出现了错误,怎么办?
这几个问题,都是第二层,数据链路层,也即 MAC 层要解决的问题。MAC的全称是Medium Access Control,即媒体访问控制。其实就是控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱。这解决的是第二个问题。这个问题中的规则,学名叫多路访问。 有很多算法可以解决这个问题。比如接下来这三种方式:
- 分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分;
- 今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议;
- 不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这个方式。
接下来要解决第一个问题:发给谁,谁接收?这里用到一个物理地址,叫作链路层地址。但是因为第二层主要解决媒体接入控制的问题,所以它常被称为MAC 地址。解决第一个问题就牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标的MAC 地址和源的 MAC 地址。
接下来是类型,大部分的类型是 IP 数据包,然后 IP 里面包含 TCP、UDP,以及 HTTP等,这都是里层封装的事情。有了这个目标 MAC 地址,数据包在链路上广播,MAC 的网卡才能发现,这个包是给它的。MAC 的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP包,发现端口是自己,也就是 80,而 nginx 就是监听 80。
对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误,主要解决第三个问题。
这里还有一个没有解决的问题,当源机器知道目标机器的时候,可以将目标地址放入包里面,如果不知道呢?一个广播的网络里面接入了 N 台机器,我怎么知道每个 MAC 地址是谁呢?这就是ARP 协议,也就是已知 IP 地址,求 MAC 地址的协议。
为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。
局域网
上面这种组网的方法,对一个宿舍来说没有问题,但是一旦机器数目增多,问题就出现了。因为Hub 是广播的,不管某个接口是否需要,所有的 Bit 都会被发送出去,然后让主机来判断是不是需要。这时这就需要一个能把MAC 头拿下来,检查一下目标 MAC 地址,然后根据策略转发的设备,我们称为交换机,这个设备显然是个二层设备。
一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。这个时候,交换机会记住,MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的,直接发送到这个口就可以了。交换机上的学习的结果,我们称为转发表,是有一个过期时间的。
五、交换机与 VLAN
拓扑结构是怎么形成的?
多台交换机之间连接起来,就形成一个稍微复杂的拓扑结构。
一个交换机代表着一个局域网,交换机互联就是局域网互联。
如何解决常见的环路问题?
一开始,机器 1 并不知道机器 2 的 MAC 地址,所以它需要发起一个 ARP 的广播。广播到达机器 2,机器 2 会把 MAC 地址返回来,但是问题来了,这两个交换机还是都能够收到广播包的。交换机 A 一开始是不知道机器 2在哪个局域网的,所以它会把广播消息放到局域网二,在局域网二广播的时候,交换机 B右边这个网口也是能够收到广播消息的。交换机 B 会将这个广播息信息发送到局域网一。局域网一的这个广播消息,又会到达交换机 A 左边的这个接口。交换机 A 这个时候还是不知道机器 2 在哪个局域网,于是将广播包又转发到局域网二。这样也会破环交换机学习的转发表。
STP协议中那些难以理解的概念
在数据结构中,有一个方法叫作最小生成树。有环的我们常称为图。将图中的环破了,就生成了树。在计算机网络中,生成树的算法叫作STP,全称Spanning Tree Protocol。
- Root Bridge,也就是根交换机。这个比较容易理解,可以比喻为“掌门”交换机,是某棵树的老大,是掌门,最大的大哥。
- Designated Bridges,有的翻译为指定交换机。这个比较难理解,可以想像成一个“小弟”,对于树来说,就是一棵树的树枝。所谓“指定”的意思是,我拜谁做大哥,其他交换机通过这个交换机到达根交换机,也就相当于拜他做了大哥。这里注意是树枝,不是叶子,因为叶子往往是主机。
- Bridge Protocol Data Units (BPDU) ,网桥协议数据单元。可以比喻为“相互比较实力”的协议。行走江湖,比的就是武功,拼的就是实力。当两个交换机碰见的时候,也就是相连的时候,就需要互相比一比内力了。BPDU 只有掌门能发,已经隶属于某个掌门的交换机只能传达掌门的指示。
- Priority Vector,优先级向量。可以比喻为实力 (值越小越牛)。实力是啥?就是一组ID 数目,[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID]。为什么这样设计呢?这是因为要看怎么来比实力。先看 Root Bridge ID。拿出老大的 ID 看看,发现掌门一样,那就是师兄弟;再比 Root Path Cost,也即我距离我的老大的距离,也就是拿和掌门关系比,看同一个门派内谁和老大关系铁;最后比 Bridge ID,比我自己的 ID,拿自己的本事比。
STP的工作过程是怎样的?
一开始,所有的交换机都认为自己是掌门,每个网桥都被分配了一个 ID。这个 ID 里有管理员分配的优先级,当然网络管理员知道哪些交换机贵,哪些交换机好,就会给它们分配高的优先级。
既然都是掌门,互相都连着网线,就互相发送 BPDU 来比功夫呗。赢的接着当掌门,输的就只好做小弟了。当掌门的还会继续发BPDU,而输的人就没有机会了。它们只有在收到掌门发的 BPDU 的时候,转发一下,表示服从命令。
- 掌门遇到掌门
输掉的掌门会率领所有的小弟归顺。赢得成为大掌门。 - 同门相遇
同门相遇可以是掌门与自己的小弟相遇,这说明存在“环”了。
同门相遇还可以是小弟相遇。这个时候就要比较谁和掌门的关系近,当然近的当大哥。 - 掌门与其他帮派小弟相遇
小弟拿本帮掌门和这个掌门比较,赢了,这个掌门拜入门来。输了,会拜入新掌门,并且逐渐拉拢和自己连接的兄弟,一起弃暗投明。 - 不同门小弟相遇
如何解决广播问题和安全问题?
有两种分的方法,一个是物理隔离。就是每个部门有单独的交换机,配置单独的子网,这样不同子网之间的沟通就需要路由器了。
另外一种方式是虚拟隔离,就是用我们常说的VLAN,或者叫虚拟局域网。使用 VLAN,一个交换机上会连属于多个局域网的机器。
只需要在原来的二层的头上加一个 TAG,里面有一个 VLAN ID,一共 12 位。为什么是 12 位呢?因为 12 位可以划分 4096 个 VLAN。
如果我们买的交换机是支持 VLAN 的,当这个交换机把二层的头取下来的时候,就能够识别这个 VLAN ID。这样只有相同 VLAN 的包,才会互相转发,不同 VLAN 的包,是看不到的。这样广播问题和安全问题就都能够解决了。
对于支持 VLAN 的交换机,有一种口叫作Trunk 口。它可以转发属于任何 VLAN 的口。交换机之间可以通过这种口相互连接。