网络协议深度解析-04-网络层:IP协议与路由算法

全文摘要

本文将带你深入理解网络层的工作原理,帮助你掌握IP协议、路由算法和互联网路由的运作机制。你将学到IP数据报的格式、子网划分与CIDR、路由算法的设计思想、RIP与OSPF等路由协议的差异,以及SDN如何改变网络架构。通过阅读本文,你将理解数据包如何在复杂的互联网中找到从源到目的的路径。

全书总结

网络层是网络协议栈中负责寻址和路由的关键层次,它决定了数据包如何从源主机穿越多个网络到达目的主机。本文系统梳理了IP协议的数据报格式、地址划分与子网掩码、路由算法的距离向量和链路状态方法、因特网的路由选择协议、以及SDN控制平面的新架构。适合网络工程师、后端开发者、以及对网络底层原理感兴趣的技术人员阅读。


一、网络层的作用:跨网络通信

运输层解决了端到端的通信问题,但还有一个更大的挑战:如何穿越多个不同的网络?你的电脑和淘宝服务器之间可能隔着几十个不同的网络——家庭网络、ISP网络、骨干网、数据中心网络,它们由不同的机构运营,使用不同的技术。

网络层的任务是让数据包能够穿越这些异构网络,从源主机到达目的主机。

flowchart LR
    subgraph Net1[网络A<br>192.168.1.0/24]
        H1[主机H1<br>192.168.1.1]
        R1[路由器R1]
    end

    subgraph Net2[网络B<br>10.0.0.0/24]
        R2[路由器R2]
        H2[主机H2<br>10.0.0.1]
    end

    subgraph Internet[互联网]
        ISP[ISP网络]
    end

    H1 --> R1
    R1 -->|转发| ISP
    ISP -->|转发| R2
    R2 --> H2

    style H1 fill:#e3f2fd
    style H2 fill:#c8e6c9
    style R1 fill:#fff9c4
    style R2 fill:#fff9c4
    style ISP fill:#f3e5f5

图表讲解:这张图展示了网络层的基本场景——数据包跨越多个网络从源到目的地。

网络层要解决三个核心问题:

寻址:如何唯一标识网络中的每台设备?IP地址(32位IPv4或128位IPv6)是网络层的地址。与链路层的MAC地址不同,IP地址包含网络前缀主机部分,体现了网络的层次结构。MAC地址是平面的,IP地址是有结构的。

路由:如何从源到目的找到一条路径?这是网络层的核心问题。路由器维护路由表,根据目的IP地址决定把数据包转发到哪个下一跳。路由算法负责计算最优路径。

转发:当数据包到达路由器时,如何处理?路由器检查数据包的目的IP,查找路由表,找到匹配的表项,把数据包转发到相应的接口。转发是路由器的本地操作,路由是网络范围的路径选择问题。

网络层提供的是无连接的服务——IP协议不建立连接,每个数据包独立路由。这意味着同一源和目的之间的数据包可能走不同的路径,可能乱序到达。这是设计选择,简化了网络层的实现,把可靠性交给运输层(TCP)处理。


二、IP协议:互联网的基础

IP(Internet Protocol)是网络层的核心协议,它定义了数据报的格式和处理规则。

IP数据报格式

flowchart TB
    subgraph IPHeader[IP头部 20-60字节]
        direction TB
        Ver[版本号<br/>IPv4/IPv6]
        IHL[头部长度<br/>20-60字节]
        DSCP[服务类型<br/>QoS优先级]
        Len[总长度<br/>最大65535字节]
        ID[标识符<br/>分片重组用]
        Flags[标志位<br/>DF/MF]
        Frag[片偏移<br/>8字节为单位]
        TTL[生存时间<br/>防止环路]
        Proto[协议号<br/>TCP=6/UDP=17]
        Check[头部校验和]
        Src[源IP地址<br/>32位]
        Dst[目的IP地址<br/>32位]
        Opt[选项<br/>可变长度]
    end

    IPHeader --> Data[数据部分]

    style Ver fill:#e3f2fd
    style TTL fill:#ffcdd2
    style Src fill:#fff9c4
    style Dst fill:#c8e6c9

