网络协议 3 - 从物理层到 MAC 层

    在上一篇博文中,咱们见证了 IP 地址的诞生,机器一旦有了 IP,就能够在网络的环境里和其余的机器展开沟通了。html

    今天,咱们来认识下 物理层MAC 层。nginx

    平常生活中,身为 90 后的咱们,若是不是通讯相关专业出身的,应该历来没有接触过物理层和 MAC 层的设备。咱们接触最多的,可能就是路由器了。而路由器其实是第三层-网络层的设备了。算法

    那我们怎么认识物理层呢?就不扯那些深奥的理论了,从宿舍联机打魔兽提及吧。缓存

    要想宿舍里的几台电脑链接到一个局域网内,第一反应就是买个路由器,你们都连上去就 OK 了。可是在 15 年前,路由器尚未那么普及的时候,你在校园里找个通讯专业的学生问,知道怎么组建宿舍局域网吗?他应该会回答你,有三种方式:网络

  1. 网线链接
  2. 集线器链接
  3. 交换机

物理层

    上面三种方式中,网线链接和集线器是彻底在物理层工做,我们就先见识下这两种方式。学习

网线链接

    是的,你没看错,是用一根网线链接在两个电脑上。网线水晶头的第 一、2 和第 三、6脚,分别起着发、收信号的做用,要想经过一根网线将两台电脑链接在一个局域网上,须要额外作的操做就是将网线其中一端的 1 号和 3 号线、2 号和 6 号线互换一下位置,这样就能在物理层实现一端发送的信号,另外一端成功接收。计算机网络

    固然,除了经过网线链接外,咱们还须要配置这两台电脑的 IP 地址、子网掩码和默认网关,将这三项配置成为一个网络,不然是不通的。cdn

    这样,一个宿舍的两台电脑就能够联机打魔兽了。htm

    问题来,若是又有一个舍友买了电脑,怎么把三台电脑连一块儿呢?先别说交换机这高档的东西,对于 15 年前的大学生来讲,交换机太贵了,买不起。好在除了交换机外,还有个叫作 Hub 的东西,也就是集线器blog

集线器

    这种设备有多个口,能够将宿舍里的多台电脑链接起来。和交换机不一样的是,集线器很“傻”,它没有大脑,彻底在物理层工做,将本身收到的每个字节,都复制到其它端口上去。

    这就像,小明想找小红表白,他不知道小红在哪一个小区,因而他就找其它小伙伴,让每一个小伙伴负责一个小区,去每一户问是否是小红家,找到小红的小伙伴就将表白语告诉小红。

