很多人学计算机网络,卡得最惨的往往是网络层。它在TCP/IP协议族里位置太特殊:上面要接传输层,下面要连数据链路层,概念密度一上来就让人发怵——“路由”“转发”“掩码”“CIDR”“路由协议”这些词,单拎出来都能讲半天,合在一起更是绕。我前后把网络层的知识完整整理过好几轮,从备考复习到实际排障都会用到,这里把一套超详细的整理分享出来,尽量把每个关键环节讲透,适合备考、补基础和日常网络运维参考。
1. 网络层到底在忙什么——先看全局再看细节
1.1 网络层解决的问题是什么
网络层的任务可以压缩成一句话:把源主机产生的数据报,跨越多个节点和链路,交付到目的主机。注意它的边界,它只负责“主机到主机”(host-to-host)的通信;传输层负责“进程到进程”,数据链路层只负责“相邻两节点之间”。很多问题之所以乱,就是因为没有分清这一层各自管的是哪一段。
打个比方。网络层像整个城市的交通系统,它关心某辆车如何从A区开到B区,但至于车上坐的是谁、乘客有什么要求,是传输层和应用层的事。交通系统只保证车能按路线移动,不保证一定准时、不丢客。
从这里能延伸出一个关键结论:网络层必须解决两件事,一是“编址”,给每台主机分配可定位的地址;二是“寻路”,在不同网络之间找到可达的路径。这正好对应后面要展开的IP编址和路由协议两大板块。
1.2 数据报服务与“尽力而为”的真相
互联网的网络层采用无连接的数据报服务。所谓无连接,就是源主机不需要先和目的方预约建立一条路径,每个IP数据报都独立地在网络中传输,每经过一台路由器,都可能根据当前网络状态选择不同的下一跳。
这种设计带来的最大特点是灵活:某个节点坏了,后续数据包可以绕开;代价是每个包可能走不一样的路径,因此到达顺序可能不同,甚至丢失。IP层能做的只有“尽力而为”,它不承诺不丢包、不延时、不失序。很多人第一次听到会不习惯:怎么核心网络层这么“不靠谱”?
这里要理清一个责任划分。IP层不提供可靠性,可靠性由上层负责,最常见的就是TCP的重传、排序、流量控制;如果应用层用的是UDP,自己想办法保证完整性。网络层把可靠性的实现让给上层,是互联网能适应各种异构网络的重要原因,因为下层网络五花八门,统一提供可靠机制成本太高。
1.3 转发和路由,一个动作一个决策
网络层有两个核心概念,一“转”一“路”,容易混,但必须分清。
转发是路由器收到一个数据报后,查转发表,把包从合适的接口送出去。它是逐跳执行的局部动作,发生在每一台路由器上,速度要求极高。路由则是从全局视角计算出“应该怎么走”,并根据网络变化持续更新转发表。前者像是小区门口保安收到快递后根据地址放到对应楼栋,后者像是物流调度中心规划整个运输路线。
实际排障时这个区分也很重要。如果一个网段不通,先判断是路由表压根没有该网段的信息(路由缺失),还是路由表有路径但转发接口或下一跳配置错(转发错误)。排查方向上完全不一样。
2. IP编址:子网划分、CIDR、地址规划
2.1 IPv4地址的结构与分类
IPv4地址是32位二进制数,为了方便人看,写成点分十进制,比如192.168.1.100,其实对应的是11000000.10101000.00000001.01100100。
早期按首位固定划分为A、B、C、D、E五类:
| 类别 | 首字节范围 | 用途 | 默认掩码 |
|---|---|---|---|
| A | 1~126 | 大型网络 | 255.0.0.0(/8) |
| B | 128~191 | 中型网络 | 255.255.0.0(/16) |
| C | 192~223 | 小型网络 | 255.255.255.0(/24) |
| D | 224~239 | 组播 | — |
| E | 240~255 | 保留 | — |
这里几个地址很特殊:127.0.0.0/8是环回地址,本机自我测试用;0.0.0.0表示“本网络中的本主机”或未知源地址;255.255.255.255是有限广播地址。
从分类可以看出一个明显问题:A类太大、C类太小,申请地址时很难恰好匹配规模,于是后来有了子网划分和CIDR来“打补丁”。
2.2 子网划分的计算公式与实例演示
子网划分的本质是从主机号中借出若干位当“子网号”。比如一个C类网段192.168.1.0/24,原本8位主机号,如果要划分4个子网,需要“借”2位,因为2^2=4。
借位之后掩码变成/26,也就是255.255.255.192。为什么是192?/26表示前26位掩码都是1,换算成十进制是255.255.255.192。掩码的关键作用就是告诉设备哪些位属于网络部分,哪些是主机部分。
这个网段的子网边界怎么算?有一个很实用的技巧:用256减去掩码最后一段,得到“块大小”。256-192=64,于是四个子网是0~63、64~127、128~191、192~255。以第一个子网为例:网络号192.168.1.0,可用主机地址192.168.1.1~192.168.1.62,广播地址192.168.1.63。
计算可用主机数时有一个高频坑:每个子网要减去2个地址,一个网络号,一个广播地址,所以可用主机数=2^主机位-2。比如上面每个子网有64个地址,可用主机是62台;如果有人说“主机数=64”就错了。
实际操作中还要记得:划分好的子网之间是广播隔离的,二层交换机不能互通,必须通过路由器或三层设备做网关转发。很多人配置完子网发现两边互访不了,其实原因就是没给设备配网关。
2.3 CIDR与路由聚合:让路由表变薄
CIDR,无类域间路由,思想是彻底丢掉A/B/C类限制,IP地址由“网络前缀+主机号”组成,掩码位数不固定,用“斜杠”表示。比如200.200.16.0/22,前面的22位代表网络部分。
有了CIDR,就可以做路由聚合。假设路由表里有一组C类网段200.200.16.0/24、200.200.17.0/24、200.200.18.0/24、200.200.19.0/24,它们如果属于同一个出口,就可以聚合成一条路由200.200.16.0/22。
为什么能聚合?把16写成二进制00010000,19写成00010011,前22位是相同的,正好包括这四个网段。聚合后路由条目从4条变1条,路由表小了,转发更快,实际设备配置也省事。但前提很关键:这些地址必须连续、且规划有层次,随意乱分的地址段凑不到一起。
还有一个配套概念叫“最长前缀匹配”:当路由表里有多个条目同时匹配一个目的IP时,路由器会选择前缀最长的那个,因为前缀越长越精确。这个规则要记牢,很多路由选路异常都出在不理解它。
2.4 私有地址与NAT:内部乱用没关系,出门要换马甲
公网地址全球唯一,需要申请;私有地址专门用于内部网络,规定是三段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。这些地址在公网路由表里不存在,也不会被公网转发。
企业内部、办公室、家庭路由器默认网段192.168.x.x就是这么来的。设备拿到私有IP后,要访问互联网,依赖出口设备的NAT功能。NAT把私有源地址替换成公网地址,回来时再替换回去。因为IPv4地址不够用,现在普遍使用PAT(端口多路复用),用一个公网IP映射多个内网主机,靠端口号区分。
记得有一次排障,某台服务器从内网访问另一台服务器正常,但从外网访问超时。查到最后就是NAT配置里忘了加对应的端口映射规则。NAT解决了地址短缺,却也带来了定位、端口映射等一系列管理问题,这是网络工程师必须习惯的地方。
3. 网络层协议栈全家桶:ARP、ICMP、DHCP、IGMP
3.1 ARP:把IP地址翻成MAC地址
IP数据报在网络层只认识IP地址,可真正在以太网等链路上传输时,帧头必须填目的MAC地址。这个翻译动作由ARP协议完成。
同一子网内,主机A要访问主机B,先在ARP高速缓存里查B的IP对应MAC;查不到就广播一份ARP请求:“谁的IP是192.168.1.2?请告诉192.168.1.10你的MAC地址。”B收到后发现是自己,便单播回答。A收到后把映射写入缓存,下次直接用,不用再次广播。
跨网段的流程更容易搞错。A要访问C(C在另一个网段),A知道对方不在本地子网后,不会直接去解析C的MAC,而是把数据报的目的IP填C,但目的MAC填默认网关的MAC,交给网关去转发。到了网关所在子网,网关再替它解析下一跳的MAC。这段逻辑想明白,才算真正理解ARP和网关。
平时排障常会用到arp -a查看缓存,如果发现一台主机对应多个MAC,或者MAC变化频繁,要警惕地址冲突或者存在异常设备。
3.2 ICMP:差错报告与探测主力
ICMP不是一个传输数据的协议,而是传递网络层控制信息的“邮差”。它主要报告差错,也提供查询能力。
常用类型有:回显请求/应答(0/8,ping的基础)、目的不可达(3)、超时(11,TTL递减到0)、重定向(5)。看到这些报文,基本能定位问题。
ping的原理就是发ICMP回显请求,目的端回回显应答。如果超时,可能是链路、防火墙或路由问题。traceroute/tracert也是经典的ICMP应用:它把一个数据报的TTL设成1,第一跳路由器收到后会回ICMP超时;再把TTL设成2,第二个路由器回超时……一路下去,就把路径上的每一跳“引”出来。搞懂这条路之后,你看网络路径再也不是黑盒。
需要提个醒:很多防火墙会主动丢弃ICMP,所以ping不通不一定是网络断了,如果业务端口能通,多半是中间设备对ICMP有策略。
3.3 DHCP:自动化分配IP地址的过程
DHCP解决手动配置地址麻烦的问题。整个获取过程可以提炼成四个步骤,常被叫DORA:
- Discover:新设备广播找DHCP服务器,“有没有人能给我分个IP?”
- Offer:服务器回一个可用地址以及掩码、网关、DNS等参数。
- Request:客户端广播确认“我就要这个地址”。
- Ack:服务器确认租约生效。
日常漏掉的一点是续租。IP不是永久到手的,租期过半(T1)时客户端会向分配它的服务器单播Request续约;租期快结束时(T2)如果还没续上,就广播Rebind找任意服务器。所以拔掉服务器网线后,客户端可能还能用一段时间,这是租约还没过期的正常现象,不是故障。
DHCP使用UDP的67/68端口,服务器听67,客户端听68。因为客户端早期不知道服务器地址,很多报文是广播发的,跨网段就需要配置DHCP中继,否则二层广播出不了子网。生产环境里如果终端老是拿不到地址,先看中继配置、地址池剩余量和是否有多台DHCP服务器抢答,这几个检查项能覆盖九成问题。
3.4 IGMP:让组播有人管
组播是“一对多”的高效传输方式,视频会议、直播常用。组播地址对应D类224.0.0.0到239.255.255.255,一台主机要接收某个组播组的数据流,需要先“入组”。
IGMP就是管理组成员关系的协议:主机通过IGMP报文告诉组播路由器“我要加入某组”,路由器据此维护组成员表,把组播数据转发给感兴趣的端口;主机离开时也会通知路由器。看似个子小,没有IGMP,组播数据会被盲目泛洪或者完全无法送达。理解IGMP,重点记住“成员管理”四个字,它不负责组播路由计算,那只属于组播路由协议的工作。
4. 路由协议:RIP、OSPF、BGP三巨头横向对比
4.1 静态路由与动态路由怎么选
配置路由可以用静态路由,也可以运行动态路由协议。静态路由由管理员手工设置,适合拓扑简单、稳定的网络,比如一个分支接一条专线上总部,写一条默认路由就够;但网络规模一大、链路经常调整,手工配置就会变成噩梦。
动态路由协议的特点是自动发现远端网络、自动更新路径,省人工。选择哪种,本质是权衡管理成本、收敛速度、网络规模。实际很多企业网络中两者混合使用:核心用OSPF这类动态协议,边缘链路上用静态,默认路由由边界设备宣告。没有绝对的好坏,只有场景合不合适。
4.2 RIP:距离向量,简单到以“跳”为尺
RIP是经典的距离向量协议,思路非常直接:路由器只和相邻路由器交换整张路由表,用跳数做度量,每经过一台路由器,跳数加1。RIP明确规定最大有效跳数是15,16跳代表不可达,所以它注定只适合小型网络。
RIP每30秒周期性地把路由表广播给邻居,加上触发更新。它也有一整套防环机制:水平分割(从哪个接口学来的路由,不往回通知)、毒性逆转(对失效路由通告为16跳)、触发更新等。要说明的是,这些措施能缓解环路,不能彻底杜绝。
RIPv1是有类的,广播更新,不支持CIDR;RIPv2支持无类编址、路由聚合,用组播224.0.0.9发更新,还支持简单的认证。两代协议的关键差异建议至少记住,考试和面试常常拿来辨析。
4.3 OSPF:链路状态,算出最短路径
OSPF是链路状态协议的代表。链路状态,每个路由器把自己和邻居的连接状态(包括接口的开销)打包成链路状态通告LSA,然后向全区域泛洪,最终每台路由器都有一张一致的网络拓扑图,称为链路状态数据库。
有了完整拓扑,路由器用Dijkstra最短路径算法计算到每个网段的最短路径树,再把结果写入路由表。这种思路和RIP完全相反:RIP是“只信邻居”,OSPF是“自己先看图再算路”,所以OSPF收敛更快,也不会出现RIP那样的跳数限制。
为了让大规模网络不把所有设备拖进一张拓扑图,OSPF引入区域划分。所有区域必须连到骨干区域Area 0,非骨干区域的明细路由经由区域边界设备汇总。这样即使全网路由器很多,单台设备的数据库也只保留本区域和汇总信息,扩展性大大提升。
理解OSPF时,建议把泛洪、LSDB、SPF、区域这几个词串成一条线,而不是单独死记。实际排障遇到OSPF邻居起不来,先查Hello间隔、区域ID、认证参数是否一致,八成问题都在这里。
4.4 BGP:自治系统之间的政策路由
严格说BGP属于“路径向量”协议,它的主要用途是自治系统(AS)之间交换路由可达信息。互联网由大量AS组成,AS内部可以各用各的协议,但AS之间需要共同标准,BGP就是这个标准。
BGP和内部协议最大的区别是:选路不是只看“近不近”,更看“愿不愿意”。每个AS都有自己的管理策略、商业关系、出口偏好。BGP更新报文里带有完整AS路径列表,接收方一看路径就知道这个路由经过了哪些AS,既能防止环路,也能按策略过滤、选路。
实际组网常分eBGP(不同AS间交换)和iBGP(AS内部传递外部路由)。BGP的路由表可能非常大,路由策略灵活,上手门槛明显高于OSPF。记住它的核心价值在于“可控的策略路由”。
4.5 一张表看懂三者的差异
| 对比项 | RIP | OSPF | BGP |
|---|---|---|---|
| 类型 | 距离向量 | 链路状态 | 路径向量 |
| 适用范围 | 小型AS内 | 中大型AS内 | AS之间 |
| 度量 | 跳数(≤15) | 开销Cost | AS路径长度、策略等 |
| 收敛速度 | 慢 | 快 | 较慢/受策略影响 |
| 路由思想 | 邻居跟我说的 | 我自己算出来的 | 我根据策略选出来的 |
| 典型场景 | 老式小型网络 | 企业内网、园区网 | 运营商、跨国互联 |
表格不是让你背,而是帮你建立“为什么”的框架。不同协议解决的场景不同,度量和策略也跟着变,理解了动机,很多细节自然记得住。
5. IPv6与网络层设备的正确打开方式
5.1 IPv6:地址从32位到128位
IPv4最致命的问题是地址数量不够。IPv6把地址扩展到128位,数量极其庞大,让“每台设备都有公网地址”有了可能。它写起来是8组十六进制数,每组16位,中间用冒号分隔。连续的0可以压缩成“::”,但一个地址里只能出现一次,否则会有歧义。
IPv6地址分三种主要类型:单播(包括全球单播、链路本地、环回::1)、组播、任播。一个很重要的变化是IPv6取消了广播地址,广播的功能被组播和任播取代。这种设计省掉了大量无意义广播流量,对大规模网络是利好。
5.2 NDP与无状态自动配置
IPv6把原来IPv4里ARP的功能合并进ICMPv6,包含邻居请求NS和邻居通告NA,这个整体叫NDP。主机想知道某个IPv6地址对应的MAC,就发NS,对方回NA,过程和ARP类似,但报文承载在ICMPv6里,解决了解析、重复地址检测、路由器发现等更多任务。
NDP还带来自动配置能力。新接入的IPv6设备可以用链路本地地址先启动,再向路由器发路由器请求RS,接收路由器通告RA,从通告里拿到前缀信息,自己生成全局IPv6地址,整个过程不需要DHCP服务器,这叫无状态地址自动配置。这种“插上就能用”的设计,相比IPv4里手动配置或DHCP要省心很多。
5.3 过渡期方案:双栈、封装、翻译
IPv4到IPv6不可能一晚上切换,过渡技术核心是双栈:设备同时配置IPv4和IPv6协议栈,两个地址族并行处理。这是最稳妥的思路,改造周期长但风险可控。
纯IPv6网络之间穿过IPv4网络时,可以把IPv6报文封装在IPv4报文里传输,网络边界再做解封装;另一种思路是在中间做翻译设备,将IPv6报文转换成IPv4报文,反之亦然。每种方案都有适配场景,建设者要根据自己网络的现状选择。别指望出现一个万能方案解决所有过渡问题,实际工程里往往是组合拳。
5.4 路由器和三层交换机怎么选
路由器工作在网络层,负责连接不同类型网络、执行路由协议、接入广域网,通常接口类型丰富、处理策略灵活。三层交换机则是在交换机的高密度端口能力上加入路由转发能力,常用于园区网的接入/汇聚层,充当VLAN网关,转发快、端口多。
选型上有个朴素判断:网络边界、出口和安全策略密集的地方用路由器;局域网内部大流量、多VLAN互通的地方用三层交换机。碰到“内网VLAN互通没问题,但一上外网就丢包”,大概率是三层设备上缺默认路由或NAT能力不足,别急着怪线路。
6. 网络层排障实战:那些年我踩过的坑
6.1 排查顺序怎么定:从设备本身往外走
网络层排障,最忌讳乱试。我习惯的排查顺序是从小往大、从里到外:
- ping 127.0.0.1:本机TCP/IP协议栈是否正常。
- ping 本机网卡IP:网卡驱动、IP配置是否正确。
- ping 默认网关:本子网和二层链路是否通。
- ping 远端IP:路由器和跨网段路径是否通。
这四步每一步都有明确含义。如果在某一步失败,范围就锁定在相关链路上。比如本机IP能通但网关不通,问题大概率在网线、交换机端口或网关设备本身,而不用先怀疑远程服务器。这个顺序是网络排障的基本功。
6.2 高频故障与对策速查表
| 现象 | 可能原因 | 排查重点 |
|---|---|---|
| IP冲突 | 两台设备同IP | 查看ARP表、检查DHCP保留 |
| 能上内网不能上外网 | 缺默认路由/出口NAT异常 | 检查网关路由表和NAT规则 |
| 某些服务器能访问,另一些不能 | 路由器策略/ACL过滤 | 抓包看ICMP和具体端口拒绝 |
| 延迟高、丢包 | 接口带宽拥塞、链路质量差 | 看接口错误计数、流量统计 |
| 网络时断时续 | 环路导致广播风暴、ARP波动 | 检查交换机防环、连接拓扑 |
一张表写完,遇到具体问题时先对号入座,再抓包验证。排查的重心是收集信息,不是猜。
6.3 一个网段偶发不通的实战复盘
某内部网段频繁出现到某个业务平台偶发超时,重启设备很快恢复,但过几天又犯。一开始怀疑链路不稳定,抓包发现超时时伴随大量ICMP目的不可达报文,进一步看网关设备接口统计,发现入接口吞吐已经顶到上限,大量单播报文被丢。根因是该网段内一台设备在夜里做全量数据同步,占满了出口带宽,其他通信自然排队、丢包。
处置办法是在网关设备上把业务流量和数据同步流划分成不同队列,给业务高优先级,同步任务错峰运行,之后故障消失。这个案例说明,网络层很多“灵异事件”,最终都能通过接口流量统计和报文抓取找到真实原因。盯着现象猜,永远只能解决一时问题。
6.4 常用命令和抓包小抄
Windows下常用ipconfig /all看地址配置,ping和tracert做基础连通测试,arp -a看邻居映射,route print看路由表,netsh做网络配置。Linux下常用ip addr、ip route、arp -n、traceroute。抓包用tcpdump或Wireshark,过滤arp能快速看广播风暴,过滤icmp能定位哪些设备在回差错报文。
个人经验是,遇到疑难问题别马上改配置,先抓三份数据:一份正常时做对比基线,一份故障时,一份刚恢复时。有对比,定位才快。
说实话,网络层是那种“初学觉得杂,越学越觉得清晰”的知识。我整理这份超详细笔记时,最大的体会是:不要把协议当成孤立知识点背,而是先建立“编址—寻路—报文交互—排障”这条主线,再把细节挂在主线上。理解一个协议,先回答三个问题:它解决什么问题、用什么机制解决、边界在哪。想清楚这三点,比硬记十页笔记有用。