图表讲解:这张图展示了IPv4头部的主要字段——每个字段都有其特定用途。

IP头部有几个关键字段:

版本号(Version):4表示IPv4,6表示IPv6。IPv6是IPv4的后继版本,地址长度从32位扩展到128位,解决了IPv4地址耗尽的问题。

总长度(Total Length):整个IP数据报的长度,包括头部和数据。最大是65535字节,但实际链路有MTU限制,需要分片。

标识、标志、片偏移:与分片相关。如果数据报大于链路的MTU(最大传输单元),需要分片。这些字段用于在目的主机重组分片。IPv6要求路径上的所有链路MTU至少1280字节,通常只在源主机分片,中间路由器不分片。

TTL(Time To Live):生存时间,防止数据报在网络中无限循环(比如路由环路)。最初设计为秒数,后来改为跳数。每经过一个路由器,TTL减1。TTL=0时,数据报被丢弃,并发送ICMP超时消息给源主机。traceroute工具利用这个机制探测路径。

协议号(Protocol):指示数据部分是哪种协议,6是TCP,17是UDP,1是ICMP。这实现了网络层的复用——一个IP连接可以承载多种运输层协议。

源/目的IP地址:32位,通常用点分十进制表示(如192.168.1.1)。IP地址分配由ICANN及其下属机构管理,确保全球唯一性。

子网划分与CIDR

flowchart TB
    subgraph IP[IP地址 32位]
        Net[网络前缀<br/>高位]
        Host[主机号<br/>低位]
    end

    subgraph Class[传统分类]
        A[A类<br/>前8位网络]
        B[B类<br/>前16位网络]
        C[C类<br/>前24位网络]
    end

    subgraph CIDR[CIDR无类别]
        V[可变长度前缀<br/>如/24、/26]
    end

    IP --> Class
    IP --> CIDR

    style Net fill:#e3f2fd
    style Host fill:#fff9c4
    style CIDR fill:#c8e6c9

图表讲解:这张图展示了IP地址的划分方式——从固定类别到CIDR的演进。

IP地址最初分为A、B、C、D、E五类:

  • A类:前8位是网络号,后24位主机号,支持少量大型网络
  • B类:前16位网络号,后16位主机号,支持中型网络
  • C类:前24位网络号,后8位主机号,支持大量小型网络

这种分类导致地址浪费——一个C类网络最多254台主机,一个B类网络最多65534台主机。如果需要1000台主机,只能分配一个B类网络,浪费64534个地址。

CIDR(Classless Inter-Domain Routing,无类别域间路由)解决了这个问题。CIDR废除类的概念,使用斜线记法表示网络前缀长度。例如:

  • 192.168.1.0/24:前24位是网络号,后8位主机号,最多254台主机
  • 192.168.1.0/26:前26位网络号,后6位主机号,最多62台主机

CIDR让地址分配更灵活,也促进了路由聚合。ISP可以把多个连续的小网络聚合成一个大网络,在路由表中只发布一条路由,减少路由表规模。


三、路由算法:如何找到最优路径

路由算法的核心问题是:给定网络拓扑和链路代价,如何找到从源到目的的最优路径?

距离向量算法

flowchart TB
    Start[初始化] --> Init[到邻居的距离=链路代价<br/>到其他节点=无穷大]
    Init --> Exchange[与邻居交换路由表]
    Exchange --> Update{收到新路由?}
    Update -->|是| Calc[计算经由邻居的距离]
    Calc --> Better{更短?}
    Better -->|是| UpdateTable[更新路由表<br/>下一跳=该邻居]
    Better -->|否| Update
    Update -->|否| Check{收敛?}
    Check -->|否| Exchange
    Check -->|是| Stable[路由稳定]

    style Start fill:#e3f2fd
    style Exchange fill:#fff9c4
    style UpdateTable fill:#c8e6c9
    style Stable fill:#a5d6a7

图表讲解:这张图展示了距离向量算法的工作流程——RIP协议采用这种算法。

