网络层理解
网络层是 OSI 模型的第三层,主要负责 跨网络的数据传输,核心任务是 路由选择 和 分组转发。
网络层核心功能
网络层关键协议
协议 | 作用 | 示例 |
---|---|---|
IP (IPv4/IPv6) | 数据包路由和寻址 | 192.168.1.1 |
ICMP | 网络状态检测和错误报告 | ping、traceroute |
OSPF/BGP | 动态路由选择 | 互联网 AS 自治系统 |
ARP | IP → MAC 地址解析 | 局域网通信 |
IPSec | 安全加密传输 | VPN |
数据包(Packet)结构
网络层数据包主要分成首部和数据组成
网络层数据包图示
网络层头部图示
数据包各组成部分说明
-
版本号(Version)
- 表示协议版本。IPv4包中这个字段占4位,IPv6包中也是如此。
- 示例:IPv4为4,IPv6为6。
-
首部长度(Header Length)
- 表示IP头部的长度,单位为32位字。IPv4头部通常是20字节,若有选项则可能更长。
-
服务类型(Type of Service, ToS)
- 也称为“优先级字段”,包含网络层的数据包优先级信息,例如延迟、吞吐量、可靠性等。
-
总长度(Total Length)
- 指整个数据包的大小(包括数据和头部),单位为字节。IPv4数据包最大可达65535字节。
-
标识符(Identification)
- 用于唯一标识一个分段的包,在数据包被分割时,用于数据包的重组。
属性 | 说明 |
---|---|
长度 | 16比特(取值范围:0~65535) |
生成规则 | 由发送方主机按顺序分配,通常每发送一个IP包递增1 |
复用时机 | 当标识符计数达到65535后归零 |
关键要求 | 同一数据包的所有分片必须相同,不同数据包的标识符必须不同 |
- 标志(Flags)
- 该字段控制是否可以对数据包进行分片。3位字段,标志位中最重要的是“分片标志”和“更多分片”标志。
- 该字段控制是否可以对数据包进行分片。3位字段,标志位中最重要的是“分片标志”和“更多分片”标志。
标志位 | 名称 | 功能 |
---|---|---|
DF | Don’t Fragment | - 1:禁止分片(若需分片则丢弃并返回ICMP错误) - 0:允许分片 |
MF | More Fragments | - 1:后续还有分片 - 0:当前是最后一个分片 |
-
片偏移(Fragment Offset)
-
在数据包被分片时,表示数据片段相对于原始数据包的偏移量。
-
核心规则
-
单位:8字节(因此实际字节偏移量 = 片偏移值 × 8)
-
计算式:片偏移 = ⌊当前分片起始字节位置 / 8⌋
-
最大值:13比特 → 最大偏移值=8191 → 可表示最大原始包长度=65528字节(含IP头)
-
-
分片重组验证
-
-
生存时间(Time to Live, TTL)
-
TTL 的定义
-
全称:Time to Live(生存时间)
-
位置:IPv4 头部中的 8位字段(取值范围:0~255)
-
单位:跳数(Hops),每经过一个路由器减1
-
初始值:通常由操作系统设置(Windows=128,Linux=64,网络设备=255)
-
-
TTL 的核心用途
- 防止网络环路
- 当路由表错误导致环路时,TTL 归零后数据包被丢弃,避免耗尽带宽。
- 触发机制:
- 防止网络环路
-
限制传播范围
- 控制数据包可穿越的最大路由器数量(如设置TTL=16可限制在本地网络)。
-
路径发现工具
-
Traceroute 原理:
-
发送TTL=1的探测包,第一个路由器返回ICMP超时
-
逐步增加TTL值,记录沿途路由器IP
示例: Hop 1: 192.168.1.1 (TTL=1) Hop 2: 10.0.0.1 (TTL=2) Hop 3: 203.0.113.45 (TTL=3)
- 常用路由追踪工具
- Windows 下
tracert
和pathping
- Linux下
traceroute
,tracepath
和mtr
- Windows 下
-
-
-
TTL的工作流程
-
不同协议的TTL特性
-
协议/设备 | 默认TTL值 | 特殊行为 |
---|---|---|
Windows | 128 | Ping命令可自定义TTL |
Linux | 64 | Traceroute使用UDP+ICMP |
路由器 | 255 | 通常不修改经过包的TTL |
IPv6 | Hop Limit | 功能等同TTL但字段名不同 |
-
协议(Protocol)
- 指示数据包的上层协议,如TCP、UDP等。IPv4头部中该字段为8位。
- 常见协议类型及编号
协议编号(十进制) 协议名称 用途 典型应用 1 ICMP 网络诊断和错误报告 ping、traceroute 2 IGMP 组播管理 视频会议、IPTV 6 TCP 可靠面向连接传输 HTTP、SSH、FTP 17 UDP 无连接高效传输 DNS、DHCP、QUIC 41 IPv6封装 IPv6 over IPv4隧道 6to4隧道 47 GRE 通用路由封装 VPN、SD-WAN 50 ESP IPsec 加密负载 VPN安全传输 51 AH IPsec 认证头 数据完整性验证 89 OSPF 动态路由协议 企业内网路由 -
头部校验和(Header Checksum)
- 用于校验IP头部是否损坏。它是一个16位的字段,用于对头部数据进行错误检测。
-
源IP地址(Source IP Address)
- 数据包的发送端IP地址。它是32位(IPv4)或128位(IPv6)。
-
目的IP地址(Destination IP Address)
- 数据包的接收端IP地址。它是32位(IPv4)或128位(IPv6)。
-
选项(Options)
- 这个部分是可选的,在标准IP数据包中可能没有。它包含一些用于调试、控制的扩展信息(例如时间戳、路由记录等)。
-
数据(Data)
- 数据部分(也叫有效载荷或Payload),存放应用层传输的数据,通常由TCP/UDP协议提供的段构成。
片偏移讲解和图示
片偏移(Fragment Offset)
是IP协议中分片数据包的一部分,它用于指示分片数据包中数据的相对位置。简而言之,当一个大的IP数据包被分片传输时,每个分片的数据部分都包含一个偏移量,告诉接收端该分片在整个数据包中的位置。
分片和片偏移
在IP协议中,当数据包过大时(超过了最大传输单元 MTU,通常是1500字节),它需要被分割成多个较小的数据包,这个过程叫做分片。每个分片都会有一个“片偏移”字段,用来表示该分片在整个原始数据包中的相对位置。
片偏移的作用
- 片偏移表示当前分片中数据相对于原始数据包的起始位置的偏移量,以8字节为单位。
- 例如,如果一个数据包被分成4个分片,每个分片的偏移量就告诉接收端数据应该如何重组。
举个例子
假设有一个大数据包,其大小为4000字节,我们需要将其分成4个分片来传输。每个分片的大小为1000字节(假设1500字节的MTU,去掉了头部20字节)。每个分片都会有一个偏移量,表示它的数据在整个原始数据包中的位置。
分片过程:
-
分片1:
- 数据:从第0字节开始,大小1000字节
- 偏移:0(表示这个分片的数据从原始数据包的0字节开始)
-
分片2:
- 数据:从第1000字节开始,大小1000字节
- 偏移:125(表示该分片的数据从原始数据包的1000字节处开始,1000 ÷ 8 = 125)
-
分片3:
- 数据:从第2000字节开始,大小1000字节
- 偏移:250(表示该分片的数据从原始数据包的2000字节处开始,2000 ÷ 8 = 250)
-
分片4:
- 数据:从第3000字节开始,大小1000字节
- 偏移:375(表示该分片的数据从原始数据包的3000字节处开始,3000 ÷ 8 = 375)
偏移字段的计算
片偏移是以8字节为单位的。例如,第一个分片的偏移是0,第二个分片的偏移是1000 ÷ 8 = 125,以此类推。
图示说明
关键说明
-
片偏移计算
-
分片2的起始字节为 1000,片偏移 = 1000 / 8 = 125
-
分片3的起始字节为 2000,片偏移 = 2000 / 8 = 250
-
分片4的起始字节为 3000,片偏移 = 3000 / 8 = 375
-
-
MF标志
-
前3个分片的 MF=1(More Fragments),表示后续还有分片
-
最后一个分片的 MF=0,表示结束
-
-
单位一致性
-
所有偏移量以 8字节 为单位(RFC 791规定)
-
因此数据长度必须是 8的倍数(若不足会填充)
-
Wireshare抓包验证
- 发送大数据
使用命令行工具,比如ping(通过设置大的数据包大小)来生成分片包
ping -s 4000 <目标IP>
这将发送一个4000字节的数据包,超过MTU限制,触发IP层分片。
-
过滤分片数据包
使用Wireshark的过滤器来仅显示分片数据包。在Wireshark的过滤框中,输入以下过滤表达式:
ip.flags.mf == 1 || ip.frag_offset > 0
- ip.flags.mf == 1:显示“更多分片”标志设置为1的分片,意味着这不是最后一个分片。
- ip.frag_offset > 0:显示偏移量大于0的分片,表示这是非第一个分片。
在wireshare中最后一个偏移片重组数据
Wireshare 截图翻译理解
Internet Protocol Version 4, Src: 10.0.0.201, Dst: 10.0.0.1
┌──────────────────────┬──────────────────────────────────────────────┐
| 字段 | 说明 |
├──────────────────────┼──────────────────────────────────────────────┤
| 0100 .... | 版本号: IPv4 (二进制0100) |
| .... 0101 | 头部长度: 5×4=20字节 (标准IPv4头部) |
| Differentiated | 区分服务字段: 0x00 (默认无QoS优先级) |
| 0000 00.. | DSCP: CS0 (普通流量) |
| .... ..00 | ECN: 不支持拥塞通知 |
| Total Length | 总长度: 1500字节 (含IP头和数据) |
| Identification | 标识符: 0xeb60 (60256) |
| Flags | 分片标志: 0x1 (更多分片) |
| 0... .... | 保留位: 未设置 |
| .0.. .... | DF=0 (允许分片) |
| ..1. .... | MF=1 (后续还有分片) |
| Fragment Offset | 片偏移: 0 (当前是第一个分片) |
| Time to Live | 生存时间: 64 (每经过路由减1) |
| Protocol | 协议类型: ICMP (1) |
| Header Checksum | 头部校验和: 0x54f7 (校验未启用) |
| Source Address | 源IP: 10.0.0.201 |
| Destination Address | 目的IP: 10.0.0.1 |
| [Reassembled IPv4...]| 该分片属于帧59的IPv4重组数据 |
| [Stream index: 0] | 数据流索引: 0 |
└──────────────────────┴──────────────────────────────────────────────┘