# 计网(3)
计网(3)
基础篇
- 两点传输MAC
生成了IP头部之后,还需要在网络包前面加上MAC头部
MAC包头格式
MAC头部是以太网使用的头部,包含接收方和发送方的MAC地址信息。
一般在TCP/IP通信中,MAC包头协议类型只使用:
0800:IP协议
0806:ARP协议
MAC发送方和接收方如何得到地址?
发送方的 MAC 地址:MAC 地址是在网卡生产时写入到ROM里的,直接读取出来写入 MAC 头部即可(也就是一张网卡有其对应的 MAC 地址)。
接收方的 MAC 地址:
通过查询路由表:在路由表中找到匹配的条目,判断目标ip是否在本地网络(同一子网下)。
6.1 同一子网(通常同一子网就是同一以太网:子网是网络层概念的逻辑地址,以太网是物理层面的地址)
ARP协议会在以太网中以广播的形式,对以太网所有设备喊出:“这个IP地址是谁的,请把你的MAC地址告诉我。”以此得到接收方的MAC地址。后续操作系统会把本次查询结果放如ARP缓存的内存空间,保存几分钟,以免后面要使用。
小结一下,处于同一子网发包时:
先查询ARP缓存,如果保存了对方的MAC地址,就不需要发送ARP查询,直接使用,否则发送ARP广播查询MAC地址。
在Linux系统中,通过arp -a
命令查看ARP缓存内容。
6.2 不同子网
如果目标ip不在本地子网中,通过查询路由表获取网关ip,在ARP网关ip的MAC,然后把包发送给默认网关(Gateway),由网关转发到其他网络。(网关 = 路由器 = 管理多个子网)
- 网卡——出口
网络包只是一串二进制数字信息,无法直接发送给对方。因此,我们需要利用网卡将数字信号转换为电信号,才能在网线上传输(这才是真正的数据发送过程)。而网卡则是由网卡驱动程序控制的。
网卡驱动获取网络包之后,将其复制到网卡内的缓存区中,在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
起始帧分界符:表示包的起始位置
帧校验序列(FCS):检查包传输过程是否有损坏
- 交换机——送别者
交换机的设计是将网络包原样转发到目的地,交换机工作在MAC层,也称为二层网络设备。
交换机的包接受操作
首先,电信号到达网线接口,交换机里的模块进行接受,接下来交换将电信号转换为数字信号;通过包末尾的FCS校验错误,如果没问题则放到网卡缓冲区。而计算机网卡本身具有MAC地址,通过核对接收到的包的接收方MAC地址是不是发给自己的,如果不是则丢弃;相对的,交换机端口不核对接收方MAC地址,而是直接把所有包存放在缓冲区中。因此,交换机的端口不具有MAC地址。(这里指的是交换机只是一个转发接口,不参与生成帧,也不需要MAC地址通信)
将包存入缓冲区后,接下来需要查询这个包的接收方MAC地址是否已经在MAC地址表(记录其他设备的MAC地址 ↔ 交换机端口的映射关系)中有记录了。
交换机的MAC地址表:
小结:交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口。
当MAC地址表找不到指定的MAC地址怎么办?
找不到的原因可能有两个:该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作,导致地址从地址表中移除了。
这种情况下,交换机会把包转发到出来源端口之外的所有端口上,无论设备连接哪个端口都可以接收到这个包。
此外,如果接受方的MAC地址是一个广播地址,那么交换机同样会把包发送到除源端口之外所有端口。MAC地址中 FF:FF:FF:FF:FF:FF
与IP地址中的255.255.255.255
是广播地址
- 路由器——出境大门
路由器与交换机的区别
网络包经过交换机后,到达了路由器,并在此被转发到下一个路由器或目标设备。这一步工作原理与交换机类似,通过查表判断包转发的目标。
具体操作上:
路由器是基于IP设计的,俗称三层网络设备,路由器的各个端口都有MAC地址和IP地址;
交换机是基于以太网设计的,俗称二层网络设备,端口不具有MAC地址。
相当于所有数据都会经过交换机,路由器会接收到相匹配的数据。
路由器的基本原理
转发包时,首先路由器端口会接受发给自己的以太网包,然后查询路由表获取转发目标,再由相应的端口作为发送方将以太网包发送出去。
路由器的包接受操作
首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包围的FCS校验错误。
如果没有问题则检查MAC头部中的接收方MAC地址,查看是否是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
小结:路由器端口有自己的MAC地址,只接受与自身地址匹配的包,不匹配的就丢弃。
路由器包的输出端口确定
完成包接受操作后,路由器会去掉包开头的MAC头部。(MAC头部的作用就是将包送达指定路由器,之后就会被丢弃)
接下来,路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作。
首先查询路由表判断转发目标
根据上图,举个例子:
假设地址为10.10.1.101
的计算机要向地址为192.168.1.100
的服务器发送一个包,这个包先到达图中的路由器(根据MAC地址)。根据包的接收方IP地址查询路由表中的目标地址栏,找到匹配的记录。每个条目的子网掩码和192.168.1.100
ip做&与运算后,得到的结果与对应条目的目标地址匹配,如果匹配就作为候选转发目标,如果不匹配就继续与下个条目匹配。
例如:第二条目的子网掩码与192.168.1.100
ip做&与运算得到192.168.1.0
,与第二条目的目标地址匹配,所以该条目记录作为转发目标。如果都没匹配到,选择默认路由,路由表中的子网掩码为0.0.0.0
的记录表示默认路由。接下来进入发送操作。
路由器的发送操作
根据路由表的网关列判断对方的地址:
- 如果网关是一个IP地址,则这个IP地址就是转发的目标地址,还没到达终点,需要继续转发。
- 如果网关为空了,则ip头部中的接收方ip地址就是要转发到的目标地址,说明已经抵达终点。
知道IP地址后,通过ARP协议根据IP地址查询MAC地址,并将结果作为接收方MAC地址。同样地,路由器中也有ARP缓存。
发送方MAC地址字段则填写输出路由器输出端口的MAC地址,协议类型则填写0800
表示IP协议。
接下来会将其转换成电信号并通过端口发出,这一过程与计算机是相同的。
发送出去的网络包又会通过交换机到达下一个路由器,接下来下一个路由器又会将包转发到再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。
在网络包传输的过程中,源IP和目标IP始终是不会变的,一直变化的是MAC地址,因为MAC地址需要在以太网内进行两个设备之间的包传输。
- 服务器与客户端——层层扒皮
服务器端通过层层扒皮,得到TCP头部里的端口号,根据端口号定位到HTTP服务器进程想要这个包,于是将包发送给HTTP进程,服务器的HTTP进程看到后,知道了这个请求是要访问一个页面,于是就把这个网页封装在HTTP响应报文里,同样地穿上TCP、IP、MAC头部后发送给客户端。
客户端把收到的数据包经过层层扒皮后,交给浏览器去渲染页面。最后客户端要离开了,向服务器发起TCP四次握手,至此双方连接断开。
- 思考
- 如果知道对方电脑的MAC,能直接发送消息到这台电脑上吗?
Mac地址只能是两个设备之间传递时使用,所以即使知道对方电脑的MAC也不能直接发送消息,而要通过IP地址一步步封装。 - 公网服务器的MAC地址是什么时机通过什么方式获取的?通过arp获取MAC地址只能获得到内网及其的MAC地址。
你在局域网内无法直接获取公网服务器的MAC地址,
你只能获取到你局域网网关的MAC地址(第一跳)。
每个路由器在转发时会根据下一跳IP 去封装对应的下一跳MAC地址,
只有目标子网的网关路由器会去 ARP 目标服务器,获取服务器的 MAC 地址,最终送达。