数据链路层的作用?
网络传输不是直接从源主机发送到目的主机,其中要经过很多个子网,而数据链路层的作用就是进行子网通信。
一、以太网
1.以太网帧格式

源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址), ⻓度是48位,是在⽹卡出⼚时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码。
2.认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位,即6字节,一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);
MAC地址在出厂的时候就确定了,不能修改,mac地址通常是唯一的。
3.理解MAC地址和IP地址
IP地址是你的开始出发位置和最终要到达的位置,而MAC地址是你在前往最终终点过程中的所在位置和下一步要去的位置,以到达终点。
举个例子:你在广东,要去北京,广东就是源IP地址,北京就是目的IP地址;这中间要经过湖南、湖北、河南、河北,比如说你现在到了河南、下一个目的地是河北,河南就是源MAC地址,河北就是目的MAC地址,同样的你在湖南,要到湖北,湖南就是源MAC地址,湖北就是目的MAC地址。
4.MTU
MTU相当于发快递时对包裹尺⼨的限制. 这个限制是不同的数据链路对应的物理层, 产⽣的限制.
• 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填充位;
• 最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU;
• 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚(fragmentation);
• 不同的数据链路层标准的MTU是不同的;
①MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较⼤的IP数据包要进⾏分包.
• 将较⼤的IP包分成多个⼩包, 并给每个⼩包打上标签;
• 每个⼩包IP协议头的 16位标识(id) 都是相同的;
• 每个⼩包的IP协议头的3位标志字段中, 第2位置为0, 表⽰允许分⽚, 第3位来表⽰结束标记(当前是否是最后⼀个⼩包, 是的话置为1, 否则置为0);
• 到达对端时再将这些⼩包, 会按顺序重组, 拼装到⼀起返回给传输层;
• ⼀旦这些⼩包中任意⼀个⼩包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;
②MTU对UDP协议的影响
• ⼀旦UDP携带的数据超过1472(1500 - 20(IP⾸部) - 8(UDP⾸部)), 那么就会在⽹络层分成多个IP数据报.
• 这多个IP数据报有任意⼀个丢失, 都会引起接收端⽹络层重组失败. 那么这就意味着, 如果UDP数据报在⽹络层被分⽚, 整个数据被丢失的概率就⼤增加了.
③MTU对TCP协议的影响
• TCP的⼀个数据报也不能⽆限⼤, 还是受制于MTU. TCP的单个数据报的最⼤消息⻓度, 称为
MSS(Max Segment Size);
• TCP在建⽴连接的过程中, 通信双⽅会进⾏MSS协商.(包含在选项中,选择两个MSS中较小的MSS作为双方的MSS)
• 最理想的情况下, MSS的值正好是在IP不会被分⽚处理的最⼤⻓度(这个⻓度仍然是受制于数据链路层的MTU).
• 双⽅在发送SYN的时候会在TCP头部写⼊⾃⼰能⽀持的MSS值.
• 然后双⽅得知对⽅的MSS值之后, 选择较⼩的作为最终MSS.
• MSS的值就是在TCP⾸部的40字节变⻓选项中(kind=2);
5.局域网传输
主机A为什么要把数据交给主机E?
路由决定的!
局域网就是一个碰撞域,一个时刻只能发送一个数据帧,所以使用以太网的时候,使用时间越短越好。那么主机A发送数据帧越长越好还是越短越好?
数据帧不能太长,也不能太多,单个数据帧既不能太长也不能太短。
在对网络层的讲解中,有一个问题,数据帧为什么不能超过1500?
其实这是科学家根据测试得出的结论,数据长度46~1500字节,发生碰撞的概率最小。

如上图所示,我们从B主机发送数据到C主机,我们只知道C主机的IP地址,不知道它的MAC地址,那怎么给C主机发送数据帧呢?
所以这里引入了一个局域网协议,叫做ARP协议,它是一个地址解析协议,能够将IP转换成对应的MAC地址。
二、ARP协议

硬件类型:硬性规定为1;
协议类型:协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址长度:硬件地址⻓度对于以太⽹地址为6字节;
协议地址长度:协议地址⻓度对于和IP地址为4字节;
op:op字段为1表示ARP请求,op字段为2表示应答;
发送端以太网地址:主机A的以太网地址;
发送端IP地址:主机A的IP地址;
目的以太网地址:不知道,填写全FFFFF...
目的IP地址:主机E的IP地址
ARP协议报文什么时候发送?
ARP 是独立协议包 ,不是每个 IP 报文都带 ARP 头。
同一目标 IP:通常只发一次 ARP,结果缓存复用。
只有缺缓存、缓存过期、MAC 变化时,才重新发 ARP。
模拟ARP协议报文发送过程?
- 先设定场景(同一局域网)
主机 A(发送方)
IP:
192.168.1.10MAC:
AA:AA:AA:AA:AA:AA主机 B(目标)
IP:
192.168.1.20MAC:
BB:BB:BB:BB:BB:BB广播 MAC:
FF:FF:FF:FF:FF:FF
- 第一步:主机 A 发送 ARP 请求报文(广播)
1)以太网帧头部(14 字节)
目的 MAC:
FF:FF:FF:FF:FF:FF(广播)源 MAC:
AA:AA:AA:AA:AA:AA类型:
0x0806(表示这是 ARP 报文)2)ARP 报文头部(28 字节)
硬件类型:
1(以太网)协议类型:0x0800(IPv4)硬件地址长度:6(MAC 长度)协议地址长度:4(IP 长度)操作码(Opcode):1(1 = 请求,2 = 响应)发送端 MAC:
AA:AA:AA:AA:AA:AA发送端 IP:192.168.1.10目标 MAC:00:00:00:00:00:00 (还不知道,填空)目标 IP:
192.168.1.20
- 第二步:局域网所有主机收到广播,只有 B 匹配 IP
主机 B 检查:
目标 IP = 自己 IP → 处理该 ARP 请求其它主机:
目标 IP≠自己 → 直接丢弃
- 第三步:主机 B 发送 ARP 响应(单播回复)
1)以太网帧头部
目的 MAC:
AA:AA:AA:AA:AA:AA(直接发给 A,不再广播)源 MAC:
BB:BB:BB:BB:BB:BB类型:
0x0806(ARP)2)ARP 报文头部
硬件类型:1协议类型:0x0800硬件地址长度:6协议地址长度:4操作码:2(表示这是 ARP 响应)
发送端 MAC:
BB:BB:BB:BB:BB:BB← B 的 MAC发送端 IP:192.168.1.20目标 MAC:
AA:AA:AA:AA:AA:AA← A 的 MAC目标 IP:192.168.1.10
- 第四步:主机 A 收到响应,更新 ARP 缓存
A 从报文中取出:
192.168.1.20 → BB:BB:BB:BB:BB:BB写入本地 ARP 表,之后发 IP 报文直接用这个 MAC,不再发 ARP。
