数据链路层最基本的服务是将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层
其实,数据链路层负责的是同一个局域网的不同设备之间的通信问题
在众多数据链路中最著名,使用最广泛的莫过于以太网(Ethernet)
包含了
数据链路层的内容, 也包含了
一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等MAC地址
), 长度是48位,是在网卡出厂时固化的P、ARP、RARP
CRC校验码
识别数据链路层中相连的节点
48位
, 即6个字节
. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)不能修改
. mac地址通常是唯一的
(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制
最小46字节,最大1500字节
,ARP数据包的长度不够46字节,要在后面补填充位
以太网的最大传输单元
(MTU),不同的网络类型有不同的MTU分片
(fragmentation)不同的数据链路层标准的MTU是不同的由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包
分成多个小包
, 并给每个小包打上标签2位置为0
, 表示允许分片, 第3位来表示结束标记
(当前是否是最后一个小包, 是的话置为1, 否则置为0)拼装到一起
返回给传输层比方说有一个IP数据报,总长度大于1500字节,那么这个IP数据报中的有效载荷就会被分成N份
被分成N份的IP数据报中的16位标识是完全相同
的,表示这N份数据报其实是同一个IP数据报
3位标志位中的第一个比特位为0
,第二个比特位为0,表示可以分片
,也就是说,只要IP报文的3位标志位中的第二位为0,就表示这个报文是被分片的
被分片的每片报文的偏移量都是不一样的,通过偏移量可以确定报文分片前的原始位置
,也可以通过偏移量来确认是否有分片的报文在传输过程中丢失了
分片后的报文被传输到对端主机后就会进行组装,这时就能通过偏移量和IP报文总长度确定组装的顺序
分片报文的前面部分的3位标志位的第三个比特位都是1,表示更多分片
,也就是这个分片后面还有分片
,而分片的最后一个报文第三个比特位是0,表示更多分片位是0,也就是没有更多分片,这个分片就是分片的最后一个
通过偏移量和总长度,还有更多分片标志位,就能确认这个被分片的IP报文是否丢包,并且可以按照顺序组装,交付给上层
分片和组装的过程都是在网络层完成的,上层和下层并不知道IP报文被分片和组装过
受制于MTU
. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size)双方会进行MSS协商
MSS的值正好是在IP不会被分片处理的最大长度
(这个长度仍然是受制于数据链路层的MTU)MSS和MTU的关系
在一个局域网中,上层的IP数据报并不能直接发送到各个主机,上层的IP数据报会被封装成MAC帧(以太网帧)的形式在局域网中传输
比如说一个局域网中的主机A,收到了上层的IP数据报
,要把这个IP数据报发送给这个局域网
中的B主机,就得先对这个IP数据报进行封装
,添加要发送主机的MAC地址,自己的MAC地址,还有要封装的类型,再在IP数据报后面添加MAC帧的校验,然后把这个MAC帧发送到局域网内,此时局域网内的所有主机都会收到这个MAC帧
,所有主机在收到这个MAC帧
后就会对这个帧进行解析
,查看这个MAC帧的目的MAC地址,和自己的MAC地址进行对比,如果和自己的MAC地址符合,就会对这个MAC帧进行校验,如果校验没问题,就会分用这个MAC帧,拆出有效载荷交付给上层,完成数据通信。如果对比MAC帧的目的MAC帧地址后和自己的不符合,就会立即丢弃这个MAC帧,不会交付给上层
局域网的通信资源是多个主机之间共享
的,局域网其实也可以看作是一个临界区,局域网通信资源可以看作是临界资源
以太网通信只允许一台主机和另一台主机进行数据通信
当一组主机数据通信时,另一组主机也在进行数据通信
,就会发生碰撞,这个局域网就会瘫痪,所以要保证在局域网中只有一个主机在发送数据
一个局域网
可以看作是一个碰撞域
每一个主机在发送数据时都要进行冲突检测,如果检测出冲突,就要进行冲突避免
如果检测到自己发送的数据发生了碰撞,就会进行重传MAC帧
上面的以太网通信,是把上层的数据报封装成MAC帧进行局域网间的通信,但是,MAC帧的报文字段中
有目的MAC地址,但是如果是第一次通信,我们只知道对方的IP地址,并不知道对方的MAC地址
,那么就无法发送MAC帧报文给想要发送的主机,所以说在进行MAC帧通信前,首先要获得想要通信主机的MAC地址
。
这时我们就可以使用ARP协议来把目标主机的IP地址转换成MAC地址
ARP不是一个单纯的数据链路层的协议
, 而是一个介于数据链路层和网络层之间的协议
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
MAC帧不只可以封装IP数据报,也可以封装其他数据报
,ARP数据报其实就是一个封装了ARP请求/应答的MAC帧
以太网就是1
,占用2个字节要转换的地址类型
,当前要转换的是IP地址,仍然占用2个字节6个字节
,因此“6”这个数字就用一个字节就能存放了4个字节
,IPv6为16个字节为1
的话表示请求,2
表示应答比如说一个局域网中的主机要发送数据给这个局域网中的另一个数据,就是把上层的数据报封装成MAC帧发送到局域网中,这时我们是第一次通信,只知道对方主机的IP地址,就要把IP地址转换成MAC帧地址。
假设有一个主机A,要给主机B发送数据,主机A有主机B的IP地址,这时要完成主机B IP地址到主机B MAC地址的转换
构建一个ARP请求
,填充对应的数据,OP字段设置位1,代表ARP请求,目的MAC帧地址填充为全F,表示
不知道主机B的MAC地址,请求主机B回应表示
广播发送给全部主机,帧类型填充为0806,表示
这个MAC帧里面封装的是一个ARP请求分用
,得到这个ARP响应,查看OP字段,发现是响应,这时主机A就会拿到响应里的发送端MAC地址在局域网内,并不是每次发送数据都需要封装ARP请求取获取对方的MAC地址,而是获取一次以后就会有一个ARP缓存表,把目标主机的MAC地址和IP地址的映射关系保存起来
,下次发送数据就不必再发送APR请求再获取对方的MAC地址了,而是直接查表
使用arp -a
命令来查看Linux系统中的ARP缓存表
这个缓存表并不是永久有效的,因为ARP缓存表维护机制中存在不完善的地方,当主机收到一个ARP的应答包后,它并不验证自己是否发送过这个ARP请求
,而是直接将应答包里的MAC地址与IP对应的关系替换掉原有的ARP缓存表里的相应信息
。这就是导致ARP欺骗的根本原因。
ARP缓存表过一段时间就会清除,然后重新发起ARP请求获取对方的MAC地址