数据链路层

    上面经过 Hub 实现局域网的方式,你可能已经发现了,Hub 采起的是广播的模式。若是每一台电脑发出的包,局域网内的其它电脑都能收到,那就麻烦了。这就须要解决几个问题:

  1. 这个包是发给谁的?谁接收?
  2. 你们都在发生消息,会不会产生混乱?有没有前后的规则?
  3. 若是发生的时候出错了,怎么办?

    这几个问题,都是数据链路层,也就是 MAC 层要解决的问题。MAC 的全称是 Medium Access Control,即媒体介质访问控制。这里的控制,其实就是控制在往媒体上发数据时,谁先发、谁后发的问题,也就是防止发生混乱。这就解决了第二个问题。这个问题中的规则,学名叫多路访问。和咱们交通管制同样,常见的有下面三种方式:

  • 方式一:分车道。每一个车一个车道,你走你的,我走个人,互不干扰。这在计算机网络中叫作信道划分
  • 方式二:今天单号出现,明天双号出现,轮着来。这叫作轮流协议
  • 方式三:无论三七二十一,有事先出门,发现很堵,就回去等待 ,错太高峰期再走。这叫作随机接入协议。著名的以太网,用的就是这种方式。

    解析要解决第一个问题:发给谁?谁接收?这里用到一个物理地址,叫作链路层地址。可是由于第二层主要解决媒体接入控制的问题,因此它经常被称为 MAC 地址。

    解决第一个问题就牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标的 MAC 地址和源的 MAC 地址。

    接下来是类型。大部分的类型是 IP 数据包,其中 IP 里面包含 TCP、UDP,以及 HTTP 等,这些都是里层封装的事情。

    有了这个目标 MAC 地址,数据包在链路上广播,MAC 的网卡才能发现,这个包是给它的。MAC 的网卡把包收进来,而后打开 IP 包,发现 IP 地址也是本身的,再打开 TCP 包,发现端口是 80,而 nginx 就是监听 80 端口。

    因而就将请求提交给 nginx,nginx 返回一个网页,最后再通过层层封装,返回到 MAC 层。由于来的时候有源 MAC 地址,返回的时候,源 MAC 地址就变成了目标 MAC 地址,再返给请求的机器。

    对于以太网,第二层的最后面是 CRC,也就是循环冗余检测。经过 XOR 异或的算法,来计算整个包是否在发送的过程当中出现了错误,这主要解决了第三个问题。

    这里还有一个没有解决的问题,当源机器知道目标机器的时候,能够将模板地址放入包里。若是不知道呢?一个广播的网络里面接入了 N 台地址,我怎么知道每一个 MAC 地址是谁呢?这就是 ARP 协议,也就是已知 IP 地址,求 MAC 地址的协议

    在一个局域网里,若是知道了 IP 地址,不知道 MAC 地址怎么办?这个在网络协议-概述中有提过,本地通讯靠“吼”。

    发送一个广播包,广而告之,谁说这个 IP 谁来回答。具体询问和回答的报文就像下面这样:

    为了不每次都用 ARP 协议,机器本地会进行 ARP 缓存。固然,缓存的 MAC 地址会有一个过时时间。

    上面解决了广播发出的包,局域网内全部机器都能收到的问题。那么 Hub 是采用怎么样的方式?

    实际上,Hub 无论某个接口是否须要,全部的数据都会发送出去,而后让主机来判断是否须要相关数据。这种方式会有两个问题:

  1. 机器数目大幅增多后,产生冲突的几率就提升了。这很好理解,那么多小伙伴去找小红,发生交通事故的几率要大于,直接去她家表白发生交通事故的几率;
  2. 把大量不须要发送的包发送出去,浪费资源。

    明显能够看出,要解决上面两个问题,只要咱们知道哪一个接口对应哪一个 MAC 地址就行了。若是目标 MAC 地址不是这台电脑的,这个口就不用转发了。

    那么,谁能知道目标 MAC 地址是否就是链接某个口的电脑的 MAC 地址呢?这就须要一个能把 MAC 头拿下来,检查一下目标 MAC 地址,而后根据策略转发的设备,也就是咱们以前提过的,二层设备-交换机

    交换机怎么知道每一个口对应的电脑的 MAC 地址呢?这须要交换机能学习。这个也是交换机和 Hub 最明显的区别。

    一台 MAC1 电脑将一个包发送给另外一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 电脑再哪一个口,因此没办法,它只能将包转发给除了来的那个口以外的其余全部的口。可是,这个时候,交换机会干一件很聪明的事情,就是交换机记住,MAC1 是来自一个明确的口,之后有包的目的地址是 MAC1 的,就直接发送到对应口就能够了。

    当交换机做为一个关卡同样,过来一段时间后,就有了整个网络的一个结构了。这个时候,基本上不用广播,所有能够准确转发。而交换机学习的结果,咱们成为转发表。固然,每台机器的 IP 地址会变,所在的口也会变,因此转发表也是有一个过时时间的。

小结

上面扯了一大堆,实际上也就是几句话的事:

  • MAC 层是用来解决多路访问的堵车问题的
  • ARP 是经过“吼”的方式来寻找目标 MAC 地址,以后会记住一段时间,这个叫作 ARP 缓存
  • 交换机是升级版的 Hub,它有 MAC 地址学习能力,学完就能记住每一个 MAC 地址对应哪一个口,学习的成果叫转发表

参考:

  1. 刘超-趣谈网络协议系列课;
相关文章
相关标签/搜索