网络基础与子网划分
本文合并自:06-网络基础-子网划分-路由-网关.md、03-网络基础.md
本文覆盖计算机网络基本概念、OSI 七层与 TCP/IP 四层模型、常见协议、IPv4/IPv6 地址分类与格式、子网掩码与子网划分计算、路由概念、默认网关、
route/ip route命令与静态路由、网络分层排错思路及练习题。
本章要点
- 理解网络的组成与分类(LAN/MAN/WAN)、常见拓扑结构、传输介质与网线制作标准(568A/568B)。
- 分清交换机与路由器的职责差异,理解单播、广播、组播三种通信方式。
- 掌握 OSI 七层模型与 TCP/IP 四层模型的对应关系、各层协议与设备、数据封装与解封装过程。
- 掌握 IP、ICMP、ARP、TCP、UDP 等常见协议的作用,理解 TCP 三次握手与四次挥手,能解释
TIME_WAIT/CLOSE_WAIT。 - 理解 IPv4 地址的分类(A/B/C/D/E)、特殊地址、三个私网网段,了解 IPv6 表示方法。
- 理解子网掩码如何通过二进制"与运算"确定网络号,掌握网络号、广播地址、可用主机数的计算。
- 掌握子网划分的完整计算步骤,会做 VLSM 变长子网与超网聚合,熟记常用掩码速查表。
- 掌握两节点能通信的三个条件与上网三要素:IP、Gateway、DNS。
- 掌握默认网关的作用、路由表解读、静态路由增删、最长前缀匹配、
ip_forward与 NAT 概念。 - 熟练使用分层排查法与
ping/traceroute/mtr/telnet/nc/ss/netstat/tcpdump定位网络故障。
一、网络基础概念
1.1 什么是网络
网络是通过网线或无线网络将多个设备连接在一起,使数据可以通过网络介质传输的一种方式。
要连接到网络,至少需要满足两个条件:
- 网络适配器(网卡)。
- 网络服务提供商提供的账号密码。
从组成上看,一个可用的网络包含以下要素:
| 组成要素 | 说明 |
|---|---|
| 主机(节点) | 计算机、服务器、手机、打印机等终端设备,通过网卡接入网络 |
| 传输介质 | 双绞线、光纤、同轴电缆或无线电波,负责承载信号 |
| 网络设备 | 网卡、集线器、交换机、路由器、防火墙等,负责转发与控制流量 |
| 网络协议 | TCP/IP 协议族等规则集合,规定数据格式、寻址与差错处理方式 |
| 网络服务 | Web、DNS、DHCP、FTP、NFS 等对外提供的应用能力 |
1.2 网络类型
目前最成功的两种网络类型:
| 类型 | 说明 |
|---|---|
| Ethernet(以太网) | 局域网技术 |
| Internet(因特网) | 全球互联网络 |
1.3 按覆盖范围分类
| 分类 | 缩写 | 覆盖范围 |
|---|---|---|
| 局域网 | LAN | 短距离资源共享 |
| 城域网 | MAN | 介于局域网和广域网之间 |
| 广域网 | WAN | 覆盖一个城市、一个国家甚至全球 |
三者的进一步对比:
| 对比项 | LAN(局域网) | MAN(城域网) | WAN(广域网) |
|---|---|---|---|
| 典型范围 | 一间机房、一栋楼、一个园区(几十米到几千米) | 一个城市(几公里到几十公里) | 跨城市、跨国家,直至全球 |
| 典型速率 | 高(1Gbps ~ 100Gbps) | 较高 | 相对较低,受运营商链路限制 |
| 典型技术 | 以太网、Wi-Fi | 城域以太网、MPLS | 专线、MPLS VPN、Internet |
| 归属 | 通常由单位自建自管 | 运营商或大型单位 | 运营商(电信、联通、移动等) |
| 延迟 | 微秒到毫秒级 | 毫秒级 | 几十到几百毫秒 |
1.4 常见拓扑结构
拓扑结构描述网络中节点与链路的连接形式:
| 拓扑 | 结构说明 | 优点 | 缺点 |
|---|---|---|---|
| 总线型 | 所有节点挂在一根共享的主干电缆上(早期同轴以太网) | 布线省、成本低 | 冲突多,主干断则全网瘫痪,故障定位困难 |
| 星型 | 所有节点连到中心设备(交换机) | 结构清晰、单点故障不影响其他节点、易扩展 | 中心设备故障则该网段瘫痪 |
| 环型 | 节点首尾相连成环,数据沿环单向传递(如 Token Ring、FDDI) | 传输时延确定 | 任一节点或链路故障影响整环,扩展不便 |
| 树型(分层) | 星型的层级扩展:核心层—汇聚层—接入层 | 便于分区管理,适合大规模园区网 | 上层设备故障影响面大 |
| 网状 | 节点之间存在多条冗余链路(骨干网常用) | 冗余度高、可靠性最好 | 布线与设备成本高,配置复杂 |
| 混合型 | 上述几种组合,实际生产环境最常见 | 兼顾成本与可靠性 | 规划设计要求高 |
数据中心内部通常采用"接入—汇聚—核心"三层树型结构,或叶脊(Spine-Leaf)网状结构。
1.5 传输介质与网线制作标准
常见传输介质:
| 介质 | 说明 | 典型距离 |
|---|---|---|
| 双绞线(Twisted Pair) | 最常用的局域网介质,分屏蔽(STP)与非屏蔽(UTP);按性能分 Cat5、Cat5e、Cat6、Cat6a、Cat7 等 | 单段不超过 100 米 |
| 同轴电缆 | 早期总线以太网使用,现多用于有线电视、监控 | 几百米 |
| 光纤 | 抗干扰、带宽高、距离远;单模(长距离)与多模(短距离) | 多模数百米,单模数十公里 |
| 无线电波 | Wi-Fi、4G/5G、蓝牙等无线接入 | 视功率与频段而定 |
双绞线共 8 根芯(4 对),按颜色分为:橙白、橙、绿白、绿、蓝白、蓝、棕白、棕。
T568B 线序(最常用):
1 橙白 2 橙 3 绿白 4 蓝 5 蓝白 6 绿 7 棕白 8 棕
T568A 线序:
1 绿白 2 绿 3 橙白 4 蓝 5 蓝白 6 橙 7 棕白 8 棕
由此产生两种网线:
| 网线类型 | 两端线序 | 用途 |
|---|---|---|
| 直通线(正线) | 两端都用 568B(或两端都用 568A) | 连接不同类型设备:电脑 ↔ 交换机、交换机 ↔ 路由器 |
| 交叉线(反线) | 一端 568A,另一端 568B | 连接同类型设备:电脑 ↔ 电脑、交换机 ↔ 交换机(老设备) |
说明:
- 百兆以太网(100BASE-TX)实际只用到 1、2、3、6 四根芯,其中 1、2 发送,3、6 接收;千兆以太网(1000BASE-T)8 根芯全部使用,因此千兆网线必须 8 芯全通。
- 现代交换机与网卡普遍支持 Auto-MDI/MDIX 自动翻转,直通线也能连接同类设备,但考试与规范场合仍需掌握两种线序。
- 网线制作步骤:剥皮 → 按线序理线排齐 → 剪平(保留约 14mm)→ 插入水晶头(RJ45)确认 8 根芯到底 → 压线钳压实 → 用网线测试仪测通(1~8 灯依次对应点亮)。
1.6 交换机与路由器的区别
| 概念 | 说明 |
|---|---|
| 点播(单播) | 点对点通信 |
| 广播 | 访问范围是整个局域网 |
| 组播(多播) | 在一个广播域(局域网)内,有相同组播地址的主机在同一个组 |
| 交换机 | 同网段互相访问,不隔离广播 |
| 路由器 | 可跨网段路由(跨网段访问),隔离广播 |
网络通信的类型(细化说明):
- 点对点(单播):平常大多数网络行为都是点对点,例如发邮件、从 HTTP 下载文件、从 DNS 服务器获取域名解析。
- 组播(点对多点):用于视频会议、集群等场景。
- 广播(点对多点):例如 DHCP 获取地址、ARP(Address Resolution Protocol,地址解析协议)。
交换机与路由器对照表:
| 对比项 | 交换机(Switch) | 路由器(Router) |
|---|---|---|
| 工作层次 | 二层(数据链路层),三层交换机可做三层转发 | 三层(网络层) |
| 转发依据 | MAC 地址表 | 路由表(目标 IP 网段) |
| 地址类型 | MAC 地址 | IP 地址 |
| 广播域 | 不隔离广播,一台交换机默认是一个广播域(可用 VLAN 划分) | 隔离广播,每个接口是一个广播域 |
| 冲突域 | 每个端口一个冲突域(全双工无冲突) | 每个接口一个冲突域 |
| 典型用途 | 局域网内主机互联,同网段高速转发 | 连接不同网段/不同网络,实现跨网段通信、NAT、上网出口 |
| 端口数量 | 多(24、48 口常见) | 少(几个到十几个) |
补充设备:
- 集线器(Hub):一层设备,简单复制信号到所有端口,所有端口共享带宽,处于同一冲突域,已被交换机淘汰。
- 网桥(Bridge):二层设备,交换机的前身,端口少。
- 防火墙:多在三层及以上工作,按策略过滤流量。
- 三层交换机:具备路由能力的交换机,常用于园区网核心,转发性能高于传统路由器,但 WAN 接口与 NAT 能力弱。
1.7 两节点能通信的条件
- 物理上连通:线缆符合规格,交换机加电。
- 有正确的路由:知道到达目的地的路。
- 有通信的权限:防火墙等策略允许通行。
排错时按这三个条件依次验证,可以快速缩小问题范围。
二、OSI 七层模型与 TCP/IP 四层模型
2.1 网络协议分层模型总览
OSI 七层模型:
| 层级 | 名称 |
|---|---|
| 第七层 | 应用层 |
| 第六层 | 表示层 |
| 第五层 | 会话层 |
| 第四层 | 传输层 |
| 第三层 | 网络层 |
| 第二层 | 数据链路层 |
| 第一层 | 物理层 |
TCP/IP 四层模型:
| 层级 | 名称 |
|---|---|
| 第四层 | 应用层 |
| 第三层 | 传输层 |
| 第二层 | 网络层 |
| 第一层 | 网络接口层 |
分层的意义:把复杂的通信过程拆分为若干相对独立的层次,每层只负责自己的职责并为上层提供服务;下层实现改变时不影响上层,便于标准化、排错与开发。
2.2 OSI 各层职责、协议与设备
| 层级 | 名称 | 核心职责 | 典型协议/标准 | 典型设备 | 数据单元(PDU) |
|---|---|---|---|---|---|
| 7 | 应用层 | 直接为用户进程提供网络服务接口 | HTTP、HTTPS、FTP、SSH、Telnet、SMTP、POP3、IMAP、DNS、DHCP、SNMP、NFS | 主机应用程序、应用层网关 | 数据(Data)/ 报文 |
| 6 | 表示层 | 数据格式转换、编码解码、加密解密、压缩 | ASCII、Unicode、JPEG、MPEG、SSL/TLS(跨 5/6 层) | — | 数据 |
| 5 | 会话层 | 建立、管理、终止会话,进行会话同步与校验点 | RPC、NetBIOS、SQL 会话 | — | 数据 |
| 4 | 传输层 | 端到端可靠/不可靠传输、分段与重组、流量控制、差错恢复、端口寻址 | TCP、UDP、SCTP | 防火墙(四层)、四层负载均衡(LVS) | 段(Segment,TCP)/ 数据报(Datagram,UDP) |
| 3 | 网络层 | 逻辑寻址(IP)、路由选择、分片与重组 | IP、ICMP、IGMP、ARP(介于 2/3 层)、路由协议 RIP/OSPF/BGP | 路由器、三层交换机 | 包(Packet)/ 数据报 |
| 2 | 数据链路层 | 物理寻址(MAC)、成帧、差错检测(CRC)、介质访问控制 | Ethernet(IEEE 802.3)、PPP、HDLC、VLAN(802.1Q)、STP、Wi-Fi(802.11) | 交换机、网桥、网卡 | 帧(Frame) |
| 1 | 物理层 | 在介质上传输比特流,规定电气、机械、时序特性 | RS-232、RJ45、IEEE 802.3 物理规范、光纤规范 | 网线、光纤、中继器、集线器、收发器 | 位(Bit)/ 比特流 |
记忆口诀(自下而上):物、链、网、传、会、表、应;即"物流网传会表演"。
2.3 TCP/IP 四层模型与 OSI 的对应关系
| TCP/IP 四层 | 对应 OSI 层 | 主要协议 |
|---|---|---|
| 应用层 | 应用层 + 表示层 + 会话层 | HTTP、HTTPS、FTP、SSH、DNS、DHCP、SMTP、NFS |
| 传输层 | 传输层 | TCP、UDP |
| 网络层(互联网层) | 网络层 | IP、ICMP、IGMP、ARP |
| 网络接口层(链路层) | 数据链路层 + 物理层 | Ethernet、PPP、Wi-Fi、驱动与网卡 |
也有教材使用 TCP/IP 五层模型(把网络接口层再拆为数据链路层与物理层),本质与四层一致。
2.4 数据封装与解封装
PDU(Protocol Data Unit,协议数据单元):每一层在处理数据时形成的数据格式统称。上层数据到达本层后,本层会给它加上自己的头部(有的层还加尾部),形成本层的 PDU 再交给下层,这个过程叫封装(Encapsulation);接收方由下向上逐层剥掉头部,叫解封装(De-encapsulation)。
发送方封装过程(自上而下):
应用层 : [ 用户数据 Data ]
传输层 : [ TCP/UDP 头 | 用户数据 ] => 段 Segment
网络层 : [ IP 头 | TCP 头 | 用户数据 ] => 包 Packet
数据链路层: [ 以太网帧头 | IP 头 | TCP 头 | 数据 | FCS 帧尾 ] => 帧 Frame
物理层 : 1010110001110101... => 比特流 Bit
接收方解封装过程(自下而上):
物理层 : 接收比特流,还原为帧
数据链路层 : 校验 FCS,检查目的 MAC 是否为本机 -> 剥掉帧头帧尾,上交 IP 包
网络层 : 检查目的 IP 是否为本机,按协议号(6=TCP,17=UDP,1=ICMP)上交 -> 剥掉 IP 头
传输层 : 按目的端口号找到对应进程/套接字 -> 剥掉 TCP/UDP 头
应用层 : 交给应用程序处理原始数据
关键字段与"多路复用"的对应关系:
| 层 | 头部关键字段 | 作用 |
|---|---|---|
| 数据链路层 | 源/目的 MAC、类型字段(0x0800=IPv4、0x0806=ARP、0x86DD=IPv6)、FCS | 同网段寻址与差错检测 |
| 网络层 | 源/目的 IP、TTL、协议号、标识/标志/片偏移 | 跨网段寻址、防环、分片重组 |
| 传输层 | 源/目的端口、序号、确认号、标志位、窗口 | 找到具体进程、可靠传输与流控 |
补充概念:
- MTU(Maximum Transmission Unit):链路层一次能承载的最大数据字节数,以太网默认 1500。IP 包超过 MTU 时会分片;
ping -M do -s <size>可用于探测路径 MTU。 - MSS(Maximum Segment Size):TCP 单个段能携带的最大数据量,以太网上通常为 1500 - 20(IP) - 20(TCP) = 1460。
- 数据传输的实际路径:源主机自上而下封装 → 经交换机(二层转发,帧头改写发生在路由器处)→ 路由器逐跳解封装到三层、查路由表、重新封装新帧头 → 目的主机自下而上解封装。整个过程中源/目的 IP 通常不变(NAT 除外),而源/目的 MAC 每经过一台三层设备都会改变。
三、常见协议
3.1 IP 协议
- 位于网络层,提供无连接、不可靠、尽最大努力交付的分组传送服务,可靠性由上层 TCP 保证。
- 负责逻辑寻址(IP 地址)与路由转发;IPv4 头部固定 20 字节(不含选项)。
- 关键字段:版本、首部长度、TOS/DSCP(服务质量)、总长度、标识/标志/片偏移(分片重组)、TTL(每经一台路由器减 1,减到 0 丢弃并回送 ICMP 超时,用于防止环路)、协议号、首部校验和、源 IP、目的 IP。
- 常见协议号:
1=ICMP,2=IGMP,6=TCP,17=UDP,89=OSPF。
3.2 ICMP 协议
ICMP(Internet Control Message Protocol,互联网控制报文协议)用于传递差错报告与控制信息,工作在网络层,不使用端口号。
| 类型/代码 | 报文 | 用途 |
|---|---|---|
| Type 8 | Echo Request | ping 发出的请求 |
| Type 0 | Echo Reply | ping 的应答 |
| Type 3 | Destination Unreachable | 目标不可达(代码 0=网络不可达、1=主机不可达、3=端口不可达、4=需分片但设置了 DF) |
| Type 11 | Time Exceeded | TTL 超时,traceroute 依赖此报文 |
| Type 5 | Redirect | 路由重定向,提示更优网关 |
常用命令:
ping -c 4 192.168.1.1 # 发 4 个 ICMP 请求
ping -c 3 www.baidu.com # 同时验证 DNS 与外网连通性
ping -s 1472 -M do 8.8.8.8 # 探测 MTU(1472+28=1500)
注意:许多服务器和防火墙会禁用 ICMP,ping 不通不能直接断定主机宕机,应结合 telnet/nc 测端口。
3.3 ARP 协议与 ARP 缓存
ARP(Address Resolution Protocol,地址解析协议)用于由已知的 IP 地址查询对应的 MAC 地址,工作在数据链路层与网络层之间,只在同一广播域内有效。
工作流程:
- 主机 A 要发数据给同网段的 B(
192.168.1.20),先查本机 ARP 缓存。 - 缓存中没有,则发送 ARP 请求广播:目的 MAC 为
ff:ff:ff:ff:ff:ff,内容是"谁是 192.168.1.20,请告诉 192.168.1.10"。 - 网段内所有主机都收到,只有 B 发现问的是自己,用单播 ARP 应答回复自己的 MAC。
- A 把
IP -> MAC的对应关系写入 ARP 缓存(有老化时间,Linux 默认约 60 秒基础老化,达到 gc_thresh 时清理),随后正常通信。 - 若目标不在同网段,A 会请求网关的 MAC,把帧发给网关,由网关继续转发。
相关命令:
arp -n # 查看 ARP 缓存(传统命令)
ip neigh show # 查看邻居表(推荐)
ip neigh show dev eth0
arp -d 192.168.1.20 # 删除某条 ARP 缓存
ip neigh del 192.168.1.20 dev eth0
arp -s 192.168.1.20 00:0c:29:11:22:33 # 添加静态 ARP 绑定(防 ARP 欺骗)
arping -I eth0 192.168.1.20 # 直接发送 ARP 请求探测
ip neigh 状态含义:REACHABLE(可达)、STALE(陈旧待验证)、DELAY/PROBE(探测中)、FAILED(解析失败,常见于目标不存在)、PERMANENT(静态)。
派生概念:
- 免费 ARP(Gratuitous ARP):主机主动广播自己的 IP-MAC 对应关系,用于检测 IP 冲突、以及 keepalived/VIP 漂移后刷新交换机与主机的 ARP 缓存。
- 代理 ARP(Proxy ARP):路由器代替其他网段的主机应答 ARP。
- ARP 欺骗:攻击者伪造 ARP 应答,把网关 IP 对应到自己的 MAC,实现中间人攻击;防护手段包括静态绑定、交换机端口安全、DHCP Snooping + DAI。
- RARP:由 MAC 反查 IP,早期无盘工作站使用,已被 DHCP 取代。
3.4 TCP 协议
TCP(Transmission Control Protocol)是面向连接、可靠、基于字节流的传输层协议。
可靠性机制:序号与确认(ACK)、超时重传、快速重传、滑动窗口流量控制、拥塞控制(慢启动、拥塞避免、快恢复)、校验和、按序交付与去重。
TCP 头部关键标志位:
| 标志 | 含义 |
|---|---|
SYN |
请求建立连接,同步序号 |
ACK |
确认号有效 |
FIN |
数据发送完毕,请求关闭连接 |
RST |
复位连接(对方端口未监听或连接异常时返回) |
PSH |
尽快把数据推给应用层 |
URG |
紧急指针有效 |
3.4.1 三次握手(建立连接)
客户端 服务端
| | (LISTEN)
|----- 1. SYN, seq=x ------------------------->|
| | (SYN_RECV)
|<---- 2. SYN+ACK, seq=y, ack=x+1 -------------|
| (SYN_SENT -> ESTABLISHED) |
|----- 3. ACK, seq=x+1, ack=y+1 -------------->|
| | (ESTABLISHED)
- 客户端发送
SYN,携带初始序号seq=x,进入SYN_SENT。 - 服务端回应
SYN+ACK,自己的序号seq=y,确认号ack=x+1,进入SYN_RECV(半连接,存放于半连接队列)。 - 客户端回
ACK,ack=y+1,双方进入ESTABLISHED,连接建立,可以传数据。
为什么是三次而不是两次:两次握手无法让服务端确认客户端确实收到了自己的 SYN+ACK,也无法防止历史失效的 SYN 造成服务端白白建立连接、浪费资源。
相关运维知识:SYN Flood 攻击就是大量伪造源 IP 的 SYN 塞满半连接队列,缓解手段是开启 net.ipv4.tcp_syncookies=1、增大 tcp_max_syn_backlog、缩小 tcp_synack_retries。
3.4.2 四次挥手(断开连接)
主动关闭方 被动关闭方
|----- 1. FIN, seq=u ------------------------->|
| (FIN_WAIT_1) | (CLOSE_WAIT)
|<---- 2. ACK, ack=u+1 ------------------------|
| (FIN_WAIT_2) |
|<---- 3. FIN, seq=w --------------------------|
| | (LAST_ACK)
|----- 4. ACK, ack=w+1 ----------------------->|
| (TIME_WAIT, 等 2MSL -> CLOSED) | (CLOSED)
- 主动关闭方(通常是客户端)数据发完,发送
FIN,进入FIN_WAIT_1。 - 被动关闭方回
ACK,进入CLOSE_WAIT;此时它仍可继续发送剩余数据(TCP 是全双工,需要分别关闭两个方向)。主动方进入FIN_WAIT_2。 - 被动方数据也发完,发送
FIN,进入LAST_ACK。 - 主动方回
ACK,进入TIME_WAIT,等待2MSL后变为CLOSED;被动方收到ACK即CLOSED。
为什么是四次:关闭是双向的,一个方向的 FIN 只表示"我不再发数据了",对方可能还有数据要发,因此需要各自发一次 FIN 并各自被确认。
3.4.3 TCP 状态机与 TIME_WAIT / CLOSE_WAIT
| 状态 | 出现在 | 含义 |
|---|---|---|
LISTEN |
服务端 | 监听端口,等待连接 |
SYN_SENT |
客户端 | 已发 SYN,等待对端响应 |
SYN_RECV |
服务端 | 收到 SYN 并回了 SYN+ACK,半连接状态 |
ESTABLISHED |
双方 | 连接已建立,可收发数据 |
FIN_WAIT_1 |
主动关闭方 | 已发 FIN,等待对端 ACK |
FIN_WAIT_2 |
主动关闭方 | 己方 FIN 已被确认,等待对端的 FIN |
CLOSE_WAIT |
被动关闭方 | 收到对端 FIN 并已 ACK,等待本端应用调用 close() |
LAST_ACK |
被动关闭方 | 已发出自己的 FIN,等待最后的 ACK |
TIME_WAIT |
主动关闭方 | 已发最后的 ACK,等待 2MSL 后彻底关闭 |
CLOSING |
双方 | 双方几乎同时关闭的少见状态 |
CLOSED |
双方 | 连接不存在 |
TIME_WAIT 说明:
- 只出现在主动关闭连接的一方,持续
2MSL(MSL 为报文最大生存时间,Linux 固定约 60 秒,即TIME_WAIT约 60 秒,内核宏TCP_TIMEWAIT_LEN)。 - 存在意义:① 确保最后一个
ACK丢失时,对端重发的FIN还能被响应,让对端可靠关闭;② 让本次连接的迟到报文在网络中消亡,避免干扰使用相同四元组的新连接。 - 大量
TIME_WAIT常见于高并发短连接的客户端或反向代理(Nginx 主动关闭后端连接)。危害主要是占用本地端口。 - 常见优化:开启长连接/连接池(最有效)、
net.ipv4.tcp_tw_reuse=1(客户端侧复用,需tcp_timestamps=1)、扩大net.ipv4.ip_local_port_range。不要使用已被移除的tcp_tw_recycle(NAT 环境下会导致连接失败)。
CLOSE_WAIT 说明:
- 只出现在被动关闭的一方,表示对端已经关闭,而本端应用程序没有调用
close()/shutdown()释放 socket。 - 大量
CLOSE_WAIT基本可以断定是应用程序 BUG(异常分支未关闭连接、连接池泄漏、线程阻塞未回收),不是内核参数能解决的问题;它不会自动超时消失,会一直占用文件描述符直至进程退出。 - 排查方法:
ss -tan state close-wait # 列出 CLOSE_WAIT 连接
ss -tanp | grep CLOSE-WAIT # 带进程信息
netstat -ant | awk '/^tcp/{S[$NF]++} END{for(a in S) print a, S[a]}' # 各状态计数
lsof -p <PID> | grep -c TCP # 查看某进程占用的连接数
3.5 UDP 协议与 TCP 对比
UDP(User Datagram Protocol)是无连接、不可靠、面向报文的传输层协议,头部仅 8 字节(源端口、目的端口、长度、校验和)。
| 对比项 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接,需三次握手 | 无连接,直接发送 |
| 可靠性 | 可靠:确认、重传、排序、去重 | 不可靠:可能丢包、乱序、重复 |
| 传输单位 | 字节流(无边界,需应用自己分包) | 数据报(保留消息边界) |
| 头部开销 | 20 字节起 | 8 字节 |
| 流量/拥塞控制 | 有(滑动窗口、慢启动等) | 无 |
| 速度与时延 | 较慢、时延抖动大 | 快、时延低 |
| 支持通信方式 | 只能一对一 | 支持一对一、一对多(广播/组播) |
| 典型应用 | HTTP/HTTPS、SSH、FTP、SMTP、MySQL、NFS(TCP) | DNS 查询、DHCP、SNMP、TFTP、NTP、语音视频、QUIC、syslog |
3.6 端口号
- 端口号为 16 位,范围
0 ~ 65535,用于标识同一主机上的不同网络进程;IP + 协议 + 端口唯一确定一个通信端点,"源 IP + 源端口 + 目的 IP + 目的端口"称为四元组。 - 分类:
0 ~ 1023:知名端口(Well-Known),由 IANA 分配,Linux 下绑定需要 root 权限。1024 ~ 49151:注册端口,常见服务软件使用。49152 ~ 65535:动态/私有端口,客户端随机源端口取自此范围(Linux 实际范围见cat /proc/sys/net/ipv4/ip_local_port_range)。
- 端口号建议取值范围为
1024 ~ 65535(如使用nc做测试时自选端口)。 - 本机服务与端口对应关系记录在
/etc/services。
常用端口号对照表:
| 端口 | 协议 | 服务 | 说明 |
|---|---|---|---|
| 20 | TCP | FTP-Data | FTP 数据连接(主动模式) |
| 21 | TCP | FTP | FTP 控制连接,明文传输 |
| 22 | TCP | SSH/SFTP/SCP | 加密远程登录与文件传输 |
| 23 | TCP | Telnet | 明文远程登录,不安全,常被当作测端口的工具 |
| 25 | TCP | SMTP | 发送邮件 |
| 53 | UDP/TCP | DNS | 域名解析:查询用 UDP,区域传送和大响应用 TCP |
| 67/68 | UDP | DHCP | 67 服务端,68 客户端 |
| 69 | UDP | TFTP | 简单文件传输,PXE 装机常用 |
| 80 | TCP | HTTP | 明文 Web |
| 110 | TCP | POP3 | 接收邮件 |
| 111 | TCP/UDP | rpcbind/portmap | NFS、NIS 等 RPC 服务端口映射 |
| 123 | UDP | NTP | 时间同步 |
| 137/138/139 | UDP/TCP | NetBIOS | Windows 网络邻居 |
| 143 | TCP | IMAP | 接收邮件 |
| 161/162 | UDP | SNMP | 网络设备监控 |
| 389 | TCP | LDAP | 目录服务(636 为 LDAPS) |
| 443 | TCP | HTTPS | HTTP over TLS(HTTP/3 使用 UDP 443) |
| 445 | TCP | SMB/CIFS | Windows 文件共享 |
| 465/587 | TCP | SMTPS/Submission | 加密发信 |
| 514 | UDP | Syslog | 日志收集 |
| 873 | TCP | rsync | rsync 守护进程模式 |
| 993/995 | TCP | IMAPS/POP3S | 加密收信 |
| 1521 | TCP | Oracle | Oracle 数据库 |
| 2049 | TCP/UDP | NFS | 网络文件系统 |
| 3306 | TCP | MySQL/MariaDB | 数据库 |
| 3389 | TCP | RDP | Windows 远程桌面 |
| 5432 | TCP | PostgreSQL | 数据库 |
| 5672 | TCP | AMQP | RabbitMQ |
| 6379 | TCP | Redis | 缓存数据库 |
| 8080 | TCP | HTTP-Alt | Tomcat 等应用服务器常用 |
| 9200/9300 | TCP | Elasticsearch | REST 接口 / 集群通信 |
| 11211 | TCP/UDP | Memcached | 缓存 |
| 27017 | TCP | MongoDB | 数据库 |
3.7 常见应用层协议
| 协议 | 端口 | 传输层 | 作用与要点 |
|---|---|---|---|
| HTTP | 80 | TCP | 超文本传输协议,无状态请求-响应模型;方法 GET/POST/PUT/DELETE/HEAD;状态码 2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误;HTTP/1.1 支持长连接(Keep-Alive) |
| HTTPS | 443 | TCP | HTTP + SSL/TLS,提供加密、完整性校验与服务端身份认证;握手过程为协商加密套件、验证证书、交换会话密钥后转对称加密 |
| FTP | 21(控制)、20(数据) | TCP | 文件传输协议,明文;主动模式(PORT,服务端从 20 端口主动连客户端,易被客户端防火墙阻挡)与被动模式(PASV,服务端开高端口等客户端连,穿越 NAT 更友好);安全替代为 SFTP(走 SSH 22)与 FTPS |
| SSH | 22 | TCP | 安全外壳协议,加密远程登录、执行命令、文件传输(scp/sftp)、端口转发与隧道 |
| DNS | 53 | UDP 为主,TCP 辅 | 域名与 IP 相互解析。记录类型:A(IPv4)、AAAA(IPv6)、CNAME(别名)、MX(邮件)、NS(权威服务器)、PTR(反向)、TXT、SOA。解析顺序:浏览器/系统缓存 → /etc/hosts → /etc/resolv.conf 指定的 DNS → 根域 → 顶级域 → 权威域。递归查询由本地 DNS 代为完成,迭代查询在各级 DNS 之间进行 |
| DHCP | 67(服务端)、68(客户端) | UDP | 自动为客户端分配 IP、掩码、网关、DNS。四步过程:DISCOVER(客户端广播)→ OFFER(服务端提供)→ REQUEST(客户端请求确认)→ ACK(服务端确认),含租期与续租(租期一半时续租) |
| Telnet | 23 | TCP | 明文远程登录,生产禁用;常用来测试 TCP 端口是否开放 |
| SMTP/POP3/IMAP | 25 / 110 / 143 | TCP | 发信 / 收信(下载后可删除)/ 收信(服务端保留并同步状态) |
| NTP | 123 | UDP | 时间同步,集群、日志与认证(Kerberos)强依赖时间一致 |
| SNMP | 161/162 | UDP | 网络设备与服务器监控采集 |
| NFS | 2049(依赖 111 rpcbind) | TCP/UDP | 类 UNIX 平台的网络文件共享 |
详见 09-02-NFS与autofs.md
四、IP 地址
4.1 IPv4 与 IPv6
| 版本 | 格式 | 示例 |
|---|---|---|
| IPv4 | 四个点分十进制数字 | 10.1.1.35、192.168.1.1 |
| IPv6 | 六组点分十六进制数字(因互联网急剧扩张、IPv4 地址不足而发展的下一代 IP) | fe80::20c:29ff:fe21:fd31 |
IPv4 地址是一个 32 位的二进制数字,由网络地址和主机地址两部分组成。
IPv4 地址由四个十进制数字表示,每个十进制数可转换为一个八位二进制数。例如:
10.1.1.35 转换为二进制:
00001010.00000001.00000001.00100011
每一位对应的权值(掩码 255 时):
位序: 1 2 3 4 5 6 7 8
权值:128 64 32 16 8 4 2 1
练习:将以下二进制转换为十进制:
11000000.10101000.00000001.01100100
(答案见本文"练习"一节。)
十进制转二进制的实用方法:
用 128、64、32、16、8、4、2、1 依次去减,能减则该位为 1,不能减则为 0。例如 183:
183 - 128 = 55 -> 1
55 - 64 < 0 -> 0
55 - 32 = 23 -> 1
23 - 16 = 7 -> 1
7 - 8 < 0 -> 0
7 - 4 = 3 -> 1
3 - 2 = 1 -> 1
1 - 1 = 0 -> 1
=> 183 = 10110111
也可使用系统自带计算器的"程序员"(编程)模式做进制转换,或用命令行:
# 十进制转二进制
echo 'obase=2; 183' | bc # 输出 10110111
# 二进制转十进制
echo 'ibase=2; 10110111' | bc # 输出 183
printf '%d\n' 0b10110111 # bash 4.2+ 亦可
4.2 IP 地址管理机构
IP 地址由全球性机构 IANA 统一管理,各区域分配机构如下:
| 机构 | 负责区域 |
|---|---|
| AfriNIC | 非洲地区 |
| APNIC | 亚太地区(中国所在区域) |
| ARIN | 北美地区 |
| LACNIC | 拉丁美洲及加勒比群岛 |
| RIPE NCC | 欧洲、中东和中亚 |
4.3 IP 地址分类
IP 地址分为 A、B、C、D、E 五类,互联网上实际使用的只有 A、B、C 三类。
| 类别 | 网络位/主机位 | 开头标识(固定首位) | 地址范围 | 默认子网掩码 | 说明 |
|---|---|---|---|---|---|
| A 类 | 前 8 位网络位,后 24 位主机位 | 首位为 0 |
1 - 127(0.0.0.1 ~ 127.255.255.255) |
255.0.0.0(/8) |
以 0 开头,适合超大型网络 |
| B 类 | 前 16 位网络位,后 16 位主机位 | 前两位为 10 |
128 - 191(128.0.0.0 ~ 191.255.255.255) |
255.255.0.0(/16) |
以 10 开头,适合中大型网络 |
| C 类 | 前 24 位网络位,后 8 位主机位 | 前三位为 110 |
192 - 223(192.0.0.0 ~ 223.255.255.255) |
255.255.255.0(/24) |
以 110 开头,适合小型网络 |
| D 类 | 组播地址(无网络/主机位划分) | 前四位为 1110 |
224 - 239(224.0.0.0 ~ 239.255.255.255) |
— | 多播地址,保留用于寻址一组计算机或同一协议组的主机 |
| E 类 | 军方使用与预留 | 前五位为 11110 |
240 - 247(240.0.0.0 ~ 247.255.255.255);广义为 240.0.0.0 ~ 255.255.255.255 |
— | 保留地址,公网未使用,一般用于科研实验或私有网络以解决 IP 不足 |
各类地址的二进制范围:
A 类:00000000.00000000.00000000.00000001 ~ 01111111.11111111.11111111.11111111
B 类:10000000.00000000.00000000.00000000 ~ 10111111.11111111.11111111.11111111
C 类:11000000.00000000.00000000.00000000 ~ 11011111.11111111.11111111.11111111
D 类:11100000.00000000.00000000.00000000 ~ 11101111.11111111.11111111.11111111
E 类:11110000.00000000.00000000.00000000 ~ 11110111.11111111.11111111.11111111
判断类别的速算法:只看第一个十进制数(第一字节)落在 1-127 / 128-191 / 192-223 / 224-239 / 240-255 哪个区间即可。
常见 D 类(组播)保留地址举例:224.0.0.1(本网段所有主机)、224.0.0.2(本网段所有路由器)、224.0.0.5/6(OSPF)、224.0.0.9(RIPv2)、224.0.0.18(VRRP,keepalived 使用)。
4.4 特殊地址
| 地址/地址段 | 用途 |
|---|---|
0.0.0.0 |
32 位全为 0。作为本机地址时代表本机本身(DHCP 未获取地址前的源地址);在监听语境中代表"本机所有 IP";在路由表中代表"全世界所有地址",即默认路由;代表所有 IP |
255.255.255.255 |
32 位全为 1,受限广播地址(全网广播),不被路由器转发 |
127.0.0.1 ~ 127.255.255.255 |
本地环回地址,代表本机本身,用于测试本机 TCP/IP 协议是否正常 |
| 网络地址(主机位全 0) | 标识一个网段本身,如 192.168.1.0/24,不能分配给主机 |
| 广播地址(主机位全 1) | 定向广播,发给该网段所有主机,如 192.168.1.255,不能分配给主机 |
169.254.0.0/16 |
链路本地地址(APIPA)。DHCP 获取失败时系统自动配置,只能同网段通信,看到它基本说明没拿到 DHCP 地址 |
224.0.0.0/4 |
组播地址段 |
某些集群软件也会使用环回地址,例如 LVS 集群的 DR(Direct Routing)架构。
4.5 三个私网网段
以下地址为内网(局域网)地址,不能在公网上路由,由 RFC1918 定义,可在不同单位内部重复使用,通过 NAT 转换后访问公网:
| 类别 | 私网网段 | CIDR 表示 | 可用地址数 |
|---|---|---|---|
| A 类 | 10.0.0.0 ~ 10.255.255.255 |
10.0.0.0/8 |
约 1677 万 |
| B 类 | 172.16.0.0 ~ 172.31.255.255 |
172.16.0.0/12 |
约 104 万 |
| C 类 | 192.168.0.0 ~ 192.168.255.255 |
192.168.0.0/16 |
约 6.5 万 |
注意 B 类私网是 172.16 ~ 172.31,共 16 个 B 类网段,不是只有 172.16。
4.6 IPv6 简介
IPv4 地址长 32 位,理论上约 43 亿个,已分配枯竭;IPv6 地址长 128 位,数量约 3.4×10^38,同时简化了首部、取消了广播与分片、内置 IPsec、支持地址自动配置(SLAAC)。(IPv6 此处不深入展开,不必强记分类。)
表示方法:
- 采用冒分十六进制:8 组,每组 4 个十六进制数,组间用
:分隔。
完整写法:2001:0DB8:0000:0000:0000:0000:1428:57AB
- 前导零可省略:
2001:DB8:0:0:0:0:1428:57AB
- 连续的全零组可用
::压缩一次(整个地址只能出现一个::):
2001:DB8::1428:57AB
::1 等价于 0:0:0:0:0:0:0:1 IPv6 环回地址(相当于 IPv4 的 127.0.0.1)
:: 等价于全 0 未指定地址(相当于 0.0.0.0)
- 前缀长度用 CIDR 方式书写,如
2001:db8::/32、fe80::/10;主机地址通常为/64。 - 在 URL 中需用方括号括起:
http://[2001:db8::1]:80/。
常见地址类型:
| 类型 | 前缀 | 说明 |
|---|---|---|
| 全球单播地址 | 2000::/3 |
相当于 IPv4 公网地址 |
| 链路本地地址 | fe80::/10 |
自动生成,仅本链路有效,示例 fe80::20c:29ff:fe21:fd31(常由 MAC 通过 EUI-64 生成),使用时需指明接口如 ping6 fe80::1%eth0 |
| 唯一本地地址 | fc00::/7(实际用 fd00::/8) |
相当于 IPv4 私网地址 |
| 组播地址 | ff00::/8 |
IPv6 用组播取代广播,如 ff02::1 所有节点、ff02::2 所有路由器 |
| 任播地址 | 与单播同段 | 发给"最近的一个"成员 |
常用命令:
ip -6 addr show # 查看 IPv6 地址
ip -6 route show # 查看 IPv6 路由
ping6 ::1 # 测试本机 IPv6 协议栈
ping6 -I eth0 fe80::1 # 指定接口 ping 链路本地地址
ss -6 -tuln # 查看 IPv6 监听端口
sysctl -w net.ipv6.conf.all.disable_ipv6=1 # 临时关闭 IPv6
五、子网掩码与子网划分
5.1 基本原理
IP 地址 = 网络号 + 主机号。子网掩码(netmask)决定 IP 属于哪个网段。
- 同一网段的不同 IP 可以直接通信。
- 不同网段的两个 IP 需要经过路由才能通信。
子网掩码把一个 IP 地址分成两部分:左边是网络部分,右边是主机部分。掩码的二进制形式一定是"连续的 1 后面跟连续的 0",1 的个数就是网络位长度。
判断两个 IP 是否在同一网段的方法:将 IP 地址与子网掩码做按位与(AND)运算(对应位都为 1 才取 1,否则取 0),得到网络号。网络号相同则在同一网段。
以 192.168.0.183/24 为例:
IP 11000000.10101000.00000000.10110111
掩码 11111111.11111111.11111111.00000000
与 11000000.10101000.00000000.00000000 => 192.168.0.0
由此可得:
- 网络号:主机部分的二进制位全部为 0,如
10.1.1.0。 - 广播地址:主机部分的二进制位全部为 1,如
10.1.1.255。 - 可用 IP 数量:主机部分除去网络号和广播地址,剩下的都是可用 IP。
网络号相同就是同一个网段;同一网段的节点在默认配置下可以直接通信。
计算方法示范(以 172.16.33.44/16 为例):
172.16.33.44 => 10101100.00010000.00100001.00101100
/16 掩码 => 11111111.11111111.00000000.00000000
与运算结果 => 10101100.00010000.00000000.00000000 => 172.16.0.0 (网络号)
主机位置 1 => 10101100.00010000.11111111.11111111 => 172.16.255.255(广播地址)
可使用系统自带计算器的"程序员"(编程)模式做进制转换。
5.2 CIDR 前缀表示与掩码换算
CIDR(Classless Inter-Domain Routing,无类别域间路由)用 IP/前缀长度 的方式表示网络,如 192.168.1.0/24,其中 /24 表示前 24 位是网络位。CIDR 打破了 A/B/C 类的固定边界,使地址分配更灵活。
点分十进制掩码与前缀长度换算:把前缀长度按 8 位一组拆开,满 8 位的组写 255,不足的组按权值累加。
单字节内可能出现的掩码值只有 9 种:
| 该字节中 1 的个数 | 二进制 | 十进制 |
|---|---|---|
| 0 | 00000000 |
0 |
| 1 | 10000000 |
128 |
| 2 | 11000000 |
192 |
| 3 | 11100000 |
224 |
| 4 | 11110000 |
240 |
| 5 | 11111000 |
248 |
| 6 | 11111100 |
252 |
| 7 | 11111110 |
254 |
| 8 | 11111111 |
255 |
举例:
/18 => 11111111.11111111.11000000.00000000 => 255.255.192.0
/26 => 11111111.11111111.11111111.11000000 => 255.255.255.192
/30 => 11111111.11111111.11111111.11111100 => 255.255.255.252
反过来,255.255.255.128 中 1 的个数为 8+8+8+1 = 25,即 /25。
5.3 网络地址、广播地址与可用主机数的计算公式
设前缀长度为 m(即掩码中 1 的个数),主机位数为 h = 32 - m:
| 计算项 | 公式 / 方法 |
|---|---|
| 网络地址 | IP AND 掩码(主机位全置 0) |
| 广播地址 | 网络地址 OR 反掩码(主机位全置 1) |
| 该网段地址总数 | 2^(32-m) |
| 可用主机数 | 2^(32-m) - 2(减去网络地址与广播地址) |
| 第一个可用 IP | 网络地址 + 1 |
| 最后一个可用 IP | 广播地址 - 1 |
| 地址块步长(block size) | 256 - 掩码中最后一个非 0 字节的值 |
特例说明:
/31(2^1 - 2 = 0)按 RFC3021 用于点对点链路,两个地址都可用。/32表示单个主机地址(主机路由),常用于回环、VIP、路由条目。
5.4 计算示例:10.1.1.35/8 与 10.1.1.36/24 能否互通
第一个 IP:10.1.1.35/255.0.0.0
00001010.00000001.00000001.00100011 (10.1.1.35)
& 11111111.00000000.00000000.00000000 (255.0.0.0)
----------------------------------------
00001010.00000000.00000000.00000000 网络号:10.0.0.0
- 网络号:
10.0.0.0(即10.0.0.0/8) - 主机号:
1.1.35 - 广播地址:
10.255.255.255 - 可用主机范围:
10.0.0.1~10.255.255.254
第二个 IP:10.1.1.36/255.255.255.0
00001010.00000001.00000001.00100100 (10.1.1.36)
& 11111111.11111111.11111111.00000000 (255.255.255.0)
----------------------------------------
00001010.00000001.00000001.00000000 网络号:10.1.1.0
- 网络号:
10.1.1.0(即10.1.1.0/24) - 主机号:
36 - 广播地址:
10.1.1.255 - 可用主机范围:
10.1.1.1~10.1.1.254
两个 IP 的网络号不同(10.0.0.0 ≠ 10.1.1.0),不能直接互通。
5.5 子网划分的计算公式
子网划分的本质:向主机位借位当作子网位,用一个大网段切分出多个小网段,从而隔离广播域、节约地址、便于管理。
设默认掩码位数为 n,划分后掩码位数为 m:
| 计算项 | 公式 |
|---|---|
| 子网数量 | 2^(m - n) |
| 每个子网可用主机数 | 2^(32 - m) - 2(减 2 是去掉网络号和广播地址) |
可用 Shell 快速计算:
echo $[2**(m-n)] # 子网数
echo $[2**(32-m)-2] # 每子网可用主机数
实际执行示例:
# 192.168.1.0/25:C 类默认 /24,借 1 位
echo $[2**(25-24)] # 2 子网数
echo $[2**(32-25)-2] # 126 每子网可用主机数
# 172.16.0.0/18:B 类默认 /16,借 2 位
echo $[2**(18-16)] # 4
echo $[2**(32-18)-2] # 16382
5.6 子网划分的完整计算步骤
以"把 192.168.10.0/24 划分为 4 个子网"为例,标准步骤如下:
- 确定默认掩码位数 n:
192.168.10.0是 C 类地址,默认掩码/24,n = 24。 - 确定需要借的位数:需要 4 个子网,
2^k ≥ 4,取k = 2,则新掩码m = n + k = 26,即255.255.255.192。 - 计算每个子网的主机数:
2^(32-26) - 2 = 64 - 2 = 62台。 - 计算步长(block size):
256 - 192 = 64,即每个子网在最后一个字节上间隔 64。 - 列出各子网的网络地址:从 0 开始按步长递增 —— 0、64、128、192。
- 写出每个子网的广播地址与可用范围:广播地址 = 下一个网络地址 - 1。
| 子网 | 网络地址 | 可用 IP 范围 | 广播地址 | 掩码 |
|---|---|---|---|---|
| 1 | 192.168.10.0/26 |
192.168.10.1 ~ 192.168.10.62 |
192.168.10.63 |
255.255.255.192 |
| 2 | 192.168.10.64/26 |
192.168.10.65 ~ 192.168.10.126 |
192.168.10.127 |
255.255.255.192 |
| 3 | 192.168.10.128/26 |
192.168.10.129 ~ 192.168.10.190 |
192.168.10.191 |
255.255.255.192 |
| 4 | 192.168.10.192/26 |
192.168.10.193 ~ 192.168.10.254 |
192.168.10.255 |
255.255.255.192 |
反向题型(按主机数需求划分):若每个子网需容纳 30 台主机,则 2^h - 2 ≥ 30,得 h = 5,掩码 m = 32 - 5 = 27,即 255.255.255.224,步长 256 - 224 = 32,一个 C 类可划分出 2^(27-24) = 8 个子网。
5.7 示例一:192.168.1.0/25
即 192.168.1.0/255.255.255.128,C 类默认掩码为 /24。
- 子网数:
2^(25-24) = 2 - 每子网可用主机数:
2^(32-25) - 2 = 126
| 子网 | 网络号 | 可用 IP 范围 | 广播地址 |
|---|---|---|---|
| 1 | 192.168.1.0 |
192.168.1.1 ~ 192.168.1.126 |
192.168.1.127 |
| 2 | 192.168.1.128 |
192.168.1.129 ~ 192.168.1.254 |
192.168.1.255 |
5.8 示例二:172.16.0.0/18
即 172.16.0.0/255.255.192.0,B 类默认掩码为 /16。
- 子网数:
2^(18-16) = 4 - 每子网可用主机数:
2^(32-18) - 2 = 16382
| 子网 | 网络号 | 可用 IP 范围 | 广播地址 |
|---|---|---|---|
| 1 | 172.16.0.0 |
172.16.0.1 ~ 172.16.63.254 |
172.16.63.255 |
| 2 | 172.16.64.0 |
172.16.64.1 ~ 172.16.127.254 |
172.16.127.255 |
| 3 | 172.16.128.0 |
172.16.128.1 ~ 172.16.191.254 |
172.16.191.255 |
| 4 | 172.16.192.0 |
172.16.192.1 ~ 172.16.255.254 |
172.16.255.255 |
此例中借位发生在第三个字节,步长为 256 - 192 = 64,因此第三字节按 0、64、128、192 递增。
5.9 VLSM 变长子网掩码
VLSM(Variable Length Subnet Mask):在同一个大网段内,根据各子网实际主机数量的不同,使用不同长度的掩码划分,避免定长划分造成的浪费。
划分原则:先满足需求最大的子网,从大到小依次分配,且每个子网的起始地址必须对齐其块大小。
例题:把 192.168.20.0/24 分配给以下四个部门。
| 部门 | 需要主机数 |
|---|---|
| 办公区 | 100 |
| 研发区 | 50 |
| 测试区 | 20 |
| 路由器互联链路 | 2 |
计算过程:
- 办公区 100 台:
2^7 - 2 = 126 ≥ 100,取/25,块大小 128 →192.168.20.0/25(可用.1~.126,广播.127)。 - 研发区 50 台:
2^6 - 2 = 62 ≥ 50,取/26,块大小 64 → 从 128 开始 →192.168.20.128/26(可用.129~.190,广播.191)。 - 测试区 20 台:
2^5 - 2 = 30 ≥ 20,取/27,块大小 32 → 从 192 开始 →192.168.20.192/27(可用.193~.222,广播.223)。 - 互联链路 2 台:
2^2 - 2 = 2,取/30,块大小 4 → 从 224 开始 →192.168.20.224/30(可用.225~.226,广播.227)。
结果汇总:
| 部门 | 网段 | 掩码 | 可用范围 | 广播 |
|---|---|---|---|---|
| 办公区 | 192.168.20.0/25 |
255.255.255.128 | .1 ~ .126 |
.127 |
| 研发区 | 192.168.20.128/26 |
255.255.255.192 | .129 ~ .190 |
.191 |
| 测试区 | 192.168.20.192/27 |
255.255.255.224 | .193 ~ .222 |
.223 |
| 互联链路 | 192.168.20.224/30 |
255.255.255.252 | .225 ~ .226 |
.227 |
| 剩余可用 | 192.168.20.228 ~ 192.168.20.255 |
— | 可继续按需划分 | — |
点对点链路使用 /30 是经典做法(2 个可用地址),支持 RFC3021 的设备可用 /31 进一步节约。
5.10 超网与路由聚合
超网(Supernetting)/ 路由汇总(Route Summarization)/ CIDR 聚合:与子网划分相反,把多个连续的小网段合并成一个大网段,用一条路由条目代表多条,从而缩小路由表规模、加快查表、减少路由震荡传播。
聚合方法:找出这些网段网络地址的公共二进制前缀,前缀长度就是聚合后的掩码长度。
例题:聚合以下 4 个网段。
192.168.8.0/24 => 11000000.10101000.00001000.00000000
192.168.9.0/24 => 11000000.10101000.00001001.00000000
192.168.10.0/24 => 11000000.10101000.00001010.00000000
192.168.11.0/24 => 11000000.10101000.00001011.00000000
^^^^^^ 前 22 位完全相同
前两个字节 16 位相同,第三字节前 6 位 000010 相同,共 16 + 6 = 22 位 → 聚合结果 192.168.8.0/22,掩码 255.255.252.0,覆盖 192.168.8.0 ~ 192.168.11.255。
再例:10.1.0.0/16 ~ 10.1.3.0/16 类似地可聚合为 10.0.0.0/14(需网段连续且起始地址对齐块大小)。
聚合的前提条件:
- 被聚合的网段必须连续。
- 聚合后的网络地址必须能被块大小整除(对齐),例如
/22的块大小为 4,起始第三字节必须是 0、4、8、12…。 - 聚合可能会多覆盖(包含未实际使用的地址),需确保不会把不属于本方向的网段误吸收。
典型应用:企业出口路由汇总、BGP 路由宣告聚合、ip route add 10.0.0.0/8 via ... 一条路由覆盖所有内网。
5.11 常用掩码速查表
以 C 类网段(默认 /24)为基准的划分表:
| 前缀 | 点分十进制掩码 | 反掩码/通配符 | 块大小 | 子网数(相对 /24) | 每网段总地址 | 可用主机数 |
|---|---|---|---|---|---|---|
| /24 | 255.255.255.0 | 0.0.0.255 | 256 | 1 | 256 | 254 |
| /25 | 255.255.255.128 | 0.0.0.127 | 128 | 2 | 128 | 126 |
| /26 | 255.255.255.192 | 0.0.0.63 | 64 | 4 | 64 | 62 |
| /27 | 255.255.255.224 | 0.0.0.31 | 32 | 8 | 32 | 30 |
| /28 | 255.255.255.240 | 0.0.0.15 | 16 | 16 | 16 | 14 |
| /29 | 255.255.255.248 | 0.0.0.7 | 8 | 32 | 8 | 6 |
| /30 | 255.255.255.252 | 0.0.0.3 | 4 | 64 | 4 | 2 |
| /31 | 255.255.255.254 | 0.0.0.1 | 2 | 128 | 2 | 2(RFC3021 点对点) |
| /32 | 255.255.255.255 | 0.0.0.0 | 1 | 256 | 1 | 1(单主机) |
大网段速查:
| 前缀 | 掩码 | 可用主机数 | 相当于 |
|---|---|---|---|
| /8 | 255.0.0.0 | 16777214 | 1 个 A 类 |
| /12 | 255.240.0.0 | 1048574 | 16 个 B 类 |
| /16 | 255.255.0.0 | 65534 | 1 个 B 类 / 256 个 C 类 |
| /18 | 255.255.192.0 | 16382 | 64 个 C 类 |
| /20 | 255.255.240.0 | 4094 | 16 个 C 类 |
| /22 | 255.255.252.0 | 1022 | 4 个 C 类 |
| /23 | 255.255.254.0 | 510 | 2 个 C 类 |
Linux 下可用 ipcalc 快速验证:
ipcalc -b -m -n 192.168.10.130/26 # CentOS 7 自带(iputils/initscripts 提供)
ipcalc -a -b -n -m -p 192.168.10.130/26
sipcalc 192.168.10.0/26 # 功能更强,需额外安装
六、网关与路由
6.1 路由的作用
路由的作用是使两台处于不同网段的计算机能够相互访问。
示意图:
内网 IP:192.168.1.0/24 192.168.1.0/24
张三家 李四家
外网 IP: 71.1.1.1/8 81.1.1.1/8
6.2 默认网关的作用
默认网关(Default Gateway)是本网段通往其他所有网段的"出口",通常是本网段路由器(或三层交换机)在该网段上的接口地址。
- 主机发送数据前,先用自己的掩码判断目标 IP 是否与自己同网段:
- 同网段:通过 ARP 拿到对方 MAC,直接二层转发。
- 不同网段:把数据包的目的 IP 保持不变,但目的 MAC 填写默认网关的 MAC,交给网关代为转发。
- 因此默认网关必须与本机 IP 在同一网段,否则不可达(除非配置了特殊的 onlink 路由)。
- 在路由表中,默认网关体现为目标
0.0.0.0/0的一条默认路由。 - 一台主机通常只应有一个默认网关;配置多个默认网关会导致回包路径混乱(多网卡场景应使用策略路由或明细静态路由解决)。
上互联网的三要素:
- IP 地址
- Gateway(网关)
- DNS
使用 ping 检查网关连通情况:
ping -c 1 192.168.0.1
外网 IP ping 不通时,先检查路由表,再检查网关配置。
网卡配置文件中
GATEWAY=、DNS1=等永久配置项详见 07-02-网卡配置与远程管理.md
6.3 查看路由表
在 Linux 下使用 route -n 查看系统路由表:
route -n
输出示例:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
路由表字段说明:
| 字段 | 含义 |
|---|---|
| Destination | 目标网段 |
| Gateway | 网关地址(0.0.0.0 表示直连,无需网关) |
| Genmask | 子网掩码 |
| Flags | 路由标志(U 表示启用,G 表示网关路由) |
| Metric | 度量值/开销,值越小越优先 |
| Ref | 引用次数(Linux 未使用,恒为 0) |
| Use | 查找该路由的次数 |
| Iface | 出站网卡 |
Flags 常见取值:
| 标志 | 含义 |
|---|---|
U |
Up,该路由有效、已启用 |
G |
Gateway,需要经过网关(间接路由);没有 G 表示目标直连 |
H |
Host,目标是一台主机(/32),而不是一个网段 |
D |
由 ICMP 重定向动态生成 |
M |
被 ICMP 重定向修改过 |
! |
拒绝路由(reject) |
上例的三行含义:
192.168.1.0/24直连在eth1,无需网关(Gateway 为0.0.0.0)。169.254.0.0/16链路本地路由,Metric 较大(1002),一般由 DHCP 失败或系统自动添加。0.0.0.0/0默认路由,凡是前两条都匹配不上的目标,都交给网关192.168.1.1,从eth1发出(标志UG)。
查看带 UG 标识的行里是否有网关 IP,即可判断默认网关是否配置成功。
使用 ip route(推荐,iproute2 工具集):
ip route show
ip r # 简写
ip route get 8.8.8.8 # 查询内核实际会用哪条路由、走哪个网卡、源地址是什么
ip route show table all # 查看所有路由表(含 local/main/default)
输出示例与解读:
default via 192.168.1.1 dev eth0 proto static metric 100
169.254.0.0/16 dev eth0 scope link metric 1002
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.50 metric 100
| 字段 | 含义 |
|---|---|
default via X |
默认路由,下一跳为 X,等价于 0.0.0.0/0 |
dev eth0 |
出接口 |
proto kernel |
该路由由内核在配置 IP 时自动生成(直连路由);static 为手工/配置文件添加;dhcp 由 DHCP 下发 |
scope link |
目标在本链路上可直接到达;scope host 为本机;global 为全局 |
src 192.168.1.50 |
走此路由时默认使用的源地址 |
metric |
优先级,越小越优先 |
route -n 属于 net-tools(ifconfig/netstat/arp 同族),CentOS 7 起默认可能未安装,推荐统一使用 iproute2 的 ip/ss 系列命令。
6.4 路由查找规则与最长前缀匹配
访问一个 IP 时,系统按以下顺序查找路由表:
- 路由表中若有目标网段的条目,则从该条目指定的网卡发出。
- 若没有匹配的网段条目,则查找默认路由(即网关,目标为
0.0.0.0/0的那条),把数据包交给网关处理。 - 若连默认路由也没有,则报告网络不可达(
Network is unreachable),数据包被丢弃。
路由选择原则(优先级由高到低):
- 最长前缀匹配(Longest Prefix Match):多条路由都能匹配目标 IP 时,掩码最长(最精确)的那条胜出,与书写顺序无关。
- 路由协议优先级 / 管理距离:同样精确度下,按来源可信度选择(直连 > 静态 > 动态路由 OSPF/RIP)。
- 度量值 Metric:同来源、同精确度时,Metric 小者优先。
- 若上述完全相同,则形成等价多路径(ECMP),进行负载分担。
最长前缀匹配示例:路由表中有
0.0.0.0/0 via 192.168.1.1 # 默认路由
10.0.0.0/8 via 192.168.1.2
10.1.0.0/16 via 192.168.1.3
10.1.1.0/24 via 192.168.1.4
10.1.1.100/32 via 192.168.1.5
访问不同目标时的选择:
| 目标 IP | 命中路由 | 下一跳 | 原因 |
|---|---|---|---|
10.1.1.100 |
10.1.1.100/32 |
192.168.1.5 | 32 位最精确(主机路由) |
10.1.1.200 |
10.1.1.0/24 |
192.168.1.4 | 24 位比 16、8 位更精确 |
10.1.9.5 |
10.1.0.0/16 |
192.168.1.3 | 不在 /24 内,退到 /16 |
10.9.9.9 |
10.0.0.0/8 |
192.168.1.2 | 只有 /8 匹配 |
8.8.8.8 |
0.0.0.0/0 |
192.168.1.1 | 都不匹配,走默认路由 |
可用 ip route get 直接验证内核的选择结果:
ip route get 10.1.1.200
# 输出示例:10.1.1.200 via 192.168.1.4 dev eth0 src 192.168.1.50
6.5 静态路由的添加与删除
iproute2 方式(推荐):
# 添加默认路由 / 删除默认路由
sudo ip r add default via 192.168.0.1 # 添加默认路由
sudo ip r del default # 删除默认路由
sudo ip route add default via 192.168.1.1 dev eth0 metric 100
# 添加到某网段的静态路由(下一跳网关)
sudo ip route add 10.1.1.0/24 via 192.168.1.254
sudo ip route add 172.16.0.0/16 via 192.168.1.254 dev eth0
# 添加主机路由(/32)
sudo ip route add 10.8.8.8/32 via 192.168.1.254
# 添加直连(无网关)路由,走某个接口
sudo ip route add 10.2.2.0/24 dev eth1
# 修改与替换
sudo ip route change 10.1.1.0/24 via 192.168.1.253
sudo ip route replace default via 192.168.1.2
# 删除
sudo ip route del 10.1.1.0/24
sudo ip route del 10.1.1.0/24 via 192.168.1.254
# 黑洞路由(丢弃到某网段的流量)
sudo ip route add blackhole 192.0.2.0/24
net-tools(route)方式:
route add -net 10.1.1.0 netmask 255.255.255.0 gw 192.168.1.254 # 添加网段路由
route add -net 10.1.1.0/24 dev eth1 # 走指定网卡
route add -host 10.8.8.8 gw 192.168.1.254 # 添加主机路由
route add default gw 192.168.1.1 # 添加默认网关
route del -net 10.1.1.0 netmask 255.255.255.0 gw 192.168.1.254 # 删除网段路由
route del default gw 192.168.1.1 # 删除默认网关
以上命令重启网络或系统后失效。永久保存静态路由(CentOS 7):
# 方式一:写入网卡对应的 route-<网卡名> 文件
cat > /etc/sysconfig/network-scripts/route-eth0 <<'EOF'
10.1.1.0/24 via 192.168.1.254 dev eth0
172.16.0.0/16 via 192.168.1.254 dev eth0
EOF
# 方式二:旧式三行写法
# ADDRESS0=10.1.1.0
# NETMASK0=255.255.255.0
# GATEWAY0=192.168.1.254
# 生效
systemctl restart network
小实验(静态路由验证思路):
ip route get 10.1.1.5 # 添加前:看走的是默认路由
ip route add 10.1.1.0/24 via 192.168.1.254
ip route get 10.1.1.5 # 添加后:应改为经 192.168.1.254
traceroute -n 10.1.1.5 # 观察第一跳是否变化
ip route del 10.1.1.0/24 # 清理实验环境
6.6 Linux 开启路由转发
Linux 主机默认不转发不属于自己的数据包。要让它充当路由器(或做 NAT 网关、容器/虚拟机宿主机),必须开启 IP 转发。
临时开启(重启失效):
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
查看当前状态(0 关闭,1 开启):
cat /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward
永久开启:编辑 /etc/sysctl.conf(或在 /etc/sysctl.d/ 下新建 .conf 文件)加入:
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
然后使其生效:
sysctl -p
sysctl --system # 加载 /etc/sysctl.d/ 下所有配置
作为路由器还需注意:
- 两侧网段的主机要把这台 Linux 的对应接口 IP 设为自己的网关。
- 防火墙
FORWARD链必须允许转发:
iptables -P FORWARD ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
- 相关内核参数:
net.ipv4.conf.all.rp_filter(反向路径过滤,不对称路由时可能丢包)、net.ipv4.conf.all.send_redirects。
6.7 NAT 与 SNAT / DNAT
NAT(Network Address Translation,网络地址转换):在数据包经过网关时修改其源或目的 IP(及端口),使私网地址能够访问公网、或把公网请求引入内网服务器。它是缓解 IPv4 地址枯竭的核心技术,同时隐藏内网结构、提供一定安全性。
| 类型 | 修改内容 | 发生方向 | 典型用途 |
|---|---|---|---|
| SNAT(Source NAT) | 修改源 IP | 出方向(内网 → 公网) | 让内网多台主机共享公网 IP 上网 |
| MASQUERADE(伪装) | SNAT 的特例,源 IP 自动取出接口当前地址 | 出方向 | 出口 IP 动态获取(ADSL/DHCP)时使用 |
| DNAT(Destination NAT) | 修改目的 IP | 入方向(公网 → 内网) | 端口映射/发布内网服务器,如把公网 80 映射到内网 Web 服务器 |
| PAT / NAPT(端口多路复用) | 同时修改 IP 与端口 | 双向 | 多台内网主机共用一个公网 IP,靠端口区分会话;家用路由器即此方式 |
| 全锥/受限锥形等类型 | — | — | 描述 NAT 对外部入向包的宽松程度,影响 P2P 穿透 |
工作过程(SNAT 示例):内网 192.168.1.10:52000 访问 8.8.8.8:80,网关公网地址 1.1.1.1。
出方向:192.168.1.10:52000 -> 8.8.8.8:80
经网关 SNAT 改写为 1.1.1.1:61000 -> 8.8.8.8:80,并在连接跟踪表中记录映射
入方向:8.8.8.8:80 -> 1.1.1.1:61000
网关查连接跟踪表,反向还原为 8.8.8.8:80 -> 192.168.1.10:52000
iptables 配置示例(需先开启 ip_forward):
# SNAT:内网 192.168.1.0/24 出公网,源地址改为固定公网 IP 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
# MASQUERADE:公网 IP 动态时使用
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT:把访问网关 1.1.1.1:80 的请求转到内网 192.168.1.20:8080
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.20:8080
# 查看 NAT 规则与连接跟踪
iptables -t nat -nvL
conntrack -L
cat /proc/net/nf_conntrack | head
firewalld 方式:
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --permanent --zone=public \
--add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.20
firewall-cmd --reload
注意事项:
- SNAT 在
POSTROUTING链(路由后),DNAT 在PREROUTING链(路由前),顺序不能颠倒。 - NAT 依赖连接跟踪表(conntrack),高并发场景需关注
nf_conntrack_max是否被打满(日志出现nf_conntrack: table full, dropping packet)。 - NAT 会破坏端到端透明性,对 FTP 主动模式、SIP、IPsec 等协议需要专门的 ALG 模块(如
nf_nat_ftp)。 - 服务端看到的来源 IP 是 NAT 后的地址,Web 场景需依赖
X-Forwarded-For获取真实客户端 IP。
七、网络排错的分层思路
7.1 按 OSI 层次自下而上排查
网络故障排查的通用原则:先物理后逻辑,先本地后远端,先分层定位再深入。
| 层次 | 检查内容 | 常用手段 |
|---|---|---|
| 物理层 | 网线是否插好、水晶头是否松动、网口指示灯是否闪烁、光模块与光纤、交换机是否加电、网卡是否被禁用 | 看指示灯、mii-tool、ethtool eth0(Link detected / Speed / Duplex)、换线换口 |
| 数据链路层 | 网卡状态是否 UP、MAC 地址是否正常、ARP 能否解析网关、VLAN 与端口配置、双工/速率协商、是否有大量错误包 | ip link show、ip a s、ip neigh show、arping、ethtool -S eth0(错误计数) |
| 网络层 | IP/掩码是否正确、是否与网关同网段、路由表与默认网关是否正确、能否 ping 通网关与公网 IP、TTL 与路径 | ip a、ip r、ping、traceroute、mtr、ip route get |
| 传输层 | 端口是否监听、端口是否被防火墙拦截、连接状态是否异常(大量 TIME_WAIT/CLOSE_WAIT/SYN_RECV) | ss -tuln、telnet ip port、nc -zv ip port、netstat -ant、iptables -nvL |
| 应用层 | DNS 解析是否正常、服务进程是否存活、配置与权限、证书是否过期、应用日志 | ping 域名、dig/nslookup/host、curl -v、systemctl status、查看服务日志、tcpdump 抓包分析 |
7.2 六步网络故障排查法(实操流程)
遇到网络问题,按以下顺序逐步排查:
- 检查物理网线
- 查看物理网口的黄灯是否闪烁。不闪烁则检查物理网线是否正常;闪烁则继续。
- 执行
sudo mii-tool 网卡设备名,显示link ok代表网卡连接正常。
- 查看右上角网络连接状态,确认有线网络是否已连接。
- 查看当前网卡是否为停用状态:
ip a s查看state是UP还是DOWN;若为DOWN,执行sudo ip l set enp0s25 up。 - 查看当前网卡是否有 IP:
ip a s查看;没有则临时获取(dhclient或添加临时 IP),也可通过ifcfg-*永久配置。 - 检查网关(路由器)连接情况:
ping -c 1 网关IP;外网 IP ping 不通先查路由表,再查网关配置。 - 检查 DNS 解析情况:
ping -c 3 www.baidu.com;域名 ping 不通但外网 IP 能通则为 DNS 问题。
对应的常用命令:
sudo mii-tool enp0s25 # 检查物理链路,link ok 表示物理连接正常
ip a s # 查看网卡状态(UP/DOWN)与 IP
sudo ip l set enp0s25 up # 启用网卡
sudo dhclient enp0s25 # 动态获取 IP
route -n # 查看路由表,确认 UG 行有网关
ping -c 1 192.168.0.1 # 测网关
ping -c 3 www.baidu.com # 测 DNS 与外网
mii-tool不太可靠:报告link ok通常确实 OK,但网线接触不好时也可能报link ok;报no link则一般是网线没接好。
网卡查看与启停、临时/永久配置 IP(
ifcfg-*)、DNS 与hosts、主机名设置等配置细节详见 07-02-网卡配置与远程管理.md
7.3 常用排错工具及其定位用途
| 工具 | 主要用途 | 定位的层次 | 示例 |
|---|---|---|---|
ping |
测试目标可达性、丢包率、往返时延(RTT);基于 ICMP | 网络层 | ping -c 4 -W 1 192.168.1.1、ping -s 1472 -M do 8.8.8.8(探 MTU)、ping -I eth1 8.8.8.8(指定出口) |
traceroute |
逐跳显示数据包经过的路由器,定位在哪一跳开始不通或延迟突增;默认 UDP,-I 用 ICMP,-T 用 TCP(可穿透部分防火墙) |
网络层 | traceroute -n 8.8.8.8、traceroute -T -p 443 www.baidu.com |
tracepath |
与 traceroute 类似,无需 root,还能发现路径 MTU | 网络层 | tracepath 8.8.8.8 |
mtr |
traceroute + ping 的结合,持续探测并实时统计每跳丢包率与延迟,最适合判断中间某跳丢包/抖动 | 网络层 | mtr -n 8.8.8.8、mtr -r -c 100 8.8.8.8(生成报告) |
telnet |
测试目标 TCP 端口是否开放(能连上即端口通),也可手工发 HTTP 请求 | 传输层/应用层 | telnet 192.168.1.20 3306 |
nc(netcat) |
端口探测、点对点传输、监听端口做服务端模拟;比 telnet 更灵活,可测 UDP | 传输层 | nc -zv 192.168.1.20 80、nc -zvu 192.168.1.20 53(UDP)、nc -l 8000(监听) |
ss |
查看套接字:监听端口、连接状态统计、进程归属;比 netstat 快得多(读 netlink) | 传输层 | ss -tuln(监听端口)、ss -tanp、ss -s(汇总)、ss -tan state time-wait |
netstat |
传统套接字与路由查看工具(net-tools) | 传输层/网络层 | netstat -tuln、netstat -rn(路由表)、netstat -i(接口统计与错误包)、netstat -ant \| awk '/^tcp/{S[$NF]++} END{for(a in S) print a, S[a]}' |
tcpdump |
抓包,最终定位手段:确认包到底有没有发出去、有没有收到、被谁 RST、握手停在哪一步 | 全部层次 | tcpdump -i eth0 -nn host 192.168.1.20 and port 80、tcpdump -i any -nn tcp port 3306 -c 100 -w /tmp/a.pcap(用 Wireshark 分析) |
dig / nslookup / host |
DNS 解析排查:解析结果、使用的 DNS、解析耗时、记录类型 | 应用层 | dig www.baidu.com +short、dig @223.5.5.5 example.com A、dig +trace example.com、nslookup www.baidu.com |
curl |
应用层验证:HTTP 状态码、响应头、TLS 握手、各阶段耗时 | 应用层 | curl -I http://ip/、curl -v https://host/、curl -o /dev/null -s -w '%{time_connect} %{time_total}\n' url |
ethtool |
网卡物理层信息:链路是否 detected、协商速率与双工、驱动、错误统计 | 物理层/链路层 | ethtool eth0、ethtool -S eth0 |
ip |
地址、链路、路由、邻居表的统一管理与查看 | 链路层/网络层 | ip a、ip r、ip neigh、ip -s link(收发与错误统计) |
iftop / nload / iotop |
实时流量与带宽占用,定位"谁占满了带宽" | — | iftop -i eth0 -nNP |
nmap |
批量端口扫描与主机发现(需授权使用) | 传输层 | nmap -sT -p 1-1000 192.168.1.20、nmap -sn 192.168.1.0/24 |
iperf3 |
带宽与吞吐量测试,验证链路质量 | 传输层 | 服务端 iperf3 -s;客户端 iperf3 -c 服务端IP -t 30 |
典型排错决策树:
ping 网关不通 ──> 物理层/链路层问题:查网线、网卡 state、IP 与掩码是否同网段、ARP(ip neigh)
|
通
v
ping 公网 IP(如 223.5.5.5) 不通 ──> 网络层:查默认路由 ip r、网关本身、运营商链路,traceroute/mtr 定位断点
|
通
v
ping 域名不通 ──> 应用层 DNS:查 /etc/resolv.conf、dig @其他DNS 验证、/etc/hosts 是否有错误条目
|
通
v
telnet/nc 目标端口不通 ──> 传输层:目标服务是否监听(ss -tuln)、两端防火墙(iptables -nvL / 云安全组)、SELinux
|
通
v
端口通但业务异常 ──> 应用层:curl -v 看状态码、查服务日志、tcpdump 抓包看 RST/重传/超时
八、练习
8.1 二进制与十进制转换
题目: 将以下二进制转换为十进制。
11000000.10101000.00000001.01100100
答案: 192.168.1.100
计算过程:
11000000 = 128+64 = 192
10101000 = 128+32+8 = 168
00000001 = 1 = 1
01100100 = 64+32+4 = 100
8.2 判断是否同网段(一)
题目: 10.1.1.35/8 与 10.1.1.36/24 能否互通?
答案: 不能。10.1.1.35/8 的网络号是 10.0.0.0,10.1.1.36/24 的网络号是 10.1.1.0,两者网络号不同,不在同一网段,必须经过路由才能通信。详细计算过程见本文 5.4 节。
8.3 判断是否同网段(二)
题目: 判断 10.1.0.35/24 和 10.1.1.36/16 能否互通?(提示:分别计算网络号后比较。)
答案与计算过程:
第一个 IP 10.1.0.35/24(掩码 255.255.255.0):
00001010.00000001.00000000.00100011 (10.1.0.35)
& 11111111.11111111.11111111.00000000 (255.255.255.0)
----------------------------------------
00001010.00000001.00000000.00000000 网络号:10.1.0.0/24
- 网络号:
10.1.0.0,广播地址:10.1.0.255,可用范围:10.1.0.1~10.1.0.254
第二个 IP 10.1.1.36/16(掩码 255.255.0.0):
00001010.00000001.00000001.00100100 (10.1.1.36)
& 11111111.11111111.00000000.00000000 (255.255.0.0)
----------------------------------------
00001010.00000001.00000000.00000000 网络号:10.1.0.0/16
- 网络号:
10.1.0.0,广播地址:10.1.255.255,可用范围:10.1.0.1~10.1.255.254
结论:不能正常互通。 虽然两者算出的网络号数值都是 10.1.0.0,但掩码不同,网段范围不同,双方的判断是不对称的:
- 站在
10.1.0.35/24的角度:自己的网段是10.1.0.0/24(10.1.0.1~10.1.0.254),目标10.1.1.36不在其中,它会认为对方是外网段,必须把包交给默认网关;若没有配置正确的网关或网关没有到达对方的路由,则直接不可达。 - 站在
10.1.1.36/16的角度:自己的网段是10.1.0.0/16(10.1.0.1~10.1.255.254),目标10.1.0.35在其中,它会认为对方同网段,直接发 ARP 二层通信。
这种"一方认为同网段、另一方认为跨网段"的配置属于典型的掩码配置错误,结果是通信单向或完全失败。结论:两个 IP 要能直接通信,必须 IP 与掩码都配置一致,使双方算出的网段完全相同。
8.4 计算网络号与广播地址(PPP1)
题目: 计算以下地址的网络号与广播地址。
172.16.33.44/16172.16.33.44/18192.168.253.55/8192.168.253.55/1510.192.54.128/26
方法:将 IP 转为二进制,掩码为 1 的位保留、为 0 的位置 0 得网络号,为 0 的位置 1 得广播地址。参考本文"子网掩码与网络号"(5.1 节)中的示范。
答案与计算过程:
(1)172.16.33.44/16,掩码 255.255.0.0
IP 10101100.00010000.00100001.00101100
掩码 11111111.11111111.00000000.00000000
网络号 10101100.00010000.00000000.00000000 => 172.16.0.0
广播 10101100.00010000.11111111.11111111 => 172.16.255.255
- 网络号:
172.16.0.0,广播地址:172.16.255.255 - 可用范围:
172.16.0.1~172.16.255.254,可用主机数:2^16 - 2 = 65534
(2)172.16.33.44/18,掩码 255.255.192.0
第三字节 33 = 00100001,/18 只保留其前 2 位 00,其余置 0 得 0,置 1 得 63。
IP 10101100.00010000.00100001.00101100
掩码 11111111.11111111.11000000.00000000
网络号 10101100.00010000.00000000.00000000 => 172.16.0.0
广播 10101100.00010000.00111111.11111111 => 172.16.63.255
- 网络号:
172.16.0.0,广播地址:172.16.63.255 - 可用范围:
172.16.0.1~172.16.63.254,可用主机数:2^14 - 2 = 16382
(3)192.168.253.55/8,掩码 255.0.0.0
IP 11000000.10101000.11111101.00110111
掩码 11111111.00000000.00000000.00000000
网络号 11000000.00000000.00000000.00000000 => 192.0.0.0
广播 11000000.11111111.11111111.11111111 => 192.255.255.255
- 网络号:
192.0.0.0,广播地址:192.255.255.255 - 可用范围:
192.0.0.1~192.255.255.254,可用主机数:2^24 - 2 = 16777214 - 注意:
192.168.253.55本身是 C 类地址,这里人为使用/8掩码,属于练习换算的题目,说明掩码由配置决定,与地址的传统类别无关。
(4)192.168.253.55/15,掩码 255.254.0.0
第二字节 168 = 10101000,/15 保留其前 7 位 1010100,最后一位置 0 得 10101000 = 168,置 1 得 10101001 = 169。
IP 11000000.10101000.11111101.00110111
掩码 11111111.11111110.00000000.00000000
网络号 11000000.10101000.00000000.00000000 => 192.168.0.0
广播 11000000.10101001.11111111.11111111 => 192.169.255.255
- 网络号:
192.168.0.0,广播地址:192.169.255.255 - 可用范围:
192.168.0.1~192.169.255.254,可用主机数:2^17 - 2 = 131070
(5)10.192.54.128/26,掩码 255.255.255.192
第四字节 128 = 10000000,/26 保留其前 2 位 10,其余置 0 得 10000000 = 128,置 1 得 10111111 = 191。
IP 00001010.11000000.00110110.10000000
掩码 11111111.11111111.11111111.11000000
网络号 00001010.11000000.00110110.10000000 => 10.192.54.128
广播 00001010.11000000.00110110.10111111 => 10.192.54.191
- 网络号:
10.192.54.128,广播地址:10.192.54.191 - 可用范围:
10.192.54.129~10.192.54.190,可用主机数:2^6 - 2 = 62 - 注意本题中
10.192.54.128恰好就是网络地址本身,不能分配给主机使用。
8.5 子网划分计算题
题目: 请问 10.0.0.0/11 划分了多少个子网?(提示:A 类默认掩码为 /8。)
答案与计算过程:
- A 类默认掩码位数
n = 8,划分后m = 11,即向主机位借了11 - 8 = 3位。 - 子网数:
2^(m-n) = 2^(11-8) = 2^3 = 8个子网。 - 每个子网可用主机数:
2^(32-m) - 2 = 2^21 - 2 = 2097152 - 2 = 2097150台。 - 掩码:
/11 = 11111111.11100000.00000000.00000000 = 255.224.0.0 - 步长:
256 - 224 = 32,即第二字节按 0、32、64、96、128、160、192、224 递增。
8 个子网明细:
| 子网 | 网络地址 | 可用 IP 范围 | 广播地址 |
|---|---|---|---|
| 1 | 10.0.0.0/11 |
10.0.0.1 ~ 10.31.255.254 |
10.31.255.255 |
| 2 | 10.32.0.0/11 |
10.32.0.1 ~ 10.63.255.254 |
10.63.255.255 |
| 3 | 10.64.0.0/11 |
10.64.0.1 ~ 10.95.255.254 |
10.95.255.255 |
| 4 | 10.96.0.0/11 |
10.96.0.1 ~ 10.127.255.254 |
10.127.255.255 |
| 5 | 10.128.0.0/11 |
10.128.0.1 ~ 10.159.255.254 |
10.159.255.255 |
| 6 | 10.160.0.0/11 |
10.160.0.1 ~ 10.191.255.254 |
10.191.255.255 |
| 7 | 10.192.0.0/11 |
10.192.0.1 ~ 10.223.255.254 |
10.223.255.255 |
| 8 | 10.224.0.0/11 |
10.224.0.1 ~ 10.255.255.254 |
10.255.255.255 |
验证命令:
echo $[2**(11-8)] # 8
echo $[2**(32-11)-2] # 2097150
8.6 补充练习(自测)
-
192.168.1.0/24要划分给 6 个部门,每个部门至少 25 台主机,应使用什么掩码?各子网网段是什么?- 答案: 需要 6 个子网,
2^3 = 8 ≥ 6,借 3 位得/27(255.255.255.224);每子网可用2^5 - 2 = 30 ≥ 25,满足要求。步长 32,子网为192.168.1.0/27、.32/27、.64/27、.96/27、.128/27、.160/27、.192/27、.224/27,取前 6 个即可。
- 答案: 需要 6 个子网,
-
172.16.20.200/28属于哪个网段?它的广播地址与可用范围是什么?- 答案:
/28掩码255.255.255.240,步长 16。200 ÷ 16 = 12.5,落在第 13 个块192~207。网络地址172.16.20.192/28,广播地址172.16.20.207,可用范围172.16.20.193~172.16.20.206(14 台)。
- 答案:
-
把
10.10.0.0/24、10.10.1.0/24、10.10.2.0/24、10.10.3.0/24聚合成一条路由。- 答案: 第三字节 0、1、2、3 的二进制前 6 位均为
000000,公共前缀16 + 6 = 22位,聚合为10.10.0.0/22(掩码255.255.252.0)。
- 答案: 第三字节 0、1、2、3 的二进制前 6 位均为
-
一条点对点专线链路,最省地址的掩码是什么?可用地址几个?
- 答案: 传统用
/30(255.255.255.252),2 个可用地址;支持 RFC3021 的设备可用/31,2 个地址均可用,最省。
- 答案: 传统用
-
某主机 IP 为
192.168.5.130/25,网关配置为192.168.5.1,能否正常上网?为什么?- 答案: 不能。
/25使该主机所在网段为192.168.5.128/25(范围.129~.254),而网关192.168.5.1属于192.168.5.0/25网段,与主机不在同一网段,主机无法通过 ARP 找到网关,默认路由不可用。应把网关改为192.168.5.129(或调整主机掩码为/24)。
- 答案: 不能。
-
服务器上出现数百个
CLOSE_WAIT且持续不减,最可能的原因是什么?如何排查?- 答案: 应用程序收到对端
FIN后没有调用close()释放连接(代码 BUG 或连接池泄漏),不是内核参数问题。用ss -tanp state close-wait找到对应进程与对端,再结合lsof -p PID与应用代码/日志排查未关闭连接的分支。
- 答案: 应用程序收到对端
8.7 其他配套练习
以下练习属于网卡配置、远程管理与网络文件共享的实操内容,题目与答案在对应文档中完整给出:
-
操练
mii-tool(PPP2)、修改主机名(PPP3)、使用 SSH 登录服务器(PPP4)、操练scp(PPP5)、使用nc传输文件和文件夹(PPP6)、rsync 应用(PPP7)、使用公钥登录 SSH 服务器(PPP8)。详见 07-02-网卡配置与远程管理.md
-
练习 NFS(PPP9):两人配合搭建 NFS 服务(共享端配置
/etc/exports,访问端showmount/mount)。详见 09-02-NFS与autofs.md
此处评论已关闭