计网学习笔记(二):主机间如何实现互联互通

218 阅读12分钟

前文:计网学习笔记一:认识网络,一些凌乱的名词与概念简单介绍了计网的一些概念,下面更进一步认识网络。

尽管如今网络的发展已经非常成熟,大家都已经习惯了无线的联网方式,但现在让我们回到90年代,该如何实现设备的互联互通?

两台主机如何实现互联互通

实际上,仅凭物理层就可以形成网络,两台主机用网线相连,即可通信,但是我们必须把IP设在同一网段。

而主机数量多了,我们没办法用网线将所有主机两两连接,主机没那么多端口,因此集线器可以解决多主机形成网络的问题。

二十台主机如何实现互联互通

集线器版本

集线器工作在物理层。集线器会将自己收到的每一个字节,都复制到其他端口上去。正因为这个特性,会造成许多不必要的数据传输,因此「以太网」,一种局域网组网技术,并没有采用集线器连接设备,而是采用了交换机。

交换机版本

交换机是一种更加聪明的设备。但交换机不属于物理层,而是数据链路层。为了了解交换机的工作原理,首先得聊聊MAC。

媒体访问控制层:MAC

MAC,Media Access Control,媒体访问控制。MAC是数据链路层的一部分。

MAC的功能主要是:

  • 寻址,将数据包从一个网络接口卡(NIC)移动到另一个
  • 避免多个节点同时传输数据而导致的数据冲突

MAC的数据冲突的典型协议是:CSMA / CA

全局唯一MAC地址

MAC地址是全局唯一的,由IEEE分配,每个网卡都有一个独一无二的MAC地址。

MAC地址48位,一般用十六进制表示。

ff:ff:ff:ff:ff:ff为广播地址。

实际上,现在用软件改变网卡的MAC地址现在是可能的,但你暂时不需要担心它的全局唯一性不成立。

MAC报文格式

有了MAC地址,我们就可以在报文中指定MAC地址,这样,为了实现「不会像集线器无脑转发,而是只转发给特定的目标」,我们就迈出了第一步。我们来看一下MAC报文格式,在数据链路层传输的数据包,我们叫做「帧」

18.jpg

MAC 包头的协议类型只使用:

  • 0800 : IP 协议,大部分情况也都代表当前以太网数据包是个IP数据包,里面还封装着TCP,HTTP等
  • 0806 : ARP 协议,用于已知IP地址,求MAC地址,下面马上就会讲这个东西

协议类型之后是数据,如果协议类型是IP,就是IP数据包。最后还会有4位CRC冗余循环码,用于差错检验

由IP获取MAC:ARP协议

但现在的问题是:源主机只知道目的主机的IP地址,该如何知道对方主机的MAC地址呢?答案是ARP协议。

  • 从抽象的角度来说,由于以太网是总线拓扑,因此会向所有主机进行「广播」。
  • 但具体一点地说,主机只与交换机相连,因此只会发给交换机,交换机再进行「广播」行为。

通过广播,与IP地址相匹配的目的主机就给一个回信,告知源主机它的MAC地址,就可以通信了。

那什么是广播呢?

MAC广播

通过显式地将接受方MAC地址指定为:fffffffff,即代表是一个MAC广播。

当交换机发现是一个MAC广播时,会将这个数据包给所有端口都转发一份。

ARP缓存

你会发现:ARP不还是广播吗,依然会造成很多不必要的资源浪费。

但是ARP是可以缓存的,即对于一台主机,可以维护若干 「IP地址 - MAC地址」的键值对,那么下一次通信,不需要广播,就可以拿到对方的MAC从而让交换机聪明的转发。

但是,交换机拿到了目标MAC,怎么知道该发往哪里呢?

交换机基本工作原理

交换机有若干个接口(或者叫端口,在基础概念已经介绍),通常是几十个,这些接口可以通过网线物理连接到某一个主机,或是另一台交换机,从而构成一个局域网,也可以连接到一个路由器从而跨网通信,但这就是后文要说的了。

