文章目录
- 数据链路层(MAC地址)
- 1、以太网
- 2、以太网帧格式
- 3、MAC地址
- 4、对比理解 MAC 地址和 IP 地址
- 5、最大传输单元(MTU)
- 6、MTU 对 IP 协议的影响
- 7、MTU 对 UDP 协议的影响
- 8、MTU 对 TCP 协议的影响
- 9、查看硬件地址和 MTU
- 10、ARP 协议
- 10.1、ARP 协议的作用
- 10.2、ARP 协议的工作流程
- 10.3、ARP 数据报的格式
数据链路层(MAC地址)
用于两个设备(同一种数据链路节点)之间进行传递。
1、以太网
“以太网” 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容。
例如:规定了网络拓扑结构,访问控制方式,传输速率等。
以太网中的网线必须使用双绞线,传输速率有 10M,100M,1000M 等。
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN 等。
2、以太网帧格式
源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址),长度是 48 位,是在网卡出厂时固化的
帧协议类型字段有三种值,分别对应 IP(0800)、ARP(0806)、RARP(8035)
帧末尾是 CRC 校验码(主要用来检测或校核数据传输或者保存后可能原数据出现的错误)。
3、MAC地址
MAC 地址用来识别数据链路层中相连的节点,长度为 48 位,即 6 个字节。
一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19) ,在网卡出厂时就确定了,不能修改。
MAC 地址通常是唯一的(虚拟机中的 MAC 地址不是真实的 MAC 地址, 可能会冲突,也有些网卡支持用户配置 MAC 地址)
4、对比理解 MAC 地址和 IP 地址
IP 地址描述的是路途总体的起点和终点
MAC 地址描述的是路途上的每一个区间的起点和终点,在这区间,下一跳的 MAC 地址的是靠 IP 来获取的(下面会讲ARP协议)。
5、最大传输单元(MTU)
最大传输单元(MTU)是数据链路层能携带的最大数据。
- 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,传输的数据包的长度不够 46 字节,要在后面补填充位
- 最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU了,则需要对数据包进行分片(fragmentation)
- 不同的数据链路层标准的 MTU 是不同的。比如拨号网络(PPPoE)MTU是 1492 字节。
6、MTU 对 IP 协议的影响
由于数据链路层 MTU 的限制,对于较大的 IP 数据包要进行分包。
- 将较大的 IP 包分成多个小包,并给每个小包打上标识,每个小包 IP 协议头的 16 位标识(id) 都是相同的
- 每个小包的 IP 协议头的 3 位标志字段中,第 2 位置为 0,表示允许分片,第 3 位来表示结束标记(当前是否是最后一个小包,是的话置为 1,否则置为 0)
- 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层
- 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是 IP 层不会负责重新传输数据
7、MTU 对 UDP 协议的影响
一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)),那么就会在网络层分成多个 IP 数据报
这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败(因为 UDP 没有超时重传等机制)
这就意味着,如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了
8、MTU 对 TCP 协议的影响
TCP 的一个数据报也不能无限大,还是受制于 MTU
TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size)
TCP 在建立连接的过程中,通信双方会进行 MSS 协商
最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)
双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS
MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)
MTU 和 MSS 的关系:这里 FCS 和 CRC 差不多意思,都是校验数据的。
9、查看硬件地址和 MTU
使用 ifconfig 命令:可以看 IP 地址,子网掩码,MAC 地址,MTU。
xp2@Xpccccc:~$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.2 netmask 255.255.0.0 broadcast 192.168.255.255 inet6 fe80::216:3eff:fe69:921e prefixlen 64 scopeid 0x20<link> ether 00:16:3e:69:92:1e txqueuelen 1000 (Ethernet) RX packets 2006234 bytes 1866052644 (1.8 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1265736 bytes 330604772 (330.6 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
IP 地址:192.168.0.2
子网掩码:255.255.0.0
MAC 地址:00:16:3e:69:92:1e
MTU:1500
10、ARP 协议
虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
10.1、ARP 协议的作用
地址解析协议:ARP(Address Resolution Protocol)
ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系
在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址
由于数据包首先是被网卡(根据 MAC 地址)接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
因此在通讯前必须获得目的主机的硬件地址
如果当前局域网不存在目标主机 IP ,则把默认转发的 IP 口(路由器)的 MAC 返回。
10.2、ARP 协议的工作流程
源主机发出 ARP 请求,询问“IP 地址是 172.20.1.2 的主机的硬件地址是多少?并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播(一对多))
目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中,这个过程是单播(一对一)
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表(经常访问的 IP 可以节省时间)中的表项有过期时间(一般为 20 分钟,防止有的 IP 不在了,比如失效),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。
xp2@Xpccccc:~$ arp -a ? (192.168.0.1) at ee:ff:ff:ff:ff:ff [ether] on eth0
10.3、ARP 数据报的格式
- 注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的
- 硬件类型指链路层网络类型,1 为以太网
- 协议类型指要转换的地址类型,0x0800 为 IP 地址
- 硬件地址长度对应为 以太网地址 为 6 字节
- 协议地址长度对应 IP 地址为 4 字节
- op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答
OKOK,数据链路层(MAC地址)就到这里,如果你对Linux和C++也感兴趣的话,可以看看我的主页哦。下面是我的github主页,里面记录了我的学习代码和leetcode的一些题的题解,有兴趣的可以看看。
Xpccccc的github主页