万字图解|深入揭秘 (数据链路层、物理层) 工作原理
大家好,我是「云舒编程」,今天我们来聊聊计算机网络面试之-(数据链路层、物理层)工作原理。
前言
想必不少同学在面试过程中,会遇到「在浏览器中输入 www.baidu.com 后,到网页显示,其间发生了什么」类似的面试题。
本专栏将从该背景出发,详细介绍数据包从 HTTP 层->TCP 层->IP 层->网卡->互联网->目的地服务器 这中间涉及的知识。
本系列文章将采用自底向上的形式讲解每层的工作原理和数据在该层的处理方式。
系列文章
通过本文你可学到:
经典网络分层
这张图相信小伙伴们应该不陌生,是经典的网络架构分层图。简单说明了数据从客户端到服务端经过的网络处理过程。
本篇文章将会重点讲解数据链路层和物理层的工作原理。
首先不考虑(数据链路层和物理层)以外的网络层,那么现在我们的网络结构可以认为是这样的。
假设让我们来设计网络,如何将 A 电脑的数据发送到 B 电脑呢?
一根网线互联电脑
先不考虑协议情况下,直接用一根网线把 A、B 电脑连接起来,是不是就可以把数据从 A 传输到 B 了。
用一根网线连接起来怎么就能"通信"了呢?这里涉及网络协议、网络路由、IO、中断、缓冲区。这不是现在需要关心的问题。我们先放下,在后面的文章中会一一介绍。
集线器与 mac 地址
这个时候如果有第三台电脑想加入你们,该怎么做呢?聪明如我们,很快发现,可以每个人开两个网口,用一共三根网线,彼此相连。
如果电脑的数量是几千台,几万台呢?通过一直开端口的方式肯定没有办法去满足了。
按照专业的事交给专业的人去做的原则,就在想可不可以有一个设备支持每台电脑都只连接他,然后他负责把消息转发到目的电脑呢?
这个设备就是集线器。
集线器他仅仅是将消息无脑转发到所有出口(广播),不做任何处理,所以他工作在物理层。
有了集线器后,A 想发消息给 B 就只需要把消息发送给集线器,集线器就会把消息广播转发出去。
那么问题就来了,集线器把 A 发送给 B 的消息同时发送给了 B、C、D。那么 B、C、D 怎么知道消息是不是给自己的呢?
现在我们给连接到集线器上的电脑都起一个唯一标识,类似我们的身份证,保证全局唯一。这个标识我们就叫 mac 地址吧。
mac 地址是生产商出厂时就烧制在电脑里的(严格来说是烧制在网卡里的)
假设 A 的 mac 地址是 aaaa-aaaa-aaaa,B 的 mac 地址是 bbbb-bbbb-bbbb。
那么 A 发送给 B 的消息体就会长下面这样。
B、C、D 收到集线器的广播消息后,取出消息中的目的 mac 地址与自己的 mac 进行比较,如果相同就认为是发送给自己的消息。否则就进行丢弃。
交换机
通过集线器,我们现在已经可以实现多台电脑进行通信了。但是我们也发现了一个问题:每次发送的消息都会广播发送给全部的电脑,非常的浪费资源。同时对于消息的安全性也完全没有保证。
既然我们已经在消息里填写了目的 mac 地址,那么有没有一种设备可以根据我填写的 mac 地址把消息只转发给接受者呢?
这就是交换机了。
交换机(switch),跟集线器长得很类似。但是功能更强一些,从网络分层上来说,它工作再数据链路层。所有发到交换机的数据,都会先进入交换机的缓存区。接着消息再被转发到对应机器上。
MAC 地址表
交换机内部维护了一张 mac 地址表
现在 A 再发送消息给 B 时,先把消息发送给交换机。交换机收到消息后取出目的 mac 地址发现是 bbbb-bbbb-bbbb,查找路由表,发现对应端口为 3。就把消息从端口 3 转发出去了。
mac 地址表初始化
对于刚使用的交换机,mac 地址表肯定是空的。那他是怎么生成 mac 地址表的呢?
还是用刚才 A 给 B 发消息举例,A 从端口 1 发送一条给 B 的消息。这个时候 mac 地址表是空的。但是交换机发现 A 是从端口 1 发送的消息,于是记下:
的映射关系。
同时交换机看目标 MAC 地址(bbbb-bbbb-bbbb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。之后,只有机器 B 收到了确实是发给自己的包,于是做出了响应,响应数据从端口 3 进入交换机,于是交换机此时在地址表中加入了第二条数据:
随着网络中设备的不停通信,交换机最终会完成路由表的完善。
不过交换机的端口数量是有限的,如果我们想接入几万台电脑,一台交换机肯定是不够的,这个时候我们可以想到可以通过多个交换机连接去解决这个问题。
不过这样依旧有问题,交换机需要记录下整个网络中的电脑跟自己端口的映射关系,当设备极多的时候,交换机会无法存储这么多记录。
快递寻址
回想我们在现实生活中寄快递填写地址都是:xx 省 xx 市 xx 区 xx 小区 xx 人收。
快递小哥分拣快递时,只需要先根据省进行区分,比如:
广东省的就全部装到一辆卡车,发往广东。
湖南省的就全部装到一辆卡车,发往湖南。
然后到了对应省后再按照市分,一级一级分,最后到消费者手里。
通过这样快递小哥不必记住每个人的地址该怎么到达。
通过上面的例子会发现快递之所以可以这么分,是因为快递有相同点,他们有共同的前缀:xx 省 xx 市。
如果网络上的设备也有共同的前缀,那么消息发送时就可以这样:
但是前面我们说过,mac 地址是生产商生产设备时就烧制进去的。
MAC 地址的长度为 48 位(6 个字节),通常表示为 12 个 16 进制数,如:00-16-EA-AE-3C-40 就是一个 MAC 地址,其中前 3 个字节,16 进制数 00-16-EA 代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后 3 个字节,16 进制数 AE-3C-40 代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。形象地说,MAC 地址就如同身份证上的身份证号码,具有唯一性。
我们发现 mac 地址的确有共同前缀,但是细想发现这无法实现,因为这意味着 A 厂商生产的设备只能在交换机的同一边,B 厂商的也必须在同一边。这是不可能实现的。
再回过头看看上面的快递流程,平时我们收快递时,快递小哥是不是还会问你的名字或者身份证后 4 位确认是你,才把快递给你。
这里的身份证或者名字就相当于设备的 mac 地址,从出生的时候就固定了。同样的 xx 省 xx 市也是提前规划好的,也是不变的。当我们更换城市市,只需要更新自己的收货或者寄货地址,快递小哥依旧可以找到我们。
那么在网络中我们是否可以有类似的 xx 省 xx 市提前规划好的标志呢,这样拿到新设备后只需要把 mac 跟 xx 省 xx 市进行绑定就可以实现按照相同前缀进行数据分发,最后接受数据的时候再跟 mac 地址进行确认。
IP 地址
在网络中的 xx 省 xx 市就是我们常说的 ip 地址了。
IP 地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,通常被分割为 4 个“8 位二进制数”(也就是 4 个字节)。IP 地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。例如:192.168.0.1
有了 ip 地址的加成后,我们的网络架构长这样了:
由于交换机只能处理 mac 地址,无法处理 ip 地址。所以我们需要新的设备进行 ip 的转发。新设备我们就叫做路由器。
假设 A 现在要发消息到 D,也就是 192.168.0.1 要发消息到 192.167.0.1。那么 A 会把消息经过交换机发到路由器。
路由器判断出 192.167.0.1 在他的右边,于是把数据发送到右边交换机的端口 2。交换机再根据 mac 地址转发给 D。
这个时候你肯定有个疑问,前面不是说了交换机是根据 mac 地址进行消息转发的吗?那 A 发送给 D 的消息,左边的交换机怎么知道该通过端口 4 转发给路由器的。
没错交换机只能根据 mac 地址进行消息转发,这也是路由器更高级的地方,那就是路由器是有自己的 mac 地址的,而且是每个端口都有单独的 mac 地址。
路由器
路由器工作在网络层,在不同的网络间进行数据转发。 使用专门的软件协议从逻辑上对整个网络进行划分。
现在我们再来完善下 A 发送消息到 D 的过程:
1、A(192.168.0.1)想发送消息到 D(192.167.0.1),发现对方的 ip 前缀跟自己不一样,于是判断出需要通过路由器转发。
2、A 将消息的 mac 地址设置为路由器的 mac 地址,消息格式:
3、A 将消息发送给交换机,交换机根据目的 mac 地址判断出需要将消息从端口 4 转发
4、路由器收到交换机转发的消息,根据目的 ip 判断出需要将消息转发给右边的交换机。同时路由器将消息改写为(目的和源 mac 地址改变了),然后转发给右边交换机
5、右边交换机收到消息后,根据目的 mac 地址判断出需要转发给 D,于是通过端口 1 将消息转发给 D。
最后
到目前为止,我们已经把数据链路层和物理层的原理说完了。
在最后提到了 ip 地址和路由器,关于 ip 地址和路由器的更多细节,我们将在介绍 IP 层时详细介绍。
推荐阅读
如果你也觉得我的分享有价值,记得点赞或者收藏哦!你的鼓励与支持,会让我更有动力写出更好的文章哦!
版权声明: 本文为 InfoQ 作者【云舒编程】的原创文章。
原文链接:【http://xie.infoq.cn/article/7be1a56a9ee6e46f8d9bccdba】。文章转载请联系作者。
评论