为了实现「只转发给特定的目标」的伟大目标,交换机在转发时,需要将数据包仅转发给与帧的目标MAC匹配的节点或是主机,那自然也需要维护一张表,叫做交换机表,表项为「MAC地址 - 交换机端口 - 时间」。

image-20231008185706139.png

[start]

当交换机收到一个来自端口x的帧,且该帧的目标MAC为m0:

  • 如果存在匹配的表项,即表中存在key为m0的表项,其端口为y:

    • 如果y = x,直接丢弃
    • 如果y != x,只转发给端口y,不会广播。
  • 如果不存在匹配的表项,向所有除了x的端口转发帧,即「广播」

    • 收到「广播」的主机,发现MAC不匹配,会直接丢弃;
    • 收到「广播」的交换机,回到[start]处重复这个流程(套娃)
  • 这个过程进行了广播,该交换机虽然不知道MAC的目标地址在哪,但可以知道发这个数据包的MAC - 端口信息,并维护MAC - 端口

[end]

考虑到正确性,「MAC地址 - 交换机端口」的表项是会过期的,因此还维护了时间。

区分ARP与交换机缓存表

ARP是针对主机的,因为通过IP确定目标主机的位置,但身在数据链路层,需要MAC来寻址

而交换机工作在数据链路层,不会关心IP地址,只关注端口,MAC地址。

小结:「聪明的通信」原理

至此,我们终于实现了「聪明的通信」,在理想情况下:

  • IEEE为每个网卡,交换机端口分配了唯一的MAC地址
  • 主机根据ARP缓存拿到对方的MAC地址,封装成帧,发送给交换机
  • 交换机根据交换机表缓存,将帧转发给对应端口
  • 只有目标主机收到了帧,不会占用别的信道

二千台主机如何实现互联互通

那问题又来了,越来越多的主机想要进行互联互通,交换机的端口也不够用了,咋办?

级联

我们用若干交换机,每个交换机管理数十台PC,再把交换机一联,搞定。但交换机彼此怎么连接?交换机能感知端口对应的MAC是交换机。这种方式叫做级联,直接用一根网线,从一台交换机的一个端口,连向另一台交换机的一个端口。级联的两个交换机仍然是两个独立的交换机。

但是问题又来了,广播域太大了。

广播域

什么是广播域?所有由交换机相连的,属于同网段的,都属于广播域的范围。也就意味着,每发起一个ARP请求数据报,处于广播域的所有设备都会收到这个数据报,但实际上这个ARP数据报最多只对一个主机会生效,因为MAC地址唯一。 随着主机数量的增多,广播域变大,这个问题是无法被忽视的。

直接跨网段交流行吗

刚刚提到的广播域有个前提,就是同网段。也就是说,几千台主机只需要跨网段交流就可以解决这个问题了嘛。但是,路由器或者三层交换机,在当时可是个比二层交换机贵得多的设备。

说白了,没钱。另外IP地址也是有限的,这个等后面提到网络层再说。

因此,我们需要一种在数据链路层的技术手段,来减轻广播域带来的问题。这种技术就是:虚拟局域网。

虚拟局域网:隔离广播域

VLAN,Virtual Local Area Network,虚拟局域网,顾名思义,既然在网络层解决广播域问题这么简单,那我就在数据链路层也搞一个类似的虚拟的概念出来,用类似的方法解决即可。

虚拟局域网的作用就是:「隔离广播域」,而不是「限制原本在同一网段的设备的通信」,这一点需要强调。VLAN是一种交换机技术,路由器没有,主机也无法感知。因此VLAN技术是聚焦于交换机的。

交换机配置Vlan

在支持Vlan技术的交换机中,我们可以通过port命令「将交换机的端口设置为某个vlan」,比如vlan 10,代表该端口连接的设备属于虚拟局域网vlan10。稍后我们会看到,有的端口可以配置多个Vlan。交换机所有端口默认都是Vlan1。

直观感受Vlan的效果

只有相同VLAN的包,才会互相转发,不同VLAN的包,是看不到的。

