计算机网络面试之-(数据链路层、物理层)工作原理
文章首发于微信公众号:云舒编程
关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推
关于我: 字节、阿里资深工程师。 做过营销、支付、百万级Feed流优化、权限系统、网关。 专注于技术原理分享,用最简单的话分享最复杂的技术原理
前言
想必不少同学在面试过程中,会遇到「在浏览器中输入www.baidu.com后,到网页显示,其间发生了什么」类似的面试题。
本专栏将从该背景出发,详细介绍数据包从HTTP层->TCP层->IP层->网卡->互联网->目的地服务器 这中间涉及的知识。
本系列文章将采用自底向上的形式讲解每层的工作原理和数据在该层的处理方式。
通过本文你可学到:
系列文章
每天5分钟玩转计算机网络-(数据链路层、物理层)工作原理
每天5分钟玩转计算机网络-(网络层ip)工作原理
每天5分钟玩转计算机网络-(传输层tcp)工作原理
经典网络分层
这张图相信小伙伴们应该不陌生,是经典的网络架构分层图。简单说明了数据从客户端到服务端经过的网络处理过程。
本篇文章将会重点讲解数据链路层和物理层的工作原理。
首先不考虑(数据链路层和物理层)以外的网络层,那么现在我们的网络结构可以认为是这样的。
假设让我们来设计网络,如何将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发送的消息,于是记下:
aaaa-aaaa-aaaa | 1 |
的映射关系。
同时交换机看目标 MAC 地址(bbbb-bbbb-bbbb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。之后,只有机器 B 收到了确实是发给自己的包,于是做出了响应,响应数据从端口 3 进入交换机,于是交换机此时在地址表中加入了第二条数据:
bbbb-bbbb-bbbb | 3 |
aaaa-aaaa-aaaa | 1 |
随着网络中设备的不停通信,交换机最终会完成路由表的完善。
不过交换机的端口数量是有限的,如果我们想接入几万台电脑,一台交换机肯定是不够的,这个时候我们可以想到可以通过多个交换机连接去解决这个问题。
不过这样依旧有问题,交换机需要记录下整个网络中的电脑跟自己端口的映射关系,当设备极多的时候,交换机会无法存储这么多记录。
快递寻址
回想我们在现实生活中寄快递填写地址都是: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层时详细介绍。
想必不少同学在面试过程中,会遇到「在浏览器中输入www.baidu.com后,到网页显示,其间发生了什么」类似的面试题。 本专栏将从该背景出发,详细介绍数据包从HTTP层->TCP层->IP层->网卡->互联网->目的地服务器 这中间涉及的知识。 通过本专栏你可以了解到每层的工作原理