距离向量(Distance Vector)算法是一种分布式、迭代的算法。每个路由器维护一个路由表,记录到每个目的地的距离和下一跳。算法步骤:

  1. 初始化:到直连网络的距离是链路代价(通常是1),到其他目的地是无穷大
  2. 交换:定期与邻居交换路由表
  3. 更新:收到邻居的路由表后,计算”经由该邻居的距离=到邻居的距离+邻居到目的地的距离”
  4. 选择:如果新路径更短,更新路由表,下一跳设为该邻居

这个算法的直觉是”朋友的朋友是朋友”——如果邻居说能以距离d到达目的地X,那我就能以”到邻居的距离+d”到达X。

距离向量算法的问题是收敛慢路由环路。当链路状态变化时,好消息传得快,坏消息传得慢(称为”计数到无穷大”问题)。RIP协议限制了最大距离为15,16表示无穷大,加速坏消息的传播。

链路状态算法

flowchart LR
    subgraph LS[链路状态算法]
        direction TB
        L1[发现邻居]
        L2[测量到邻居的代价]
        L3[构造链路状态包<br/>LSP]
        L4[泛洪LSP到所有路由器]
        L5[运行Dijkstra算法<br/>计算最短路径树]
    end

    L1 --> L2
    L2 --> L3
    L3 --> L4
    L4 --> L5

    L5 --> Route[构造路由表]

    style L4 fill:#fff9c4
    style L5 fill:#e3f2fd

图表讲解:这张图展示了链路状态算法的步骤——OSPF协议采用这种算法。

链路状态(Link State)算法采用不同的方法:让每个路由器都有完整的网络地图,然后独立计算最短路径。

  1. 发现邻居:通过Hello协议发现直连的路由器
  2. 测量代价:测量到每个邻居的链路代价(可以用带宽、延迟等指标)
  3. 链路状态通告(LSA):构造LSA,包含路由器ID、邻居列表、链路代价
  4. 泛洪:将LSA泛洪到网络中所有路由器,确保所有路由器有相同的链路状态数据库(LSDB)
  5. Dijkstra算法:每个路由器在LSDB上运行Dijkstra算法,计算到所有目的地的最短路径树

链路状态算法比距离向量收敛更快,但需要更多的计算和存储。OSPF(Open Shortest Path First)是链路状态算法的典型实现,广泛用于企业网络和ISP网络。


四、因特网的路由选择协议

实际互联网中运行着多种路由协议,它们在不同的层次和范围工作。

自治系统与路由协议层次

flowchart TB
    subgraph Internet[全球互联网]
        direction TB
        AS1[AS1<br/> stub网络]
        AS2[AS2<br/>多宿网络]
        AS3[AS3<br/> transit ISP]

        AS1 -->|BGP| AS3
        AS2 -->|BGP| AS3
    end

    subgraph AS1内部[AS1内部]
        OSPF[OSPF<br/>内部网关协议]
    end

    subgraph AS2内部[AS2内部]
        RIP[RIP<br/>内部网关协议]
    end

    style AS3 fill:#f3e5f5
    style OSPF fill:#e3f2fd
    style RIP fill:#fff9c4

图表讲解:这张图展示了互联网的路由协议层次——IGP在AS内部,EGP在AS之间。

自治系统(Autonomous System,AS)是由同一机构管理的一组网络,运行统一的路由策略。每个AS有唯一的AS号(16位,约6.5万个)。AS分为:

  • Stub AS:单宿网络,只有一个出口,通常是企业或小ISP
  • Multi-homed AS:多宿网络,连接到多个ISP,提高可靠性
  • Transit AS:承载其他AS的流量,通常是大型ISP

路由协议分为两类:

  • 内部网关协议(IGP):在AS内部运行,如RIP、OSPF、IS-IS
  • 外部网关协议(EGP):在AS之间运行,目前只有BGP

RIP:简单的内部协议

RIP(Routing Information Protocol)是最早的路由协议之一,基于距离向量算法。

特性
算法距离向量
代价度量跳数(最大15)
更新方式定期广播(30秒)
收敛时间较慢(分钟级)
适用场景小型网络

