9.2 链路层与网络层
链路层和网络层是网络通信的基础层,负责将数据包从源主机传输到目标主机,理解这两层的原理有助于我们排查网络连接问题,理解数据包的传输过程。
数据链路层
数据链路层负责同一个局域网内相邻节点之间的数据传输,最常见的链路层协议是以太网协议,现在几乎所有的局域网都是以太网。
以太网协议
以太网是目前使用最广泛的局域网技术,定义了链路层的帧格式和传输规则。
以太网帧格式
一个标准的以太网帧大小在64-1518字节之间,结构如下:
┌──────────┬──────────┬────────┬─────────┬──────────┬──────────┐
│ 目标MAC │ 源MAC │ 类型 │ 数据 │ FCS校验 │ 帧间隙 │
│ 6字节 │ 6字节 │ 2字节 │ 46-1500字节│ 4字节 │ 12字节 │
└──────────┴──────────┴────────┴─────────┴──────────┴──────────┘
- 目标MAC地址:接收方的物理地址
- 源MAC地址:发送方的物理地址
- 类型:表示上层协议类型,0x0800表示IP协议,0x0806表示ARP协议
- 数据:上层协议的数据包,最大1500字节,这个大小叫做MTU(最大传输单元)
- FCS:帧校验序列,用来检测帧在传输过程中是否出错
MAC地址
MAC地址(Media Access Control Address)是网卡的物理地址,是每个网卡全球唯一的标识符,长度48位,通常表示为12个十六进制数,比如00:1A:2B:3C:4D:5E。
- MAC地址是烧录在网卡中的,理论上不会改变
- 链路层通过MAC地址来标识同一个局域网内的不同设备
- 注意:MAC地址是局域网内使用的,跨局域网传输时MAC地址会改变,而IP地址是跨网络的,全程不变。
ARP协议(地址解析协议)
ARP协议的作用是根据IP地址获取对应的MAC地址,是链路层和网络层之间的桥梁。
- 工作原理:
- 主机A要和同一局域网内的主机B通信,知道主机B的IP地址,但不知道MAC地址
- 主机A在局域网内广播ARP请求:“IP地址是192.168.1.100的MAC地址是什么?”
- 局域网内所有主机都收到这个请求,只有IP地址匹配的主机B会发送ARP响应,告诉主机A自己的MAC地址
- 主机A收到响应后,把IP和MAC的对应关系缓存到ARP缓存中,下次直接使用
- ARP缓存:每个主机都有ARP缓存表,存储IP到MAC的映射,有效期通常是15-30分钟
- ARP欺骗:攻击者发送伪造的ARP响应,欺骗其他主机把流量发到攻击者的机器上,是常见的局域网攻击手段,通常用静态ARP绑定、ARP防火墙来防范。
VLAN(虚拟局域网)
VLAN可以把一个物理交换机划分为多个逻辑上的虚拟局域网,不同VLAN之间二层隔离,不能直接通信,需要通过路由器转发。
- 作用:隔离广播域,提升网络安全性,方便网络管理
- 802.1Q协议:在以太网帧头中加入VLAN标签,标识帧属于哪个VLAN
网络层(IP层)
网络层负责跨网络的数据包传输,把数据包从源主机经过多个网络转发到目标主机,核心协议是IP协议(Internet Protocol)。
IP协议
IP协议是TCP/IP协议族的核心,所有上层协议的数据都封装在IP数据包中传输。IP协议是无连接、不可靠的协议,不保证数据包一定能到达,也不保证顺序,可靠性由上层的TCP协议保证。
IP地址
IP地址是互联网上每个主机的唯一标识,目前主要有两个版本:IPv4和IPv6。
IPv4地址
IPv4地址长度32位,通常用点分十进制表示,比如192.168.1.1,分为网络部分和主机部分:
- 网络部分:标识主机所属的网络
- 主机部分:标识网络内的具体主机
IP地址分类
早期的IP地址分为五类:
| 类别 | 开头 | 范围 | 网络数 | 每个网络的主机数 | 用途 |
|---|---|---|---|---|---|
| A类 | 0 | 0.0.0.0 ~ 127.255.255.255 | 126 | 1600万 | 大型网络 |
| B类 | 10 | 128.0.0.0 ~ 191.255.255.255 | 16384 | 65534 | 中型网络 |
| C类 | 110 | 192.0.0.0 ~ 223.255.255.255 | 200万 | 254 | 小型网络 |
| D类 | 1110 | 224.0.0.0 ~ 239.255.255.255 | - | - | 组播 |
| E类 | 1111 | 240.0.0.0 ~ 255.255.255.255 | - | - | 保留 |
现在分类的方式已经很少使用了,取而代之的是CIDR(无类域间路由),用子网掩码来划分网络和主机部分。
子网掩码
子网掩码用来区分IP地址的网络部分和主机部分,长度也是32位,网络部分全为1,主机部分全为0,例如:
- A类默认子网掩码:255.0.0.0(/8)
- B类默认子网掩码:255.255.0.0(/16)
- C类默认子网掩码:255.255.255.0(/24)
CIDR表示法:在IP地址后面加/网络位数,比如192.168.1.0/24表示前24位是网络位,后8位是主机位,这个网段有256个IP地址。
特殊IP地址
- 127.0.0.0/8:回环地址,用于本机通信,127.0.0.1就是本机
- 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16:私有IP地址,用于局域网,不能直接访问公网,需要NAT转换
- 0.0.0.0:表示所有地址,通常用于服务监听所有网卡
- 255.255.255.255:广播地址,同一局域网内所有主机都能收到
- 169.254.0.0/16:自动专用IP地址,DHCP获取失败时自动分配的地址
NAT(网络地址转换)
由于公网IPv4地址不足,局域网内的私有IP访问公网时需要通过NAT转换为公网IP:
- 源NAT(SNAT):修改数据包的源IP,把私有IP转换为公网IP,多个内网主机共享一个公网IP
- 目的NAT(DNAT):修改数据包的目的IP,把公网IP和端口映射到内网的某个主机和端口
- 端口映射就是一种DNAT,把公网的端口映射到内网服务器的端口
- NAT解决了IPv4地址不足的问题,但也导致了很多问题,比如P2P连接困难,需要打洞技术
IPv6
IPv4的地址只有32位,最多只能有43亿个地址,现在已经耗尽了,IPv6是下一代IP协议,地址长度128位,几乎可以无限分配:
- 表示方式:8组四位十六进制数,用冒号分隔,比如
2001:0db8:85a3:0000:0000:8a2e:0370:7334,可以省略连续的0,简写为2001:db8:85a3::8a2e:370:7334 - 优势:地址空间极大,不需要NAT,端到端可达,内置安全特性,性能更好
- 现在越来越多的网络已经支持IPv6,是未来的发展方向
ICMP协议(互联网控制报文协议)
ICMP协议是网络层的辅助协议,用来传递控制消息,比如网络不可达、主机不可达、超时等。
我们常用的ping命令就是基于ICMP协议:
- ping向目标主机发送ICMP Echo Request请求
- 目标主机收到后返回ICMP Echo Reply响应
- 计算往返时间和丢包率,判断网络是否通畅
traceroute(Windows下是tracert)命令也是基于ICMP协议,用来探测数据包从源主机到目标主机经过的路由路径。
路由原理
当源主机和目标主机不在同一个局域网时,IP数据包需要经过多个路由器转发才能到达目标主机,这个过程就是路由。
路由表
每个路由器和主机都有一张路由表,记录不同网段的下一跳地址:
目标网络 子网掩码 下一跳地址 接口 度量值
0.0.0.0 0.0.0.0 192.168.1.1 eth0 100 # 默认路由
192.168.1.0 255.255.255.0 0.0.0.0 eth0 0 # 直连网段
10.0.0.0 255.0.0.0 192.168.1.2 eth0 50 # 10网段的下一跳是192.168.1.2
- 最长匹配原则:数据包的目标IP和路由表中的条目匹配时,选择最长前缀匹配的条目
- 默认路由:0.0.0.0/0,所有匹配不到其他路由的数据包都走默认路由,通常是网关地址
路由选择过程
- 主机发送IP数据包时,先判断目标IP和自己是否在同一个网段
- 同网段:直接通过ARP获取目标MAC,封装成帧直接发送
- 不同网段:把数据包发送给默认网关(路由器)
- 路由器收到数据包后,根据目标IP查找路由表,找到下一跳地址
- 路由器重新封装链路层帧,把数据包转发给下一跳路由器
- 经过多次转发,最终数据包到达目标主机所在的局域网,发送给目标主机
常见的路由协议
路由器之间通过路由协议交换路由信息,自动生成路由表:
- 内部网关协议(IGP):同一个自治系统内使用,比如RIP、OSPF
- 外部网关协议(EGP):不同自治系统之间使用,比如BGP,是互联网的核心路由协议
常见问题排查
- 同一局域网内主机不通:检查IP配置、子网掩码是否正确,ARP缓存是否正常,防火墙是否拦截
- 跨网段不通:检查网关配置是否正确,路由器路由是否正确,防火墙是否拦截
- ping不通公网:检查DNS配置、网关配置、NAT是否正常、公网出口是否正常
思考问题
- MAC地址和IP地址有什么区别?为什么需要两个地址?
- ARP协议的作用是什么?ARP欺骗的原理是什么?如何防范?
- 什么是子网划分?给定IP段192.168.1.0/24,要划分4个子网,每个子网至少30台主机,子网掩码应该是多少?每个子网的网段和可用IP范围是什么?
- 什么是NAT?它解决了什么问题?带来了什么新的问题?