前面在介绍网络层时我们提出来过一个问题:主机是怎么把数据交给路由器的?那里我们说这是由数据链路层来做的。
网络上的报文在物理结构上是以mac帧的形式流动的,但在逻辑上是以IP流动的,IP的流动是需要mac帧支持的。
数据链路层解决的是相邻节点间的通信问题。
1. 以太网
1.1 认识以太网
“以太网”不是一种具体的网络,而是一种技术标准。它既包含了数据链路层的内容,也包含了一些物理层的内容。它不但规定了网络拓扑结构、访问控制方式、传输速率等问题;而且规定了以太网中的网线必须使用双绞线,其传输速率有 10M、100M、1000M…… 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无线 LAN ……
1.2 以太网的帧格式
报头各部分的功能:
• 源地址和目的地址:指网卡的硬件地址(mac 地址)
• 类型:该字段有三种值,分别对应 IP、ARP、RARP
• CRC:校验码
关于mac地址
mac 地址用来识别数据链路层中相连的节点,它的长度为 48 位( 6 个字节),一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。它在网卡出厂时就确定了,不能修改。
mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)。
2. MTU
2.1 认识MTU
MTU 相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,若 ARP 数据包的长度不够 46 字节就要在后面补填充位。最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 则需要对数据包进行分片。
我们可以通过ifconfig 命令查看 ip 地址、mac 地址和 MTU。
2.2 MTU对IP协议的影响
由于数据链路层 MTU 的限制,这使得对于较大的 IP 数据包要进行分包。
2.3 MTU对UDP协议的影响
一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)) 那么就会在网络层分成多个 IP 数据报。这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着:如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
2.4 MTU对TCP协议的影响
TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度为 1460(1500 - 20(IP首部) - 20(TCP首部)),称为 MSS(Max Segment Size)。 TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下就是MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。
双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind = 2)。
MSS和MTU的关系:
3. 局域网通信原理和交换机
3.1 局域网通信原理示意图
局域网中,任何时刻都只允许一台机器向网络中发送数据,如果有多台同时发送的话,会发生数据干扰,我们称之为数据碰撞。所有发送数据的主机要进行碰撞检测和碰撞避免。
如果碰撞了,涉及的主机该怎么办呢?
两台主机都会休眠一下,然后将数据重发(数据链路层也有重发机制)。
在没有交换机的情况下,一个局域网就是一个碰撞域。
从系统的角度来看,局域网就是一个临界资源,碰撞检测和碰撞避免就是保护临界资源,使得任何时刻都只有一台主机发送消息的策略和机制。
所以在一个局域网(碰撞域)中主机自然是越少越好,如果主机过多就要引入交换机了。
3.2 交换机
交换机的核心问题就是通过对局域网中的mac帧进行分析,从而划分碰撞域。
4. APR协议
曾经在介绍网络层时说到过,数据转发的时候用到的是IP地址,但是在局域网通信时我们使用的可是mac地址啊,所以这也就注定需要在局域网中提供一种将IP地址转化为mac地址的能力——ARP协议。
4.1 基本原理
源主机发出 ARP 请求,询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。目的主机接收到广播的 ARP 请求后若发现其中的 IP 地址与本机相符,则将自己的硬件地址填写在应答包中,并发送 ARP 应答数据包给源主机。
总结来说就是:先广播,后单发。
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。
C:\Users\caryo>arp -a
接口: 172.18.154.182 --- 0xe
Internet 地址 物理地址 类型
169.254.169.254 cc-d8-1f-28-db-2f 动态
172.18.145.119 ac-19-8e-6c-c5-8c 动态
172.18.148.251 ac-50-de-88-fa-45 动态
172.18.150.140 64-d6-9a-9a-37-1f 动态
172.18.152.44 c4-d0-e3-64-de-35 动态
4.2 ARP协议报头
可以看出ARP协议是 mac 帧协议的上层协议,但是也属于数据链路层。
报头各部分的功能:
• 硬件类型:指链路层网络类型,1 为以太网
• 协议类型:指要转换的地址类型,0x0800 为 IP 地址
• 硬件地址长度:对于以太网地址为 6 字节
• 协议地址长度:对于和 IP 地址为 4 字节
• op 字段:为 1 表示 ARP 请求,为 2 表示 ARP 应答
4.3 ARP的具体过程
如果路由器知道IP对应的MAC地址,那就可以直接发送,如果不知道,就要使用ARP协议获取目的MAC。
主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。目的MAC地址为全F(FF:FF:FF:FF:FF:FF)。局域网内的所有主机都会收到这个ARP请求,网卡识别目的MAC地址为全F,广播数据,需要向上交付,再根据帧类型识别是ARP请求/响应。所以向上交付给ARP协议。ARP协议 先看op字段,如果为ARP请求,再看目的IP地址,除目的主机外,其他主机发现不是给自己的,就在ARP层丢弃报文。如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。