1. IPv4寻址:从分类到无分类的演进之路
第一次配置网络时,我被192.168.1.1这样的地址搞晕了——为什么不能随便设置数字?后来才明白,IPv4地址就像电话号码的国家区号,需要严格规划。传统分类编址把地址分为A、B、C三类,就像图书馆的书架分区:
- A类地址(1.0.0.0~126.0.0.0)相当于图书馆的"科技区",网络号占8位,能容纳1600多万台主机,但全球只有126个A类网络
- B类地址(128.0.0.0~191.255.0.0)像"文学区",网络号16位,适合中型企业
- C类地址(192.0.0.0~223.255.255.0)则是"杂志区",每个网络最多254台主机
实际项目中遇到个典型问题:某公司申请到B类地址172.16.0.0,随着部门增加需要划分子网。我们通过子网掩码实现灵活划分,比如:
# 原始B类地址 IP地址:172.16.0.1 子网掩码:255.255.0.0 # 划分4个子网后 子网掩码:255.255.192.0 可用子网: 172.16.0.0/18 172.16.64.0/18 172.16.128.0/18 172.16.192.0/18但划分子网仍会造成地址浪费,就像硬纸板分隔书架会占用空间。1993年推出的CIDR无分类编址彻底改变了游戏规则,它有两个革命性创新:
- 抛弃ABC分类,允许任意长度的网络前缀(如192.168.1.0/26)
- 支持路由聚合,将多个连续地址块合并通告(如192.168.1.0/24可聚合8个/27子网)
在配置华为路由器时,CIDR的优越性特别明显:
# 传统分类地址配置 interface GigabitEthernet0/0/1 ip address 192.168.1.1 255.255.255.0 # CIDR方式配置 interface GigabitEthernet0/0/1 ip address 192.168.1.129 255.255.255.1282. IP数据报的奇幻漂流:发送与转发全流程
抓包分析一个ping请求时,发现数据报就像漂流瓶,经历着奇妙的旅程。当主机A(192.168.1.2)ping主机B(10.1.1.1)时:
直接交付判断:A用自己的子网掩码255.255.255.0与目标IP进行AND运算
# Python验证计算 src_ip = 0xC0A80102 # 192.168.1.2 dst_ip = 0x0A010101 # 10.1.1.1 mask = 0xFFFFFF00 # 255.255.255.0 if (src_ip & mask) != (dst_ip & mask): print("需要网关转发")ARP解析:A通过广播查询默认网关MAC地址,过程像在小区里喊:"谁是192.168.1.1?"
路由器查表:网关路由器收到数据报后:
- 检查TTL值(每跳减1,防环路)
- 校验头部(发现错误就丢弃)
- 最长前缀匹配路由表(就像快递分拣员找最详细的地址)
转发决策:匹配路由条目后,数据报被送到下一跳或直接交付
在Cisco设备上查看路由表特别有意思:
R1# show ip route Codes: L - local, C - connected, S - static... 10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 10.1.1.0/24 is directly connected, GigabitEthernet0/1 S 10.2.0.0/16 [1/0] via 192.168.1.2543. ICMP:网络世界的信鸽与警报系统
曾经花了三小时排查网络故障,最后发现是ICMP被防火墙拦截了。这个看似简单的协议实际承担着关键职责:
差错报告报文相当于网络交警:
- 终点不可达(Type=3):就像快递退回通知
- 源点抑制(Type=4):流量控制信号,类似"请减速"路牌
- 超时(Type=11):TTL归零警告,防止数据报无限循环
诊断工具的运作原理:
Ping(回送请求/应答):
# Linux下抓取ICMP包 tcpdump -i eth0 icmp实际发送的是Type=8请求,收到Type=0应答
Traceroute的巧妙设计:
- 首先发送TTL=1的UDP包,触发第一跳路由器返回超时报文
- 逐步增加TTL值,像爬楼梯一样记录每跳地址
- 最后到达目标时,利用端口不可达报文(Type=3)终止探测
在Windows和Linux下的实现差异:
# Linux使用UDP高端口 traceroute -n 8.8.8.8 # Windows使用ICMP tracert -d 8.8.8.84. 动态路由协议:从RIP到BGP的进化论
管理校园网时,RIP协议导致的"坏消息传得慢"让我吃了苦头——某条链路断开后,全网花了15分钟才收敛。后来迁移到OSPF才解决问题。
RIP(距离向量协议)像传话游戏:
- 每30秒广播整张路由表
- 最大跳数15限制网络规模
- 毒性逆转等优化仍难避免环路
OSPF(链路状态协议)则像精确的卫星地图:
- 建立邻居关系(Hello包)
- 同步LSDB数据库(DD/LSR/LSU报文)
- 用Dijkstra算法计算最短路径
# Dijkstra算法简化示例 def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 while queue: current = min(queue, key=lambda x: distances[x]) for neighbor, weight in graph[current].items(): if distances[neighbor] > distances[current] + weight: distances[neighbor] = distances[current] + weight return distancesBGP作为路径向量协议,则是国家间的外交官:
- 基于TCP 179端口建立连接
- 通过UPDATE报文交换路由属性(AS_PATH等)
- 策略路由决定最优路径(非纯技术考量)
配置BGP邻居的典型命令:
router bgp 65001 neighbor 203.0.113.2 remote-as 65002 neighbor 203.0.113.2 route-map SET_PREF in5. 实战:网络故障排查四步法
去年处理过一次路由环路故障,总结出有效排查方法:
物理层检查:
show interface查看端口状态- 用光纤测试仪检测光衰
连通性测试:
# 扩展Ping测试 ping -s 1472 -c 5 10.1.1.1 # 测试MTU路由追踪:
# Linux下带端口探测 traceroute -T -p 80 www.example.com协议分析:
- Wireshark过滤规则:
icmp || ospf || eigrp - 查看OSPF邻居状态:
show ip ospf neighbor
- Wireshark过滤规则:
对于静态路由导致的环路,最有效的方法是:
# 添加黑洞路由 ip route 192.168.3.0 255.255.255.0 null06. IPv4与IPv6的共存之道
在部署IPv6时,过渡技术就像双语翻译:
双栈技术配置示例:
interface GigabitEthernet0/0 ip address 192.168.1.1 255.255.255.0 ipv6 address 2001:db8::1/64隧道技术类似快递套箱:
# 配置6to4隧道 interface Tunnel0 tunnel source Ethernet0 tunnel mode ipv6ip tunnel destination 203.0.113.1实际项目中,我遇到最棘手的问题是PMTU黑洞,解决方法是在边界设备设置:
ipv6 mtu 1280 # 确保不超过最小MTU