程序锅

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于

  • 搜索
基础知识 Etcd LeetCode 计算机体系结构 Kubernetes Containerd Docker 容器 云原生 Serverless 项目开发维护 ELF 深入理解程序 Tmux Vim Linux Kernel Linux numpy matplotlib 机器学习 MQTT 网络基础 Thrift RPC OS 操作系统 Clang 研途 数据结构和算法 Java 编程语言 Golang Python 个人网站搭建 Nginx 计算机通用技术 Git

网络基础 | 数据链路层【专栏摘记】

发表于 2021-09-21 | 分类于 网络 | 0 | 阅读次数 2925

数据链路层

物理层就是只负责数据通信,就是上层数据交给我之后,我就往外发。那么,这个数据包怎么知道自己应该去往哪里呢?同时,假如大家都在发的话,势必会产生冲突,那么谁先该发?谁后发呢?怎么判断有没有发送出错?

这几个问题都是数据链路层,也就是 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 地址。

image-20211024163159730

卷死我
dawnguo 微信支付

微信支付

dawnguo 支付宝

支付宝

  • 本文作者: dawnguo
  • 本文链接: /archives/77
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 网络基础
网络基础 | 物理层【专栏摘记】
网络基础 | IP 层【专栏摘记】
  • 文章目录
  • 站点概览
dawnguo

dawnguo

215 日志
24 分类
37 标签
RSS
Creative Commons
© 2018 — 2025 程序锅
0%