RIP的优点是简单、易配置,缺点是收敛慢、跳数限制、不支持VLSM(原始RIP)。RIPv2增加了认证、VLSM支持,但仍然不适合大型网络。

OSPF:企业网的首选

OSPF(Open Shortest Path First)基于链路状态算法,是企业网最常用的IGP。

特性
算法链路状态 + Dijkstra
代价度量可配置(通常基于带宽)
更新方式事件触发(链路变化时)
收敛时间快(秒级)
适用场景中大型网络

OSPF支持区域(Area)划分,把大型网络分成多个区域,减少路由协议的流量。区域0是骨干区域,所有其他区域必须连接到区域0。OSPF还支持等价负载均衡——如果有多条代价相同的路径,可以同时使用。

BGP:互联网的粘合剂

BGP(Border Gateway Protocol)是AS之间的路由协议,也是互联网唯一使用的EGP。

flowchart LR
    subgraph AS65001[AS 65001]
        BGP1[BGP路由器]
    end

    subgraph AS65002[AS 65002<br/> transit ISP]
        BGP2[BGP路由器]
    end

    subgraph AS65003[AS 65003]
        BGP3[BGP路由器]
    end

    BGP1 -->|eBGP| BGP2
    BGP2 -->|eBGP| BGP3
    BGP1 -.->|通过AS65002| BGP3

    BGP1 --|iBGP|--> R1[其他路由器]
    BGP2 --|iBGP|--> R2[其他路由器]
    BGP3 --|iBGP|--> R3[其他路由器]

    style AS65002 fill:#f3e5f5
    style BGP2 fill:#ba68c8

图表讲解:这张图展示了BGP在不同AS之间传递路由信息——BGP让互联网成为一个整体。

BGP的基本原理:

  • 路径向量:BGP的路由信息不仅包含目的地,还包含AS路径(经过的AS序列),用于检测环路
  • 策略路由:BGP允许基于策略而非单纯的最短路径选择路由,比如优先走自己的AS而非竞争对手的
  • eBGP vs iBGP:eBGP在不同AS之间运行,iBGP在同一AS内部运行

BGP是互联网能够工作的关键。没有BGP,每个AS都是孤岛,无法跨越AS边界通信。BGP也让ISP能够实现商业策略——比如向客户收费,向对等方免费互连,向 transit ISP付费。


五、SDN:网络架构的革命

传统路由器是集成设备——控制平面(路由算法)和数据平面(转发功能)在同一个设备中。SDN(Software Defined Networking,软件定义网络)将它们分离。

flowchart TB
    subgraph Traditional[传统网络]
        direction LR
        Dev1[路由器1<br/>控制+数据] --- Dev2[路由器2<br/>控制+数据] --- Dev3[路由器3<br/>控制+数据]
    end

    subgraph SDN[SDN网络]
        Controller[SDN控制器<br/>集中式控制平面]
        Switch1[交换机1<br/>纯数据平面]
        Switch2[交换机2<br/>纯数据平面]
        Switch3[交换机3<br/>纯数据平面]

        Controller ---|OpenFlow| Switch1
        Controller ---|OpenFlow| Switch2
        Controller ---|OpenFlow| Switch3
        Switch1 --- Switch2
        Switch2 --- Switch3
    end

    style Traditional fill:#e3f2fd
    style Controller fill:#ffcdd2

图表讲解:这张图对比了传统网络和SDN架构——SDN将控制集中化,带来灵活性和可编程性。

SDN的核心思想是控制与转发分离

  • 控制平面集中到SDN控制器,获得全局网络视图
  • 数据平面简化为转发设备,根据控制器的流表转发数据包

SDN的优势:

  • 集中控制:控制器有全局视图,可以做更优的路由决策
  • 可编程:网络管理员可以通过编程实现复杂的网络策略
  • 快速创新:新协议可以在控制器实现,不需要升级所有网络设备

OpenFlow是早期的SDN协议,定义了控制器和交换机之间的接口。现代SDN更多使用Netconf/YANGP4等技术。SDN在数据中心网络中广泛应用,Google B4网络就是著名的案例,通过SDN将链路利用率从30-40%提升到接近100%。


