在OSI参考模型中,每一个路由器都必须实现网络层、数据链路层和物理层的功能,如下图:
其中数据链路层和物理层的结合非常紧密,很多协议比如802系列协议都是同时对数据链路层和物理层进行了规范。
在TCP/IP协议栈里,每个路由器也要实现网络层、数据链路层和物理层的功能。
网络层使用IP地址、查路由表来决定将数据发送到哪里去。但是因为网络的分层设计,实际上数据还要在物理链路层进行组帧,此时会加上数据链路层的帧头和帧尾(在有些链路层协议中没有帧尾),交给物理层发送,数据链路层使用MAC地址来寻找下一跳,mac地址就包含在数据链路帧的帧头里。
具体来讲,广泛使用的以太网协议、802.11无线局域网协议,HDLC协议和PPP协议,都规定了不同格式的数据链路帧帧头(有些还包含了帧尾),你可以查看相关的协议,寻找到底这些协议把mac地址放在哪里了,下面帖一张HDLC和PPP协议的帧头格式
为什么有了网络层的IP地址,还要有数据链路层的MAC地址存在呢?我个人理解
这是网络分层设计的必然要求。
网络为什么要分层设计,只设计一层行不行?当然是行的,但这样就势必非常复杂。网络层为什么和数据链路层分开,也是为了设计的简单化,当时在设计IP协议的时候,设计思路就是让网络层的功能尽可能地简单,其他非必须功能由其他层完成。因为互联网是“把采用不同协议的子网连接起来构成的网络之网络”,如果IP层协议太复杂,势必会导致各种子网接入的困难。
比如说,网络层和数据链