文章目录
🌈 一、以太网技术
⭐ 01. 数据链路层所解决的问题
- IP 协议能够将数据从一台主机跨网络的传输到另一台主机。数据在进行跨网络传输时,中间需要经过 N 个路由器进行路由转发,才能抵达目标主机。
- IP 协议能够实现跨网络传输数据的前提是,需要先将数据从一个节点传输到和自己相连的下一个节点。而想要让两个节点相连,这两个节点就必须处在同一局域网中,实现的是局域网中的通信。
- IP 层实现的是跨网络的通信,局域网通信由位于网络层之下的数据链路层实现。
- 两台主机在跨网络通信前,要先保证能在同一个网段 (局域网) 内通信。
⭐ 02. 以太网相关概念
🌙 2.1 局域网技术
- 以太网:一种应用的最普遍的局域网技术。
- 令牌环网:常用于 IBM 系统中,在这种网络中有一种被称为 令牌 的帧,在环路中的节点只有持有令牌才能发送数据。
- 无线 LAN / WAN:无线局域网是有线网络的补充和拓展。
网络可以采用不同的局域网技术
- 由于 IP 层屏蔽了底层网络的差异,因此,底层可以使用任意局域网技术通信。
- 数据在发送之前都会进行数据封装,链路层也会为数据封装上链路层对应的局域网的报头。
- 当要进行跨网络传输数据时,需要通过路由器对数据进行路由转发。
- 当数据被路由器向上交付时,则会将该数据中对应的局域网报头去掉。
- 当路由器将数据转发给下一跳路由前,会为该数据封装上下一跳网络所对应的局域网报头。
- 网络中的路由器会不断去掉数据中旧的局域网报头,然后添加上新的局域网报头。因此,即使数据在进行跨网络传输时,每个网络都采用不同的局域网技术也不影响。
🌙 2.2 以太网介绍
- 以太网不是一种具体的网络,而是一种技术标准;它既包含了数据链路层的内容,也包含了一些物理层的内容。
- 规定了网络拓扑结构、访问控制方式、传输效率等。
- 规定了以太网中的网线必须使用双绞线,传输速率有 10M,100M,1000M 等。
- 以太网是当前应用的最广泛的局域网技术,和以太网并列的还有令牌环网和无线 LAN 等。
🌙 03. 以太网通信原理
- 以太网中的所有主机都共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能收到该数据。
- 虽然局域网中的所有主机都能收到数据,但如果主机检测出该数据不是发给自己的就会将其丢弃。
举个例子
- 当 A 主机想发送数据给 B 主机时,该局域网中的 ABCDE 五台主机都能收到 A 所发送的数据,但只有 B 主机能成功接收该数据。
- ACDE 四台主机虽然都能收到 A 主机发送的数据,但是该数据中携带的目的地址是 B 主机的 MAC 地址。其他主机能够判断出这个数据不是发送给自己的,从而将其丢弃。
🌙 3.1 碰撞避免算法
- 以太网中的所有主机共享同一个通信信道,这条信道同一时刻只允许一台主机发送数据。
- 如果有多台主机同时发送数据,这多个数据就会在这条通信信道中发生碰撞。
- 而从系统的层面看,这个通信信道属于一种临界资源,这个临界资源同一时刻只能被一台主机使用。
- 为了解决数据碰撞的问题,以太网引入了碰撞避免算法。
如何实现碰撞避免
- 当多台主机所发送的数据发生数据碰撞时,要执行碰撞避免算法。
- 当发生了碰撞时,如果继续发送数据,大概率还会发生碰撞。可以让发生碰撞的主机各自等待一段随机时间后再重新发送数据。
- 碰撞避免说白了就是让要发送数据的主机差开一个时间段,在不同的时间使用通信信道发送数据。
⭐ 04. 以太网 MAC 帧格式
- 源地址和目的地址是网卡的硬件地址 (MAC 地址),长度都是 6 字节 (48 位),每一个 MAC 地址在网卡出厂就已经固定。
- 帧协议类型字段有三种值,分别对应:IP 协议、ARP 协议、RARP 协议。
- 帧的末尾是 CRC 校验码。
🌙 4.1 MAC 帧如何将报头和有效载荷分离
- 以太网 MAC 帧的帧头和帧尾的长度固定 (帧头 14 字节,帧尾 4 字节)。
- 当底层获取一个 MAC 帧后,从第一个字节开始向后读取 14 个字节,即可获取到有效载荷的第一个字节。再继续读取到剩下最后 4 个字节的帧尾时就不用继续了。
🌙 4.2 将有效载荷交给上层协议
- 在 MAC 帧的帧头中,有一个 2 字节的类型字段,该字段所对应的协议类型分别有 IP 、ARP、RARP 三种。
- 分离出报头和有效载荷后,会根据该字段的值将有效载荷交给对应的上层协议。
⭐ 05. 认识 MAC 地址
- MAC 地址内嵌在网卡中,每张网卡在出厂时都有一个唯一的 MAC 地址。
- 局域网中的主机就是通过数据中携带的 MAC 地址来识别数据是谁发的,以及要发送给谁。
- MAC 帧格式中的目的地址和源地址指的就是 MAC 地址,MAC 地址长度为 48 位 (6 字节),一般用 16 进制的数据 + 冒号的形式表示。
查看 MAC 地址
- 在命令行中输入
ifconfig
指令,ether (以太) 那一行数字就是 MAC 地址。
⭐ 06. MAC 地址和 IP 地址
- 数据在路由过程中需要持有两套地址,一套是源 IP 和目的 IP,另一套是源 MAC 和目的 MAC 地址。
- IP 地址表示数据在整个网络中的起点和终点。
- MAC 地址表示数据在路上所经过的每一个局域网中的起点和终点。
- 数据在路由过程中,IP 地址固定 (由于 NAT 技术的存在,IP 也会变),而数据在每进行一次路由转发后,都会替换掉 MAC 地址。
⭐ 07. 为什么有 MAC 帧的最大传输单元 MTU
- 在局域网中进行通信时,发送的数据越大,所占用通信信道的时间也就越长,发生数据碰撞的概率也就越高。因此,数据链路层就必须控制在局域网中传输的 MAC 报文的最大长度。
- 在数据链路层中,使用 MTU 来控制 MAC 报文的最大长度。以太网对应的 MTU 的值一般是 1500 字节,不同的网络类型有不同的 MTU。如果一次性要发送的数据超过了 MTU,则需要在 IP 层对数据进行分片。
⭐ 08. MTU 对 IP 协议的影响
- 由于数据链路层规定的 MTU 这个最大传输单元,如果 IP 层一次性要发送的数据大小超过了 MTU,IP 层就必须对该数据进行分片,然后才能将分完片的数据向下交付。
- 数据的分片和组装发生在 IP 层,不仅仅是源端主机要对数据进行分片,数据在路由过程中,路由器也可能对这些数据进行分片。
- 由于不同局域网所采用的局域网技术可能不同,因此,会导致不同网络的 MTU不同,如果传输路径上的某个网络的 MTU 值 < 源端网络的 MTU 值,路由器就会对该 IP 数据报再次进行分片。
⭐ 09. MTU 对 UDP 协议的影响
- IP 报头最少也会占据 20 字节,而 UDP 的报头是定长的 8 字节。因此,UDP 报文所携带的饿数据最多不能超过 1472 字节。
- 如果 UDP 报文所携带的数据超过了 1472 字节,也会在 IP 层进行分片。
- 被分片的小报文在路上有一个丢了都会导致整个 UDP 报文丢失,因此分片会导致 UDP 报文大面积的丢包。
⭐ 10. MTU 对 TCP 协议的影响
- 虽然分片也会增加 TCP 报文丢包的概率,但由于 TCP 保证可靠性,会重发报文。
- 虽然 TCP 能够重发报文,但是这也是有代价的。因此,TCP 引入了 MSS 来控制一次性交付给 IP 层的数据量。
- MSS 的值并不是固定的,它需要经过通信双方协商后才能确定。
如何确定 MSS 值
- TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度,称为 MSS (Max Segment Size)。
- TCP 在建立连接的过程中,通信双方会协商 MSS 的值。
- 最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度 (这个长度仍然是受制于数据链路层的 MTU)。
- 双方在发送 SYN 连接请求报文的时候会在 TCP 头部写入自己能支持的 MSS 值。
- 然后双方得知对方的 MSS 值之后,就会选择较小那个的作为最终的 MSS 值。
- MSS 的值位于 TCP 首部的 40 字节变长选项中 (kind = 2)
⭐ 11. 查看硬件地址和 MTU
- 在命令行中输入
ifconfig
指令。 - MTU 后面跟着的就是当前网络的数据链路层的 MTU 的值。
- 在 ether (以太) 后面跟着的就是硬件地址 (MAC 地址)。
🌈 二、地址解析协议 ARP
- 地址解析协议 ARP (Address Resolution Protocol) 是一个根据 IP 地址获取 MAC 地址的协议。
- ARP 是一种介于数据链路层和网络层之间的协议,整体上属于数据链路层,但 ARP 是 MAC 帧的上层协议。
⭐ 01. ARP 协议的功能
- 当 A 主机发送数据给 B 主机时,这个数据在途中需要经过各种路由转发最终到达路由器 D,最后由路由器 D 将数据转发给 B 主机。
- 路由器 D 和主机 B 属于同一个网络,想要给同局域网中的其他主机转发数据,就需要直到该主机的 MAC 地址。
- 但是路由器 D 手里只有 B 主机的 IP 地址,并没有 B 主机的 MAC 地址。
- 此时就需要通过 ARP 协议从 B 主机的 IP 地址中提取出 B 主机的 MAC 地址。
- ARP 协议的功能就是根据目标主机的 IP 地址获取目标主机的 MAC 地址。
⭐ 02. ARP 协议的数据报格式
- ARP 协议中,各字段的数据单位为字节。
- 硬件类型:表示数据链路层的网络类型,为 1 则表示以太网。
- 协议类型:表示要转换的地址类型,如果该字段的值为 0x0800 则表示要转换的是 IP 地址。
- 硬件地址长度:如果使用的是以太网地址 (MAC 地址),则该字段的值为 6,表示 MAC 地址的长度为 6 字节。
- 协议地址长度:如果使用的是 IP 协议,则用 4 字节表示 IP 地址的长度。
- OP:如果在一个 ARP 报文中,该字段的值为 1,则表示 ARP 请求;如果该字段的值为 2,则表示 ARP 应答。
⭐ 03. ARP 协议的工作流程
- 以将数据从 A 主机发送给 B 主机为例,数据已经被路由转发到了 D 路由器,现在就等着 D 路由器将数据转发给 B 主机了。
- D 路由器想将数据转发给 B 主机,必须要先通过 B 主机的 IP 地址知道 B 主机的 MAC 地址。
- D 路由器需要向 B 主机发送一个ARP 请求,然后等待 B 主机返回一个 ARP 应答,来告知 B 主机的 MAC 地址。
🌙 3.1 发起 ARP 请求的过程
1. 路由器 D 构建 ARP 请求
- 将 ARP 报头中的 [OP] 字段置为 1,表示这个一个 ARP 请求报文。
- 将 ARP 请求中的 [硬件类型] 字段置为 1,表示当前使用的是以太网通信。
- 将 ARP 请求种的 [协议类型] 字段置为 0800,表示路由器需要根据 IP 地址来获取 MAC 地址。
- 将 ARP 请求中的 [硬件地址长度] 字段置为 6,表示 MAC 地址的长度为 6 字节。
- 将 ARP请求中的 [协议地址长度] 字段置为 4,表示 IP 地址的长度为 4 字节。
- 使用 B 主机的 MAC 地址和 IP 地址填充 ARP 请求中的 [目的以太网地址] 和 [目的 IP 地址] 这两个字段。由于当前还不知道 B 主机的 MAC 地址,因此将 [目的以太网地址] 的二进制序列全部置为 1 (FF:FF:FF:FF:FF:FF),表示以广播的方式将该 ARP 请求报文发送到局域网中。
2. 将 ARP 请求封装成 MAC 帧
- 构建好 ARP 请求报文后,还需要对该报文进行组帧封装成 MAC 帧后,才能将该 ARP 请求报文发送到以太网中。
- 使用目标主机 B 和 路由器 D 的 MAC 地址填充MAC 帧格式中的 [目的地址] 和 [源地址]。由于主机 B 的 MAC 地址未知,因此将 MAC 帧中的目的地址的二进制序列全部置为 1,表示在局域网中广播。
- 将 MAC 帧格式中的 [帧类型] 字段置为 0806,表示封装的是一个 ARP 报文。
- ARP 请求报文的长度为 28 字节,不足 MAC 帧所需要的 46 字节。还需要在 MAC 帧的有效载荷中补充 18 字节的填充字段。
- 对 MAC 帧进行 CRC 校验。
3. 将封装好的 MAC 帧广播到局域网中
- 将封装好的 MAC 帧发送到局域网后,局域网中的主机都能收到这个 MAC 帧。
- 每台主机的 MAC 层在接收到 MAC 帧后,会根据帧类型字段判断出有效载荷是一个 ARP 报文。分离出有效载荷 (ARP 请求报文) 后向上交付给 ARP 层。
- 这些主机的 ARP 层识别出该 ARP 报文的 [OP] 的值为 1,知道这是个 ARP 请求报文。
- 然后就去提取该 ARP 请求报文中的 [目的 IP 地址] 判断是否指向自己,如果不是则丢弃该 ARP 请求,只有目标主机会处理该 ARP 请求。
🌙 3.2 返回 ARP 应答的过程
1. 主机 B 构建 ARP 应答报文
- 将 ARP 报头中的 [OP] 字段置为 2,表示这个一个 ARP 应答报文。
- ARP 应答报文中的硬件类型、协议类型、硬件地址长度、协议地址长度与 ARP 请求报文中的值一致。
- 使用 B 主机的 [MAC 地址] 和 [IP 地址] 分别填充 ARP 应答报文中的 [发送端以太网地址] 和 [发送端 IP 地址]。
- 使用路由器 D 的 [MAC 地址] 和 [IP 地址] 分别填充 ARP 应答中的 [目的以太网地址] 和 [目的 IP 地址]。
2. 将 ARP 应答封装成 MAC 帧
- 使用路由器 D 和主机 B 的 MAC 地址分别填充 MAC 帧报头中的 [以太网目的地址] 和 [以太网源地址]。
- 将 MAC 帧报头中的 [帧类型] 字段置为 0806,表示封装的是一个 ARP 报文。
- ARP 应答报文的长度为 28 字节,不足 MAC 帧所需要的 46 字节。还需要在 MAC 帧的有效载荷中补充 18 字节的填充字段。
- 对 MAC 帧进行 CRC 校验。
3. 将封装好的 MAC 帧广播到局域网中
- 由于该 MAC 帧中填充了路由器 D 的 MAC 地址,因此局域网中其他收到该 MAC 帧的主机能直接在 MAC 层就识别出数据不是发给自己的,不会往上交给 ARP 层,而是直接丢弃。
- 路由器 D 在收到该 MAC 帧后,通过里面的 [以太网目的地址] 识别出是发给自己的。
- 路由器 D 发现该 MAC 帧的 [帧类型] 的值为 0806,知道了该 MAC 帧的有效载荷是一个 ARP 报文,直接将这个 ARP 报文提取出来交给 ARP 层。
- 路由器 D 的 ARP 层收到这个 ARP 报文后,通过 OP 字段判断出这是个 ARP 应答报文,然后就能提取出 B 主机的 MAC 地址了。
⭐ 04. ARP 缓存表
- 在使用 ARP 获取到目标主机的 MAC 地址后,会将对应主机的 IP 地址和 MAC 地址的映射关系存储在一张 ARP 缓存表中。
- 之后就不需要每次都发起 ARP 请求获取 MAC 地址了,只需要根据 IP 地址即可在 ARP 缓存表中查到对应的 MAC 地址。
- 如果 ARP 缓存表中没有与目标主机 IP 地址所对应的 MAC 地址,才会发起 ARP 请求。
查看 ARP 缓存表
- 每台主机内都维护了一张 ARP 缓存表,通过
arp -a
指令 (Windows 和 Linux 都是这个) 即可查看本主机中的 ARP 缓存表。
- ARP 缓存表中的内容有过期是过期时间 (一般是 20 分钟),如果 20 分钟内没有使用则会失效,下次再使用时就需要重新发起 ARP 请求获取对应主机的 MAC 地址。