一.数据链路层
数据链路层实现的是相邻结点之间的逻辑链接,其使用的协议单元为数据帧。在两个结点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。
数据链路层的三个基本问题:
1.封装成帧,2.透明传输,3.差错检测
下来讨论一下封装成帧 :
封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。网络层的IP数据报传送到数据链路层就成为了帧的数据部分,在帧的数据部分前后分别加上头部和尾部就构成了一个完整的帧。
二.以太网的MAC层
1.MAC 层的硬件地址
在局域网中,硬件地址又称为物理地址或者MAC 地址。长度是48位,是在网卡出厂
时固化的。在LINUX 下用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。在生产适配器时,这6字节MAC地址已被固化在适配器的ROM中。因此实际上就是适配器地址或适配器标识符。
2.MAC帧的格式
其中目的地址和源地址就是MAC地址,帧协议类型字段有三种值,分别对应IP、ARP(地址解析)、RARP(逆地址解析)。帧末尾是CRC校验码。
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则 需要对数据包进行分片(fragmentation)。LINUX下的ifconfig命令的输出中也有“MTU:1500”。注意,MTU这 个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。
3.ARP数据报格式
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,在LINUX下可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
ARP数据报帧格式如下图所示:
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网 的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。
下面举一个具体的例子:
主机1向主机2发送ARP请求:
主机2向主机1ARP应答: