文章目录
- [一、IP 协议概述](#一、IP 协议概述)
- [二、IP 基础知识全家桶](#二、IP 基础知识全家桶)
-
- [1. IP 地址分类(IPv4)](#1. IP 地址分类(IPv4))
- [2. 特殊 IP 地址](#2. 特殊 IP 地址)
- [3. IP 头部结构(IPv4)](#3. IP 头部结构(IPv4))
- [三、ping 的工作原理(基于 ICMP)](#三、ping 的工作原理(基于 ICMP))
-
- [1. ICMP 协议](#1. ICMP 协议)
- [2. ping 流程](#2. ping 流程)
- [3. 代码模拟(Python)](#3. 代码模拟(Python))
- [四、断网时,ping 127.0.0.1 是否通?](#四、断网时,ping 127.0.0.1 是否通?)
-
- [1. 环回地址特性](#1. 环回地址特性)
- [2. 实验验证](#2. 实验验证)
- [3. 应用场景](#3. 应用场景)
- [五、IP 路由与转发](#五、IP 路由与转发)
-
- [1. 路由表结构](#1. 路由表结构)
- [2. 路由操作](#2. 路由操作)
- [六、IP 分片与重组](#六、IP 分片与重组)
-
- [1. 分片原因](#1. 分片原因)
- [2. 分片字段](#2. 分片字段)
- [3. 重组](#3. 重组)
- [七、IPv6 与 IPv4 对比](#七、IPv6 与 IPv4 对比)
- [八、IP 实战技巧](#八、IP 实战技巧)
-
- [1. 故障排查](#1. 故障排查)
- [2. 地址规划](#2. 地址规划)
- 九、总结
一、IP 协议概述
IP(Internet Protocol)作为网络层核心协议,承担逻辑寻址与数据包路由职责,分为 IPv4 和 IPv6。IPv4 采用32 位地址(192.168.1.1),IPv6 为 128 位( 如2001:0db8:85a3::8a2e:0370:7334)。
IP协议无连接、不可靠,依赖传输层(如 TCP)保障可靠性,是网络通信的基石。
二、IP 基础知识全家桶
1. IP 地址分类(IPv4)
A 类:0xxx...(首位 0),范围0.0.0.0~127.255.255.255,适用于大型网络(128 个网络,每网 1677 万主机)。
B 类:10xx...(前两位 10),范围128.0.0.0~191.255.255.255,适用于中型网络(16384 个网络,每网 65534 主机)。
C 类:110x...(前三位 110),范围192.0.0.0~223.255.255.255,适用于小型网络(209 万网络,每网 254 主机)。
D 类:1110...(前四位 1110),范围224.0.0.0~239.255.255.255,用于组播(Multicast)。
E 类:1111...(前四位 1111),保留作科研(240.0.0.0~255.255.255.255)。
2. 特殊 IP 地址
环回地址(Loopback):127.0.0.0/8(如127.0.0.1),用于本机进程通信,断网时仍可 ping 通(见后续分析)。
广播地址:255.255.255.255(受限广播)或网络地址主机位全 1(如192.168.1.255,定向广播)。
私网地址:
A 类:10.0.0.0/8
B 类:172.16.0.0/12
C 类:192.168.0.0/16
私网地址需经 NAT(网络地址转换)访问公网。
3. IP 头部结构(IPv4)

关键字段:
版本:IPv4 为 4,IPv6 为 6。
首部长度:单位 4 字节(如5表示 20 字节首部,无选项)。
TTL(生存时间):数据包最大跳数(每跳减 1,为 0 时丢弃,防环路)。
协议:上层协议(6=TCP,17=UDP)。
三、ping 的工作原理(基于 ICMP)
1. ICMP 协议
ICMP(Internet Control Message Protocol)辅助 IP,传递控制信息(如差错报告、诊断)。ping通过发送ICMP 回显请求(Echo Request),接收方回复Echo Reply,测量连通性与延迟。
2. ping 流程
- 客户端发送ICMP Echo Request(含标识符、序列号、时间戳)。
- 路由器转发,更新TTL(每跳减1)。
- 目标主机回复Echo Reply(原数据+时间戳)。
- 客户端计算RTT(往返时间),输出结果。
3. 代码模拟(Python)
python
import socket
import struct
import time
def ping(host, count=4):
icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
icmp_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
for seq in range(count):
checksum = 0
header = struct.pack('!BBHHH', 8, 0, checksum, 0, seq)
data = struct.pack('!d', time.time())
checksum = calculate_checksum(header + data)
header = struct.pack('!BBHHH', 8, 0, checksum, 0, seq)
packet = header + data
start_time = time.time()
icmp_socket.sendto(packet, (host, 0))
icmp_socket.settimeout(1)
try:
recv_packet, addr = icmp_socket.recvfrom(1024)
rtt = (time.time() - start_time) * 1000
print(f"Reply from {addr[0]}: time={rtt:.2f}ms")
except socket.timeout:
print("Request timed out")
def calculate_checksum(data):
if len(data) % 2:
data += b'\0'
s = 0
for i in range(0, len(data), 2):
s += (data[i] << 8) + data[i+1]
s = (s >> 16) + (s & 0xffff)
s += s >> 16
return ~s & 0xffff
if __name__ == "__main__":
ping("127.0.0.1") # 测试环回地址
四、断网时,ping 127.0.0.1 是否通?
1. 环回地址特性
127.0.0.0/8属于本机回环接口(lo),数据包在网卡驱动层处理,不经过物理网卡。即使物理网卡(如eth0)断开,回环接口(lo)仍存在(ifconfig lo可见)。
2. 实验验证
bash
# 关闭物理网卡
ifconfig eth0 down
# ping环回地址
ping 127.0.0.1 # 仍能收到回复(TTL=64,时间正常)
3. 应用场景
本机服务测试:无需网络,验证进程是否监听localhost(如127.0.0.1:8080)。
协议栈调试:检查 IP/ICMP 协议栈是否正常(物理层断开不影响)。
五、IP 路由与转发
1. 路由表结构

2. 路由操作
bash
# 添加静态路由
route add -net 10.0.0.0/24 gw 192.168.1.2 dev eth0
# 查看路由表
route -n
六、IP 分片与重组
1. 分片原因
数据包大小超过链路 MTU(如以太网 MTU=1500 字节)时,需分片传输。
2. 分片字段
标识(Identifier):分片所属原始包标识。
标志(Flags):MF(是否还有分片)、DF(禁止分片,用于路径 MTU 发现)。
片偏移(Fragment Offset):分片在原始包中的位置(单位 8 字节)。
3. 重组
接收方按标识和片偏移重组,缺失分片则丢弃(IP 不保证可靠性,由传输层处理)。
七、IPv6 与 IPv4 对比

八、IP 实战技巧
1. 故障排查
ip addr:查看 IP、子网、MAC。
traceroute:追踪路由路径(使用 ICMP/UDP 分片)。
tcpdump:抓包分析 IP 头部、TTL、分片。
2. 地址规划
CIDR(无类别域间路由):如192.168.1.0/24(256 地址,24 位前缀)。
VLSM(可变长子网掩码):按需分配子网(如/24办公,/28服务器)。
九、总结
IP 协议通过寻址、路由、分片等机制,支撑网络层通信。掌握 IP 地址分类、环回地址特性、ping 原理,是网络运维与开发的核心。结合抓包工具(如 Wireshark)实验,可深入理解 IP 在实际场景中的行为,解决连通性问题,为上层协议(如 TCP/UDP)的学习奠定基础。