结语

网络层是互联网的神经系统,IP协议让数据包能够穿越全球的复杂网络到达目的地。从IP地址的设计到路由算法的选择,每一个决策都体现了工程上的权衡。

理解网络层的工作原理,能帮助你:

  • 设计网络架构:划分子网、选择路由协议、规划冗余路径
  • 排查网络问题:ping不通是路由问题还是防火墙问题?traceroute帮你定位故障点
  • 优化网络性能:选择合适的ISP、调整路由策略、部署CDN

接下来的文章将深入链路层和物理层,看看数据如何在具体的链路上传输。


常见问题解答

Q1:IP地址和MAC地址有什么区别?

:IP地址(网络层)和MAC地址(链路层)是不同层次的地址,用途不同。

IP地址是逻辑地址,有层次结构(网络+主机),用于跨网络寻址,可以改变(你从家到公司,IP地址变了,还是你)。

MAC地址是物理地址,是网卡出厂时烧录的,全球唯一(理论上),用于本地网络寻址。

数据包在传输过程中,IP地址不变(源和目的不变),MAC地址每跳都变(每一跳的源MAC是当前路由器,目的MAC是下一跳路由器)。IP地址就像家庭住址(用于跨城市寻址),MAC地址就像身份证号(用于在本城市验证身份)。


Q2:什么是NAT,为什么需要它?

:NAT(Network Address Translation,网络地址转换)是一种让多个设备共享一个公网IP地址的技术。

NAT网关(通常是家用路由器)维护一个转换表,记录内网IP:端口到公网IP:端口的映射。

需要NAT的原因是IPv4地址不足——公网IPv4地址只有约42亿个,联网设备远超这个数量。

NAT的缺点是破坏了互联网的端到端通信模型,内网设备不能直接作为服务器(需要端口映射)。IPv6有足够的地址(2^128个),不需要NAT,但IPv6的普及仍然缓慢。


Q3:RIP、OSPF、BGP如何选择?

:这三种协议适用的场景不同。

RIP最简单,适合小型网络(几十台路由器),配置容易,但收敛慢、有跳数限制。

OSPF适合中大型网络,收敛快、支持VLSM、可以划分区域,但配置复杂、对路由器CPU和内存要求高。

BGP是AS之间的协议,如果你是连接ISP的企业或ISP本身,必须用BGP;如果只是企业内部网络,用OSPF或RIP。

实践中,企业网用OSPF,家用路由器用RIP(或不运行路由协议),ISP网络内部用OSPF或IS-IS,AS之间用BGP。


Q4:什么是路由黑洞,如何避免?

:路由黑洞是指数据包被路由到某个路由器,但该路由器不知道如何继续转发,结果数据包被丢弃。

常见原因是路由不完整或配置错误。例如,路由器A有一条路由”10.0.0.0/24 经由路由器B”,但路由器B没有到10.0.0.0/24的路由,数据包到达B后被丢弃。

避免方法:

(1)确保路由一致:所有路由器应有完整的路由信息。

(2)使用默认路由:当没有具体路由时,使用默认路由0.0.0.0/0。

(3)配置黑洞路由:明确丢弃某些流量,而不是让其被任意转发。

路由黑洞很难完全避免,但可以通过良好的网络设计和监控来减少影响。


Q5:SDN会完全取代传统网络吗?

:短期内不会,SDN和传统网络会长期共存。

SDN在特定场景(数据中心、广域网优化)有优势,但在企业园区网、边缘网络等场景,传统网络仍然更成熟、易用。

SDN的挑战包括:

(1)集中控制的单点故障风险。

(2)对控制器的极高可靠性要求。

(3)网络管理员的技能需要更新。

(4)与传统网络的互操作性。

趋势是融合——传统网络设备增加SDN功能,SDN也可以管理传统设备。未来的网络可能不是完全SDN或完全传统,而是混合架构,根据场景选择合适的工具。


更新时间:2026年3月2日 作者:网络技术专栏 标签:#IP协议 路由算法 OSPF BGP SDN