目录
一、数据链路层
数据链路层是计算机网络协议栈中的第二层,位于物理层之上,网络层之下,是OSI参考模型中的第二层。它主要用于两个设备(同一种数据链路节点)之间进行信息传递.,并具备一系列相应的功能
传输层协议用于保证数据传输的可靠性,网络层提供了将数据跨网络路由的能力,而数据链路层解决的问题就是在一个局域网两台主机之间的通信问题
二、以太网
2.1 认识以太网
以太网(Ethernet)是一种常见的局域网(LAN)通信协议。
- "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等
- 例如以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线 LAN 等;
在一个局域网下,一台主机发送的数据该局域网的所有设备都能收到,这就像许多学生在一个教室上课一样,一个学生讲话所有人都能听见。
例如,主机A向主机B发送了一条数据,该数据会添加源mac地址、目的mac地址等信息,一个局域网下的主机都会收到这条消息,但是只有主机B收到该消息后会向上层交付,其他主机对报头解析发现目的地址不是自己,就会丢弃该数据。
2.2 数据碰撞
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。
- 对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发就行了,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。
- 所谓的碰撞避免算法就是,当主机发送出去的数据产生碰撞时,该主机需要等待一段时间后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网当中的数据消散。
- 一个局域网就是一个碰撞域。
这个问题就比如好几个班的同学一起在学校的机房上课,此时的网络会变得很卡顿,这是因为大家都连的同一个局域网,许多设备在上网时,就会发生大量数据碰撞,增加了数据在网络中传输的时间。
2.3 交换机
交换机内部维护了一张Mac地址表,用来记录每个端口连接设备的mac地址,比如主机A向主机E发送数据,此时交换机就知道主机A在左边,当主机E向主机A发送数据时,此时交换机发现主机E在右边,他就会将数据发送到左边的端口,不用在转发给全部主机。
当交换机接收到数据帧时,它会根据数据帧的目的MAC地址进行查找,找到对应的端口后,将数据帧直接转发到该端口,而不是广播到所有端口。通过划分冲突域(也称为碰撞域)减少了不必要的广播流量,降低了数据碰撞的风险。
2.4 MAC帧格式
MAC帧是数据链路层的一种协议数据单元,也被称为媒体访问控制帧。它主要用于在局域网(如以太网)中传递数据,是网络中数据交换的基本单位。
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
- 帧协议类型字段有三种值,分别对应IP协议(0800)、ARP协议(0806)和RARP协议(8035)。
- 帧末尾是CRC校验码。
如何将报头与有效载荷分离?
MAC帧的帧头与帧尾都是采用固定的长度,所以当我们收到报文后,将固定长度的帧头与帧尾分离,剩下的就是有效载荷
MAC帧如何决定将有效载荷交付给上层的哪一个协议?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
2.5 局域网通信过程
假设在同一个局域网下,主机A要向主机B发送数据,此时主机A封装的MAC帧报头中的目的地址就是MACB,源地址就是MACA,类型为0800。
该局域网下的主机都会收到这个报文,主机A也可以收到
- 主机A收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发。
- 主机B收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层(0800)进行进一步处理。
- 局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。
当主机收到MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的会对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理,如果不是发送给自己的则在数据链路层直接将数据丢弃。
2.6 认识 MAC 地址
- MAC 地址用来识别数据链路层中相连的节点;
- 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改,mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
2.7 对比理解 MAC 地址和 IP 地址
- MAC地址用于在局域网(LAN)中唯一标识网络设备
- IP地址用于在Internet上唯一标识网络设备
- MAC地址位于OSI模型的底层,即数据链路层,是硬件层面的地址。
- IP地址位于OSI模型的网络层,直接影响TCP/IP协议的选择和网络路由的决定。
- MAC地址要用于局域网内的设备识别和通信,不能跨越不同的网络。
- IP地址可以在全球范围内使用,支持跨网络通信,是互联网中设备定位和通信的基础
MAC地址和IP地址在网络通信中各自承担着不同的角色和功能。MAC地址作为硬件层面的唯一标识符,在局域网内起着至关重要的作用;而IP地址则作为逻辑层面的地址,是互联网中设备定位和通信的基础。两者相互配合,共同实现了网络设备的互联互通和数据的高效传输。
2.8 认识 MTU
MTU 相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层产生的限制.
- 太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度不够 46 字节,要在后面补填充位;
- 最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU;
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的 MTU 是不同的;
2.9 认识MSS
由于数据链路层限制了单次数据传输的数据量(MTU),所以为了避免数据在网络层进行IP分片,我们应在传输层对向网络层交付的数据大小加以控制。
我们将TCP的单个数据报的最大报文长度,称为MSS(Max Segment Size)。
TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。
三、ARP 协议
ARP协议,全称Address Resolution Protocol,即地址解析协议,是一个用于将网络层(IP层)地址解析为数据链路层(MAC层)地址的协议。
3.1 了解ARP协议
当两台主机在进行跨网络通信时,发送方可以根据目的IP找到目的主机所在的子网路由器,但是仅仅知道目的主机的IP地址与端口号,不知道目的主机的硬件地址(MAC地址),由于数据帧的传输是在数据链路层进行的,因此必须知道目标设备的MAC地址才能正确发送数据。而ARP协议可以通过目的主机的IP地址来确定他的MAC地址
ARP协议是位于MAC帧协议上层位于网络层下层的一个属于数据链路层的协议
3.2 ARP协议的工作流程
- 检查ARP表:
- 发送方首先在其ARP缓存(ARP表)中查找目标IP地址对应的MAC地址。
- 如果找到了,就直接使用该MAC地址发送数据帧。
- 如果没有找到,就进行ARP请求。
- 构造ARP请求:
- 发送方构造一个ARP请求数据包,该数据包包含以下内容:
- 发送方的硬件地址(MAC地址)
- 发送方的IP地址
- 目标设备的IP地址(设备B的IP地址)
- 目标设备的硬件地址(此处通常为全0或全F,表示未知)
- ARP请求数据包还包含操作码,用于指示这是一个ARP(0806)请求。
- 发送方构造一个ARP请求数据包,该数据包包含以下内容:
- 广播ARP请求:
- 发送方将ARP请求数据包以广播的形式发送到局域网上的所有设备。
- 在以太网中,广播地址的MAC地址通常为全F(即FF-FF-FF-FF-FF-FF)。
- 接收ARP请求:
- 局域网上的所有设备都会接收到这个ARP请求,但只有目标设备(设备B)会响应。其他设备在收到请求后,分离报头和有效载荷,如果发现是一个ARP请求,在看目的IP地址,发现不是自己,就会丢弃,要注意这个丢弃与局域网通信中讲的的丢弃不同,这个是在ARP层丢弃,而局域网通信讲的丢弃是直接查看MAC帧报头中的目的MAC地址,在MAC帧协议层丢弃的。
- 设备B检查ARP请求中的目标IP地址,如果与自己的IP地址匹配,就准备发送ARP应答。
- 构造ARP应答:
- 目标设备(设备B)构造一个ARP应答数据包,该数据包包含以下内容:
- 发送方的硬件地址(即设备A的MAC地址,从ARP请求中复制)
- 发送方的IP地址(即设备A的IP地址,从ARP请求中复制)
- 目标设备的硬件地址(设备B自己的MAC地址)
- 目标设备的IP地址(设备B自己的IP地址,与ARP请求中的目标IP地址相同)
- ARP应答数据包也包含操作码,但此时操作码表示这是一个ARP应答。
- 目标设备(设备B)构造一个ARP应答数据包,该数据包包含以下内容:
- 单播ARP应答:
- 目标设备(设备B)将ARP应答数据包单播发送给发送方(设备A)。
- 发送方收到ARP应答后,将目标设备的MAC地址添加到自己的ARP缓存中。
- 发送数据帧:
- 现在,发送方(设备A)已经知道目标设备(设备B)的MAC地址,可以将数据帧封装并发送到目标设备。
- 要注意每一台主机其实都是一个网络协议栈,在ARP层构建的请求或者应答也需要封装成mac帧才能发送。
- 每台主机都会维护一个 ARP 缓存表,当再次向同一个主机通信时可以不用再发起ARP请求,直接查表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址
为什么表项要有过期时间而不是一直有效?
ARP缓存表用于存储IP地址到MAC地址的映射关系。随着时间的推移,网络中的设备可能会发生变化,如设备关机、IP地址更改或网络拓扑变化等。如果ARP缓存表中的表项一直不过期,那么这些无效的表项将会持续占用缓存空间,导致资源浪费。设置过期时间可以确保缓存表中只保留有效的映射关系,从而节约资源。
另外设置过期时间还可以提高网络安全性,防止ARP欺骗
3.3 ARP 数据报的格式
- 硬件类型指链路层网络类型,1 为以太网;
- 协议类型指要转换的地址类型,0x0800 为 IP 地址;
- 硬件地址长度对于以太网地址为 6 字节;
- 协议地址长度对于和 IP 地址为 4 字节;
- op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
- op字段存在的原因是因为每个主机都可能给别人发送ARP请求,也可能会收到别人的ARP请求
我们发现在ARP中就有一个MAC_A而在MAC帧的报头中,又有一个MAC_A,冲突吗?两个并不冲突,而且二者不但不冲突还处于不同的工作层次的,前面的是给MAC层看的,中间的是给ARP看的。所以这个冗余也是合理的,是通过数据冗余来实现两层协议的解耦合。