数据链路层
物理层就是只负责数据通信,就是上层数据交给我之后,我就往外发。那么,这个数据包怎么知道自己应该去往哪里呢?同时,假如大家都在发的话,势必会产生冲突,那么谁先该发?谁后发呢?怎么判断有没有发送出错?
这几个问题都是数据链路层,也就是 MAC 层要解决的问题。MAC 的全称是 Medium Access Control,即媒体访问控制,要解决的问题就是媒体接入控制的问题。
以太网相当于解决媒体接入控制问题的一种方案,只是它被使用的比较多。
谁先发,谁后发
这个问题其实就是控制在往媒体上发数据的时候,谁先发谁后发的问题,防止发生混乱。
大致有以下几种方式:
- 信道划分;
- 轮流协议;
- 随机接入协议,著名的以太网,用的就是这个方式;
发给谁,发送出错处理
这里要用到一个物理地址,叫做链路层地址,又常常被称为 [MAC 地址](#MAC 地址)。
这里会涉及到链路层的数据包格式,对于以太网来说:
- 最开始的就是目标 MAC 地址和源 MAC 地址。
- 接下去是数据包类型,有两种,一种是 IP 数据报,另一种是 ARP 请求,应答数据包等。根据数据包的类型,数据部分包含的内容也会不一样。
- 最后是 CRC,也就是循环冗余检测。通过 XOR 异或算法来计算整个包是否在发送的过程出现了错误。
MAC 地址
MAC 地址是网卡的物理地址,用 6 个字节表示。MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。
为什么需要 MAC 地址?MAC 地址相当于网卡的标识符,是唯一的标识符。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。
一个网络包要从一台机器传到另一台机器,除了要有网卡的标识符之外,还需要有定位功能。而 IP 地址则具有定位功能。好比,你要找一个人,光知道这个人的身份证号是不行的,还需要这个人的住址。
当然,MAC 地址是有一定定位功能的,只不过范围非常有限。当你根据 IP 地址找到机器所在的子网之后,就需要借助 MAC 地址来进行定位和通信了。总得来说,MAC 地址的通信范围比较小,局限在一个子网里面。例如,从 192.168.0.2/24 访问 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子网,即从 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。
相关协议
ARP 协议
当不知道目标机器的 MAC 地址的时候,怎么获取目标机器的 MAC 地址呢?这里可以使用 ARP 协议,就是已知 IP 地址,求 MAC 地址的协议。
ARP 具体的询问和回答报文格式如下所示:
使用 ARP 求 MAC 地址的方式基本是靠广播包,就是在一个局域网发送一个广播包,然后是相应 IP 的机器来回复这个广播包。整体过程如下所示:
为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然,机器会不断上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。
VLAN
在了解 VLAN 之前需要先看一下交换机的工作原理。
VLAN 又叫做虚拟机局域网,使用 VLAN 可以让一个交换机上连属于多个局域网的机器。
那么交换机怎么区分哪个机器属于哪个局域网呢?在原来二层的数据包中再加一个 TAG,TAG 里面有一个 VLAN ID,一共 12 位。12 位可以划分出 4096 个 VLAN。
这个时候也需要交换机支持 VLAN,当这个交换机把二层的头取下来的时候,就能知道相应的 VLAN ID 了,这样只有相同的 VLAN 的包才能互相转发,不同 VLAN 的包是看不到的。
可以设置交换机每个口所属的 VLAN。如果某个口坐的是程序员,他们属于 VLAN 10;如果某个口坐的是人事,他们属于 VLAN 20;如果某个口坐的是财务,他们属于 VLAN 30。这样,财务发的包,交换机只会转发到 VLAN 30 的口上。而且对于交换机来讲,每个 VLAN 的口都是可以重新设置的。一个财务走了,把他所在座位的口从 VLAN 30 移除掉,来了一个程序员,坐在财务的位置上,就把这个口设置为 VLAN 10,十分灵活。
那么交换机之间怎么连接呢?对于支持 VLAN 的交换机,有一种口叫作 Trunk 口。它可以转发属于任何 VLAN 的口。交换机之间可以通过这种口相互连接。
交换机
Hub 是广播的,不管某个接口是否需要,所有的 Bit 都会被发送出去,然后由主机来判断是不是需要的。这种把不需要的包转发出去的行为,纯属浪费。并且,这种方式在主机数量比较多的时候,产生冲突的概率就比较高。
交换机则会把 MAC 头拿下来,检查下目标 MAC 地址,然后根据目标 MAC 地址和转发策略将数据包转发到相应的端口。
转发表
那么,交换机怎么知道每个口的 MAC 地址呢?
- 一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。这个时候,交换机会记住 MAC1 是来自一个明确的口,以后有数据包的目的地址是 MAC1 的,就直接发送到这个口就行。
- 等过了一段时间之后,交换机就有了整个网络的一个结构,这个时候基本上就不用广播了,可以实现准确转发了。交换机上学习的结果,称为转发表。
- 每个机器的 IP 地址会变,所在的口也会变,因而转发表是有一个过期时间的。
相比 Hub 来说,交换机接个几十台、上百台机器都是没啥问题的。
多交换机过程
当要连接的机器变多的时候,一台交换机肯定不够用,这个时候就需要多台交换机,交换机和交换机之间连接起来,就形成了一个稍微复杂的拓扑结构。
下面以两台交换机为例,如下图所示,两台交换机连接着三个局域网,每个局域网上都有多台机器。
对于图中 LAN 中机器和交换机是怎么连接的?你可以将 LAN 处的位置理解成一个 Hub,这样就好理解了。
如果机器 1 只知道机器 4 的 IP 地址,当它想要访问机器 4 的时候,那么它必须知道机器 4 的 MAC 地址。
- 这个时候机器 1 发起广播,机器 2 收到这个广播包,但是这个广播包跟它无关,所以不干啥。而交换机 A 一开始是不知道任何拓扑信息的,所以当收到这个广播包后,采取的策略是除了广播包来的方向外,它还要转发给其他所有的网口。
- 于是机器 3 也收到了这个广播信息,但是这跟它也无关。此时,交换机 B 也能收到广播信息,但是交换机同样不知道任何拓扑信息,所以它会将这个广播转发给除广播来的方向外的其他的所有网口。
- 这个时候机器 4 和机器 5 都收到了广播信息。机器 4 这个时候回复一个 ARP 请求回答报文。于是,一个 ARP 请求就成功了。
在上述的过程中,交换机 A 和 B 都学到了这样的信息:机器 1 是左边这个网络来的。所以当机器 2 要访问机器 1 的时候,机器 2 会发起一个 ARP 请求。这个广播信息会到达交换机 A 和机器 1,但是由于交换机 A 已经知道机器 1 是不可能在右边的网口的,所以这个广播信息是不会广播到局域网 2 和局域网 3 的。同理,当机器 3 要访问机器 1 的时候,也需要发起一个广播的 ARP 请求。这个时候交换机 A 和交换机 B 都能够收到这个广播请求。交换机 A 当然知道机器 1 是在左边这个网口的,所以会把广播消息转发到局域网 1。同时,交换机 B 收到这个广播消息之后,由于它知道机器 1 是不在右边这个网口的,所以不会将消息广播到局域网 3。
环路问题
交换机的数目越来越多。当整个拓扑结构复杂了,这么多网线,绕过来绕过去,不可避免地会出现一些意料不到的情况,其中常见的问题就是环路问题。
如下图所示,当两个交换机将两个局域网同时连接起来的时候,会出现环路问题。
下面来看机器 1 访问机器 2 的过程。
一开始,机器 1 并不知道机器 2 的 MAC 地址,所以它需要发起一个 ARP 的广播。广播到达机器 2,机器 2 会把 MAC 地址返回来,看起来没有这两个交换机什么事情。但是问题来了,这两个交换机还是都能够收到广播包的。交换机 A 一开始是不知道机器 2 在哪个局域网的,所以它会把广播消息放到局域网二,在局域网二广播的时候,交换机 B 右边这个网口也是能够收到广播消息的。交换机 B 会将这个广播信息发送到局域网一。局域网一的这个广播消息,又会到达交换机 A 左边的这个接口。交换机 A 这个时候还是不知道机器 2 在哪个局域网,于是将广播包又转发到局域网二,就这样陷入循环了。
这个时候两个交换机也学不会拓扑结构。机器 1 的广播包到达交换机 A 和交换机 B 的时候,本来两个交换机都学会了机器 1 是在局域网一的,但是当交换机 A 将包广播到局域网二之后,交换机 B 右边的网口收到了来自交换机 A 的广播包。根据学习机制,交换机 B 会更新学习到的规则,也就是机器 1 在自己右边的网口。同理,交换机 A 右边的网口也能收到交换机 B 转发过来的广播包,同样也会更新学习到的规则,机器 1 在自己的右边。之后,当广播包到达局域网一之后,在左边的局域网一广播之后,两个交换机又得更新学习规则。
这样,不仅会导致两个交换机无法学到规则,而且每台机器都可能发送广播包,交换机转发的时候也会复制广播包,当广播包数量多起来之后,会导致网络拥塞。
环路问题的解决
破解环路问题最主要的方法是使用生成树算法( STP,Spanning Tree Protocol)。在数据结构中,最小生成树可以将一个带有环的图转换为一个棵树。
【接下去的内容可以看《极客时间专栏》-第 6 讲】
交换机可实现不同网段的通信吗
不能。简单来说,交换机要想实现两个不同网段的主机通信的话,需要知道另一台机器的 MAC 地址,而这个时候会用到 ARP 协议,但是呢?ARP 协议只对本网段的 IP 起作用,也就是会把另一台 PC 的地址和自己的 IP 地址进行一个计算看看是不是同网段的。由于不是同网段的,所以不会发送 ARP 请求,所以不会知道 MAC 地址。