此时虚拟局域网带来的作用或者说效果就是:尽管彼此通过交换机相连,但由于发数据必须经过交换机,而交换机会认为这个设备的网段和别的端口都不同(别的都是vlan1),因此会丢弃报文,此时这个设备就无法和交换机其它的设备互联互通了,这就造成了「限制通信」,这不是我们想要的结果。

作为对比,有这样一个场景:

一交换机,两个PC,网段不同,此时「广播域被隔离了吗?没有」,目的PC收到了来自源PC的数据,但是,目的PC发现网段不同将帧丢弃,因此ping不通。而同网段不同vlan,是「广播域被隔离」导致的ping不通,即交换机根本没有将帧转发给目的PC,直接在交换机层面丢弃帧。

为啥交换机配了一个端口Vlan10,另一个端口Vlan20,这两个设备就无法通信了呢?实际上,交换机会根据端口配置的Vlan,修改帧。

交换机Vlan的工作原理

首先主机是无法感知自己所在的Vlan的,这是交换机端口设置的。因此主机发来的数据包,是原始的数据包。

然后,交换机会根据端口所属的Vlan修改帧,在帧中添加一个「Tag」如下:

image-20231028211706608.png

题外话:注意到Vlan ID共12位,因此Vlan的个数是有限制的,范围1~4094

然后,交换机只会将帧转发给相同Vlan的端口,至于具体如何修改,一种可以想到的做法是,你端口号配的啥Vlan,你就加啥Vlan呗,这在单Vlan端口是很有效的。但多Vlan端口会有所不同。因为Vlan是配到端口上的,因此具体如何处理Vlan,我们要关注的是端口。

交换机端口类型

根据以太网分
  • Ethernet接口,e口,普通以太网接口
  • FastEthernet接口,f口,快速以太网
  • GigabitEthernet接口,g口,千兆口

三种端口的区别是:速度不同。这也算是题外话了,下面才是我们要重点关注的:

根据Vlan分
  • access口,只能配置一个Vlan,一般连接「PC - 交换机」

    • 发出帧时,不携带任何tag
    • 接受帧时,会根据端口配置的Vlan加上tag
  • trunk口,能配置多个Vlan,一般连接「交换机 - 交换机」

    • 发出帧时,端口的VlanID和报文的VlanID相同,不携带tag,否则携带tag

    • 接受帧时,没tag就加;有tag要看一下是否和端口匹配

      如果一个trunk配了多个vlan,是不是肯定要带tag了

  • hybrid口,华为交换机特有的口,别的交换机没有。和trunk差不多,唯一区别是Hybrid端口可以允许多个Vlan的报文发送时不打标签

如何解决Vlan带来的通信问题

配置Vlan本意是限制广播域,但也带来了「限制通信」的问题,即不同Vlan的设备无法通信。此时要实现不同Vlan的设备通信,就需要trunk口以及hybrid口了。

另一种做法是:单臂路由。这涉及到网络层,并且单臂路由的方案应用的不多,这里就简单提一嘴。单臂路由可以通过在路由器的一个物理接口上通过配置多个子接口的方式,实现多个Vlan之间的互通。

逻辑链路控制层:LLC

前面说过MAC是数据链路层的一部分。实际上数据链路层还包括了LLC。MAC是更低层,接近物理层,而LCC是更高层,接近网络层。

谢希仁的《计算机网络》书中说到:由于 TCP/IP 体系经常使用的局域网是 DIX Ethernet V2 而不是 802.3 标准中的几种局域网,因此现在 802 委员会制定的逻辑链路控制子层 LLC(即 802.2 标准)的作用已经不大了。

因此在学习计网的初期不用太关心LLC。

小结

简单的网络并不复杂,但是,为了实现「聪明的通信」(MAC),为了「隔离广播域」(VLAN),我们做出了非常多的努力。

参考文档

计算机网络.谢希仁

图解网络 - 小林coding

趣谈网络协议 - 刘超

全解网络协议

TCP-IP详解卷1