本章从系统讲解 Linux 网络——IP 地址基础、网络配置命令(ifconfig / ip / route / ss / nmcli)、配置文件、TCP/IP 协议原理(三次握手、四次挥手、报文结构、状态转移)等。原文所有内容完整保留,同时补充了 Mermaid 图、对比表、生活例子和概念解释。


📌 本章核心概念一览

概念 一句话理解
IP 地址 网络上主机的唯一标识,由网络位+主机位组成,配合掩码确定"同网段"。
子网掩码 用二进制 1 标出"网络位",与 IP 做 AND 运算得到网络地址。
网关 本网段出口设备,跨网段通信时数据包先发到网关,由它转发。
路由 路由表记录"目标网段 → 下一跳/出口",选路就是查表决定往哪发。
DNS 把域名解析成 IP,Linux 最多 3 个 DNS,只有主 DNS 不可达才用备用。
TCP 面向连接、可靠、字节流;先握手建连,传完再挥手断开。
UDP 无连接、不保证可靠、按数据报收发;简单快速,适合实时或查询。
三次握手 双方互换 SYN/ACK,确认"都能发、都能收",才进入数据传输。
四次挥手 一方说 FIN,对方先 ACK 再发自己的 FIN,最后再 ACK,保证双向都关干净。

📑 目录


一、网络基础:IP 地址、子网掩码与路由 🏠

1.1 什么是 IP 地址?

概念定义IP 地址(Internet Protocol Address)是分配给网络中每台主机(或网卡)的逻辑地址,用来在网络上唯一标识该主机,使数据包能够被正确投递。IPv4 地址长度为 32 位二进制,通常写成 4 段十进制(点分十进制),每段 0–255。

生活例子:IP 地址就像你家的门牌号。快递员(数据包)根据门牌号才能找到你家(目标主机)。

结构要点

  • 二进制形式:32 位,例如 11011101.00100010.00010111.00001100
  • 点分十进制:每 8 位一段,写成 221.34.23.12
  • 网络位 + 主机位:前若干位表示"哪条街"(网络),后若干位表示"哪一户"(主机);具体划分由子网掩码决定。
示例:221.34.23.12
11011101 . 00100010 . 00010111 . 00001100
   221   .    34    .    23    .    12

1.2 IP 地址分类(A/B/C/D/E)

概念定义:早期 IPv4 按第一字节的高位把地址划成 A、B、C、D、E 五类,用于区分"网络位占多少、主机位占多少",从而确定默认掩码和每网段可容纳主机数。现在实际组网多用 CIDR(无类编址),不再严格按类,但理解分类有助于看默认掩码和网段范围。

🌐 IPv4 地址

A 类
1.x.x.x ~ 126.x.x.x
大型网络

B 类
128.x.x.x ~ 191.x.x.x
中型网络

C 类
192.x.x.x ~ 223.x.x.x
小型网络

D 类
224 ~ 239
组播

E 类
240 ~ 255
实验保留

类别 首位模式 第一字节范围 默认掩码 网络数 每网络主机数 用途
A 类 0xxxxxxx 1–126 255.0.0.0(/8) 126(127 回环) 2^24 - 2 = 16,777,214 ISP、大型企业
B 类 10xxxxxx 128–191 255.255.0.0(/16) 2^14 = 16,384 2^16 - 2 = 65,534 中型企业、学校
C 类 110xxxxx 192–223 255.255.255.0(/24) 2^21 = 2,097,152 2^8 - 2 = 254 小公司、家庭
D 类 1110xxxx 224–239 组播(多播)
E 类 1111xxxx 240–255 实验 / 保留

⚠️ 为什么减 2:主机位全 0 = 网络地址(这条街本身),主机位全 1 = 广播地址(给这条街所有人喊话)。

⚠️ 127.0.0.1 是本机回环测试地址(localhost),不属于任何类。

1.3 私有地址(内网地址)

生活例子:私有地址像小区内部门牌——小区内互相认识,但快递到了小区门口要通过保安亭(NAT 网关)转成公网地址才能寄出去。

类别 私有地址范围 CIDR 表示 常见场景
A 类 10.0.0.0 – 10.255.255.255 10.0.0.0/8 大公司内网、云 VPC
B 类 172.16.0.0 – 172.31.255.255 172.16.0.0/12 Docker 默认网络
C 类 192.168.0.0 – 192.168.255.255 192.168.0.0/16 家庭路由器、办公室

其他特殊地址:

  • 169.254.0.0/16:保留地址(DHCP 获取失败时自动分配)
  • 127.0.0.0/8:回环地址

1.4 子网掩码与 CIDR

概念定义子网掩码(Netmask)是一串与 IP 等长的二进制数,其中为 1 的位对应 IP 的网络位,为 0 的位对应主机位。将 IP 与掩码按位做 AND 运算,得到的就是网络地址(网段本身);主机位全 0 表示网络地址,主机位全 1 表示广播地址,因此同一网段内可用主机数要减 2。

生活例子:子网掩码就像一把"尺子",标出 IP 中哪一段是街道号、哪一段是门牌号

计算示例

IP:      192.168.1.100   = 11000000.10101000.00000001.01100100
MASK:    255.255.255.0   = 11111111.11111111.11111111.00000000
                            ←— 网络位(24 位)—→ ←— 主机位(8 位)—→

IP AND MASK = 网络地址    = 192.168.1.0

CIDR 表示法:用"斜杠 + 网络位个数"简写掩码,如 192.168.1.100/24 表示前 24 位为网络位,等价于掩码 255.255.255.0

1.5 路由与网关

概念定义

  • 网关(Gateway):本网段的"出口"设备(通常是路由器接口)。当目标 IP 与自己在不同网段时,主机不会直接发往目标,而是把数据包发给网关,由网关再查表转发(即"下一跳")。
  • 路由(Routing):根据路由表决定"发往某目标的数据包应从哪个接口、经哪个下一跳发出"的过程。路由表里每条记录包含:目标网段、掩码、下一跳(网关)、出口网卡等。

生活例子网关像小区大门——出小区的包裹都先到大门。路由像快递分拣表——查表决定"这个地址的包裹该走哪个大门、下一站送哪"。

路由条目的三种类型

类型 目标 含义 生活例子
主机路由 单个 IP 只针对某一台主机 指定给某个人的快递路线
网络路由 一个网段(如 10.0.0.0/8) 发往该网段的包都走这条 某条街的包裹统一路线
默认路由 0.0.0.0/0 所有"未命中其他条目"的包都走这条 “其他一律走大门”

1.6 DNS 服务器

概念定义DNS(Domain Name System,域名系统)把域名(如 www.baidu.com)解析成 IP 地址(如 220.181.38.148),这样用户只需记住名字,由系统自动查表得到地址再发起连接。

生活例子:DNS 像电话簿——你报名字,它给你号码。

Linux 行为要点:可配置最多 3 个 DNS 服务器。只有当前正在用的那个 DNS 不可达时才会尝试下一个;若某次解析请求失败(例如域名不存在),不会自动换第二个 DNS 重试,而是直接返回失败。

1.7 ICANN 与 IANA

  • ICANN(Internet Corporation for Assigned Names and Numbers):互联网名称与数字地址分配机构,负责域名和 IP 等资源的政策与协调。
  • IANA(Internet Assigned Numbers Authority):互联网号码分配局,负责全球 IP 地址块、协议号等具体分配。

本节概念小结IP 是主机的逻辑地址,掩码用来从 IP 中析出网络地址和主机范围;网关是本网段出口,路由决定"发往某目标该走哪条路";DNS 把域名解析成 IP。同网段通信只需 IP+掩码;跨网段必须经网关并依赖路由表;用域名访问则还需 DNS。


二、Linux 主机接入网络的要素 🔗

本地通信

跨网段通信

域名解析

IP + NETMASK

同网段主机

GATEWAY 网关

远程主机

DNS 服务器

www.example.com

要素 作用 生活例子
IP 地址 本机在网络中的身份 你家门牌号
子网掩码 确定网络范围 你在哪条街
网关 跨网段通信的出口 小区大门
DNS 域名 → IP 解析 电话簿
主机名 本机名称标识 你家名字

三、网络配置方式总览 📋

概念要点:Linux 下网络属性(IP、掩码、网关、DNS 等)的配置有两种层次——从哪里读(配置文件 vs 当前内核状态)和谁在分配(手动静态 vs DHCP 动态)。命令改的是当前内核状态,重启或重启网络服务后会按配置文件重新加载,所以命令配置默认是临时的;要永久生效,必须改配置文件并重启网络服务。

网络配置方式

手动静态配置

动态分配 DHCP

命令方式
立即生效,重启失效

配置文件
需重启服务,永久有效

ifcfg 系列
ifconfig / route / netstat

iproute2 系列
ip / ss

NetworkManager
nmcli / nmtui

/etc/sysconfig/network-scripts/ifcfg-IFACE

方式 生效时间 持久性 适用
命令配置 立即生效 重启网络服务或主机后失效 临时测试、排障
配置文件 需重启服务后才生效 永久有效(重启机器仍保留) 生产环境
DHCP 由 DHCP 服务器分配,续约时可能变 依赖租约,不能固定 IP 办公电脑、笔记本

⚠️ DHCP(Dynamic Host Configuration Protocol):由局域网内的 DHCP 服务器自动分配 IP、掩码、网关、DNS 等;主机无法在 DHCP 模式下"写死"固定 IP。若获取失败,系统可能使用 169.254.x.x 的链路本地地址


四、网络接口命名 🏷️

4.1 传统命名

类型 命名 示例
以太网 eth# eth0, eth1, eth2
PPP 网络 ppp# ppp0, ppp1

4.2 CentOS 7 可预测命名方案

CentOS 7 支持多种命名机制,按优先级依次尝试:

优先级 来源 命名格式 示例
1 Firmware/BIOS 板载索引 eno# eno1, eno2
2 PCI-E 扩展槽索引 ens# ens1, ens33
3 硬件物理位置 enp#s# enp2s0
4 MAC 地址 enx# eno16777736
5 以上不可用 传统 eth# eth0

4.3 命名格式组成

前缀 含义
en Ethernet,以太网
wl WLAN,无线局域网
ww WWAN,无线广域网
后缀 含义
o<index> 集成设备的索引号
s<slot> 扩展槽索引号
x<MAC> 基于 MAC 地址
p<bus>s<slot> 基于总线和槽的拓扑

五、ifcfg 系列命令:ifconfig / route / netstat 🔧

5.1 ifconfig 命令

生活例子ifconfig 就像去邮局查看/修改你家门牌号——能看到当前地址,也能临时换一个。

查看网卡信息
ifconfig            # 显示所有激活的网卡
ifconfig -a         # 显示所有网卡,包括未激活的
ifconfig eth0       # 只看 eth0

CentOS 7 显示含义

字段 含义
eno16777736 网卡接口名称
flags: UP 网卡启用激活状态
mtu 1500 最大传输单元(Maximum Transmission Unit)1500 字节
inet IPv4 地址
netmask 子网掩码
broadcast 广播地址
inet6 IPv6 地址
ether/HWaddr MAC 硬件地址
txqueuelen 1000 以太网传输队列长度
RX packets/bytes 接收的报文数量和总大小
TX packets/bytes 发送的报文数量和总大小
RX/TX errors 接收/发送错误数
dropped 丢包数
overruns 溢出数
配置 IP 地址
# 两种写法
ifconfig eth0 172.16.251.48 netmask 255.255.0.0
ifconfig eth0 172.16.251.48/16

# 配置后立即生效,但重启网络服务或主机后失效
# 远程连接修改 IP 会导致原地址消失→掉线!
添加多个地址(别名接口)
ifconfig eth0:0 192.168.2.24/24    # 给 eth0 添加别名 eth0:0
ifconfig eth0:1 10.0.0.1/8         # 再加一个 eth0:1

# 别名接口不支持 DHCP 动态获取
启用 / 关闭 / 删除
ifconfig eth0 up          # 启用网卡
ifconfig eth0 down        # 关闭网卡
ifconfig eth1 0           # 删除 eth1 上的地址(将 IP 设为 0)

ifup eth0                 # 通过配置文件启用(需 ifcfg-eth0 存在)
ifdown eth0               # 通过配置文件关闭
混杂模式
ifconfig eth0 promisc     # 进入混杂模式(抓取所有经过网卡的包)
ifconfig eth0 -promisc    # 关闭混杂模式
管理 IPv6 地址
ifconfig eth0 add addr/prefixlen    # 添加 IPv6
ifconfig eth0 del addr/prefixlen    # 删除 IPv6

5.2 route 命令

生活例子route 就像查看/编辑快递分拣表——看包裹该往哪个方向送,或添加一条新路线。

查看路由表
route -n    # 以数字显示,不反解地址(省资源)

输出字段

字段 含义 说明
Destination 目标地址 要去哪里
Gateway 下一跳网关 0.0.0.0 表示直连,不需要网关
Genmask 目标网络掩码 目标有多大范围
Flags 标志 U=启用 G=网关 H=主机路由
Metric 度量值 到达目标的开销/跳数
Iface 出口网卡 从哪块网卡发出
Flags 标志 含义
U route is up(路由启用)
H target is a host(目标是主机)
G use gateway(使用网关)
R reinstate route for dynamic routing
D dynamically installed by daemon or redirect
M modified from routing daemon or redirect
A installed by addrconf
C cache entry
! reject route(拒绝路由)

⚠️ G 标志表示使用了网关,但只有目标是 0.0.0.0 的才是默认网关

添加路由
# 添加网络路由
route add -net 10.0.0.0/8 gw 192.168.10.1 dev eth1
route add -net 192.168.0.0/24 gw 172.16.2.10

# 添加主机路由(不用指定掩码)
route add -host 192.168.3.20 gw 172.16.123.110

# 添加默认路由(两种写法等价)
route add -net 0.0.0.0/0.0.0.0 gw 192.168.10.1
route add default gw 192.168.10.1

⚠️ 下一跳地址必须与自己的某块网卡在同一网段内且存在

删除路由
route del -net 10.0.0.0/8 gw 192.168.10.1
route del -net 10.0.0.0/8
route del -host 192.168.3.20
route del default
route del -net 0.0.0.0

5.3 netstat 命令

生活例子netstat 就像快递站监控大屏——看有多少包裹在运输中、哪些端口在"开门接客"、路由表长什么样。

netstat -rn        # 显示路由表(等价于 route -n)
netstat -tan       # TCP 所有连接,数字显示
netstat -uan       # UDP 所有连接
netstat -tnl       # TCP 监听状态的连接
netstat -unl       # UDP 监听状态
netstat -tunlp     # TCP+UDP 监听,显示进程名和 PID
netstat -I         # 所有接口的统计
netstat -Ieth0     # 指定接口统计(注意中间无空格)
选项 含义
-t TCP 连接
-u UDP 连接
-w raw socket 裸套接字
-l 监听状态
-a 所有状态
-n 数字格式显示 IP 和端口
-e 扩展格式
-p 显示进程及 PID
-r 显示路由表
-I 显示接口统计

TCP 状态:LISTEN、ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT、CLOSED

5.4 hostname / hostnamectl 命令

# CentOS 6
hostname                     # 查看主机名
hostname NEWHOSTNAME         # 设置(当前有效,重启失效)

# CentOS 7
hostnamectl status           # 显示主机名信息
hostnamectl set-hostname NEWHOSTNAME   # 设置(永久有效,直接修改配置文件)

六、iproute2 系列命令:ip / ss 🆕

iproute2 和内核关系紧密,直接放置到内核生效,版本号与内核一致。rpm -qi iproute 可查看。

6.1 ip 命令总览

ip 命令

ip link
网络设备配置

ip addr
协议地址管理

ip route
路由管理

ip netns
网络名称空间

生活例子ipifconfig + route 的"升级合体版"——一个命令搞定网卡管理、地址管理和路由管理。

ip link — 网络设备配置
ip link show                  # 显示所有设备属性
ip -s link show               # 显示统计信息
ip -s link show eth0          # 指定网卡详情

ip link set eth0 up           # 启用
ip link set eth0 down         # 禁用
ip link set eth0 mtu 1000     # 设置 MTU
ip link set eth0 name ethtest # 重命名(需先 down)
ip link set eth0 address aa:aa:aa:aa:aa:aa  # 修改 MAC(测试后改回)

ip link set eth0 multicast on     # 启用多播
ip link set eth0 multicast off    # 禁用多播

ip link set eth0 netns PID        # 移到指定网络名称空间
ip netns — 网络名称空间
ip netns list                 # 列出所有 netns
ip netns add NAME             # 创建
ip netns del NAME             # 删除
ip netns exec NAME COMMAND    # 在指定 netns 中执行命令
ip addr — 协议地址管理
ip addr show                       # 显示所有接口地址
ip addr show dev eth0              # 指定接口
ip addr show dev eth0 to 192.168.100.1/24  # 过滤特定网段

# 添加地址(可加 label 别名)
ip addr add 10.1.1.10/8 dev eth1 label eth1:0
ip addr add 192.168.100.1/24 dev eth0 label eth0:0

# 删除地址
ip addr del 10.2.2.2/8 dev eth0

# 刷新(删除所有地址)
ip addr flush dev eth0
ip addr flush eth0 to 10/8    # 删除所有以 10 开头的地址

scope 参数:global 全局可用,link 接口可用,host 仅本机可用。

ip route — 路由管理
ip route show                       # 显示路由表(等价 route -n)

# 添加
ip route add 192.168.0.0/24 via 10.0.0.1 dev eth1 src 10.0.20.100
ip route add 192.168.3.5/24 dev eth0           # 无网关
ip route add 192.168.3.5/24 via 192.168.20.1 dev eth0  # 有网关
ip route add default via GW                     # 默认路由
ip route add to 10.0.1.0/24 dev eth1 via 192.168.100.6

# 删除
ip route del 192.168.3.5/24
ip route del TYPE PREFIX

# 刷新
ip route flush to 10/8             # 删除所有以 10 开头的路由

# 其他
ip route change ...                # 修改
ip route replace ...               # 修改或新增
ip route get TYPE PREFIX           # 查询单条路由

6.2 ss 命令

ssnetstat 的现代替代,速度更快,信息更全。

ss -tan            # TCP 所有连接,数字显示
ss -uan            # UDP 所有连接
ss -tnl            # TCP 监听
ss -tunlp          # TCP+UDP 监听+进程
ss -motan          # 带内存和计时器信息
选项 含义
-t TCP
-u UDP
-w raw socket
-l 监听状态
-a 所有状态
-n 数字格式
-p 进程及 PID
-e 扩展信息
-m 内存用量
-o 计时器信息
过滤功能(FILTER)
# 按端口过滤
ss -tan '( dport = :22 or sport = :22 )'

# 按状态过滤
ss -tan state ESTABLISHED

七、nmcli 命令(CentOS 7)🖥️

nmcli device status          # 显示网络设备状态
nmcli connection show        # 显示连接列表
nmcli connection up IFACE    # 启用连接
nmcli connection down IFACE  # 禁用连接
修改 IP 地址
nmcli conn modify IFACE [+|-]setting.property value

# 示例
nmcli conn modify eth0 ipv4.address "192.168.1.100/24"
nmcli conn modify eth0 ipv4.gateway "192.168.1.1"
nmcli conn modify eth0 ipv4.dns "8.8.8.8"
nmcli conn modify eth0 ipv4.method manual    # 静态 IP
nmcli conn up eth0                            # 使修改生效

nmtui:CentOS 7 提供的 text window 图形化配置工具,执行 nmtui 即可进入。


八、配置文件详解 📄

概念要点:Red Hat 系(CentOS/RHEL)的网络持久配置通过文本配置文件完成。修改后不会立刻生效,需要重启网络服务(如 systemctl restart network)或重启主机,之后每次开机会按这些文件加载。若同时用命令改了当前状态,重启网络服务会用配置文件覆盖当前状态。

8.1 网卡配置文件

路径/etc/sysconfig/network-scripts/ifcfg-IFACE(如 ifcfg-eth0ifcfg-eno16777736)。文件名中的 IFACE 必须与配置项 DEVICE 一致,表示"这份配置绑定到哪块网卡"。

参数 含义 示例
DEVICE 设备名(需与文件名一致) DEVICE=eth0
ONBOOT 开机是否自动激活 ONBOOT=yes
BOOTPROTO 引导协议:static/none/dhcp/bootp BOOTPROTO=static
TYPE 接口类型 TYPE=Ethernet
IPADDR IP 地址 IPADDR=172.16.12.23
NETMASK 子网掩码(CentOS 7 也支持 PREFIX) NETMASK=255.255.0.0
GATEWAY 默认网关 GATEWAY=172.16.0.1
DNS1 主 DNS DNS1=172.16.0.1
DNS2 备用 DNS DNS2=8.8.8.8
UUID 唯一标识(可省) UUID=xxx-xxx-xxx
HWADDR MAC 地址(要与真实一致,可省) HWADDR=00:0C:29:96:C5:24
USERCTL 普通用户能否控制此接口 USERCTL=no
PEERDNS DHCP 时是否覆盖 /etc/resolv.conf PEERDNS=no
IPV6INIT 是否初始化 IPv6 IPV6INIT=no
NM_CONTROLLED 是否受 NetworkManager 控制 NM_CONTROLLED=no

完整示例

DEVICE=eth0
BOOTPROTO=none
HWADDR=00:0C:29:96:C5:24
NM_CONTROLLED=yes
ONBOOT=yes
TYPE=Ethernet
UUID=2d225e7-232232-3435-44364566-dddf23
IPADDR=172.16.12.23
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
DNS1=172.16.0.1
IPV6INIT=no
USERCTL=no
PEERDNS=no

8.2 路由配置文件

路径:/etc/sysconfig/network-scripts/route-IFACE(如 route-eth0

两种格式(不可混用):

# 格式一:每行一条
10.0.0.0/8 via 192.168.10.1
192.168.2.0/24 via 172.16.0.1

# 格式二:每三行一条
ADDRESS0=10.0.0.0
NETMASK0=255.0.0.0
GATEWAY0=192.168.10.1

8.3 DNS 配置文件

# /etc/resolv.conf,最多三条
nameserver 172.16.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

8.4 本地解析文件

# /etc/hosts(优先于 DNS 查询)
# 格式:IP  主机名  别名
172.16.0.1    www.magedu.com    www

查询顺序:/etc/hosts → DNS 服务器

8.5 主机名配置

# /etc/sysconfig/network
HOSTNAME=myserver

# 此方法设置后不会立即生效,需重读配置文件或重启

8.6 别名接口配置文件

# /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static    # 别名不支持 DHCP
IPADDR=192.168.2.24
NETMASK=255.255.255.0
ONBOOT=yes

8.7 重启网络服务

# CentOS 6
service network restart

# CentOS 7
systemctl restart network.service

8.8 CentOS 6 网络管理注意

  • CentOS 6 上 NetworkManager 不完善,集群、虚拟化桥接在此服务下无法使用
  • 建议使用 network 服务,关闭 NetworkManager
  • 网络服务有两种:networkNetworkManager

8.9 GUI/TUI 配置工具

# CentOS 6
setup                      # TUI
system-config-network-tui  # TUI
system-config-network-gui  # GUI

# CentOS 7
nmtui                      # TUI

九、TCP/IP 协议基础 📡

9.1 网络通信过程概述

概念关系:网络间主机通信依赖 TCP/IP 协议栈。数据从 A 发往 B 时,应用层数据经过传输层(TCP/UDP 封装端口、可靠性等)→ 网络层(IP 封装地址、选路)→ 链路层(如以太网帧)→ 物理发出;对方按相反顺序解封装,最终交给对应应用程序。整条路径依赖:IP + 掩码(判断是否同网段)、路由/网关(跨网段时找下一跳)、DNS(若用域名则先解析为 IP)。

小结:只有本机 IP、掩码、网关、路由、DNS 配置正确,且中间网络可达,两台主机才能正常通信。

9.2 TCP 与 UDP 对比

概念定义

  • TCP(Transmission Control Protocol,传输控制协议):面向连接可靠字节流。通信前要先建立连接(三次握手),传完后断开连接(四次挥手);每个发出的报文都需要对方确认,超时则重传,并对乱序报文重排后交付,因此适合对正确性要求高的应用。
  • UDP(User Datagram Protocol,用户数据报协议):无连接不保证可靠、按数据报收发。不建连、不确认、不重传,发出去就不管,适合对实时性要求高、能容忍少量丢失的场景。

传输层协议

TCP 传输控制协议

UDP 用户数据报协议

面向连接

字节流

可靠传输

无连接

数据报

不可靠但快

对比项 🔒 TCP 🚀 UDP
连接 面向连接(先建连再传数据) 无连接(直接发)
数据方式 字节流(收发次数无固定对应关系) 数据报(发一次应对应收一次)
可靠性 应答、重传、排序 无保证,丢包不重传
头部 20–60 字节 8 字节
典型应用 HTTP、FTP、SSH、邮件 DNS、视频流、游戏、广播/多播

生活例子TCP挂号信——要签收回执,没收到就再寄。UDP传单——发出去即可,不保证对方一定收到,但省事、速度快。

9.3 TCP 字节流 vs UDP 数据报(概念辨析)

TCP 字节流

在这里插入图片描述

  • 发送端:应用多次调用"写",数据先进入 TCP 发送缓冲区;TCP 按自己的规则(如 MSS、拥塞窗口)把缓冲区里的数据切分成若干个报文段发出。因此写了几次发出几个报文段没有一一对应关系。
  • 接收端:收到的多个报文段按序号重排后放入 TCP 接收缓冲区,应用可以一次读很多、或分多次读。因此收到几个报文段读了几次也没有一一对应关系。
  • 结论:TCP 对应用呈现的是无边界字节流,不保留"消息"边界。

UDP 数据报

  • 发送端:每执行一次"写",就封装成一个 UDP 数据报并发出,写几次就发几个包。
  • 接收端:必须针对每个数据报各读一次,否则会丢包;若一次读的缓冲区小于该数据报长度,多出的部分会被截断
  • 结论:UDP 保留消息边界,一发一收一一对应。

在这里插入图片描述

十、TCP 报文头部结构详解 📦

10.1 头部结构图

在这里插入图片描述

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          源端口号 (16bit)       |         目的端口号 (16bit)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        序号 (32bit)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       确认号 (32bit)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 头部 |保留 |U|A|P|R|S|F|         窗口大小 (16bit)             |
| 长度 | 6位 |R|C|S|S|Y|I|                                      |
| 4bit |     |G|K|H|T|N|N|                                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         校验和 (16bit)          |        紧急指针 (16bit)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      选项(0~40字节)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

固定头部 20 字节 + 可选头部 最多 40 字节 = TCP 头部最长 60 字节

10.2 各字段详解(一句话理解)

字段 位数 一句话理解
源端口 16 本端应用对应的端口(客户端多为临时端口)
目的端口 16 对端应用对应的端口(服务端多为知名端口,如 80、22)
序号 32 本端在本连接里已发送字节流的"编号",用于排序与确认
确认号 32 表示"已收到到该序号之前的数据",通常为对方序号+1
头部长度 4 以 4 字节为单位,最大 15,故头部最长 60 字节
URG 1 为 1 时紧急指针有效,表示有紧急数据需优先处理
ACK 1 为 1 时确认号有效,该报文段是对对方数据的确认
PSH 1 提示接收方尽快把数据交给应用,腾出接收缓冲区
RST 1 为 1 表示复位,要求对方断开并放弃本连接
SYN 1 为 1 表示同步,用于建立连接时交换初始序号
FIN 1 为 1 表示本端不再发数据,用于关闭连接
窗口大小 16 接收方声明还能收多少字节,供发送方做流量控制
校验和 16 对头部+数据做校验,检测传输是否出错
紧急指针 16 与 URG 配合,指出紧急数据结束位置(序号偏移)

10.3 头部选项(TCP Options)

kind 值 名称 说明
0 选项结束 标记选项列表结束
1 空操作 填充用
2 最大报文段长度(MSS) 通常设为 MTU-40=1460 字节(以太网)
3 窗口扩大因子 实际窗口 = 窗口值 × 2^m,提高吞吐量
4 选择性确认(SACK 允许) 只重传丢失的报文段,不重传已收到的
5 SACK 实际工作选项 告知已缓存的不连续数据块
8 时间戳 准确计算回路时间

知名端口(定义在 /etc/services):HTTP=80, DNS=53, FTP=21, SSH=22, HTTPS=443


在这里插入图片描述

十一、TCP 连接:三次握手与四次挥手 🤝

11.1 三次握手建立连接

服务器 客户端 服务器 客户端 CLOSED LISTEN SYN_SENT SYN_RCVD ESTABLISHED ESTABLISHED 双方开始传输数据 SYN=1, seq=i SYN=1, ACK=1, seq=j, ack=i+1 ACK=1, seq=i+1, ack=j+1

在这里插入图片描述

次数 方向 标志 说明
第 1 次 客户端 → 服务器 SYN=1, seq=i 客户端发起连接请求,进入 SYN_SENT
第 2 次 服务器 → 客户端 SYN=1, ACK=1, seq=j, ack=i+1 服务器确认并发送自己的 SYN,进入 SYN_RCVD
第 3 次 客户端 → 服务器 ACK=1, ack=j+1 客户端确认,双方进入 ESTABLISHED

生活例子

  • 你:“在吗?”(SYN)
  • 对方:“在的,你说吧”(SYN+ACK)
  • 你:“好的,我开始说了”(ACK)→ 开始聊天

11.2 为什么必须三次?两次不行吗?

核心原因:要双向确认"双方都能发、都能收",并同步初始序号,防止旧报文被误用。

两次握手的问题(死锁):若只做两次——客户端发 SYN,服务器回 SYN+ACK 并认为连接已建立。若这份 SYN+ACK 在半路丢失,客户端永远收不到,不知道服务器已准备好,也不会发第三个 ACK。服务器却以为连接已建立,开始发数据;客户端收到的是"陌生"的数据包(没建立过连接),可能直接丢弃或发 RST。结果:服务器在发、客户端不认,形成死锁。三次握手的第三报(客户端 ACK)保证:只要连接建立成功,双方都确认过对方的序号与收发能力

11.3 四次挥手关闭连接

服务器 客户端 服务器 客户端 ESTABLISHED(双方通信中) FIN_WAIT_1 CLOSE_WAIT FIN_WAIT_2 服务器继续发送剩余数据... LAST_ACK TIME_WAIT CLOSED 等待 2MSL 后 CLOSED FIN=1, seq=i ACK=1, ack=i+1 FIN=1, seq=j ACK=1, ack=j+1
次数 方向 标志 说明
第 1 次 客户端 → 服务器 FIN=1, seq=i 客户端说"我没数据了",进入 FIN_WAIT_1
第 2 次 服务器 → 客户端 ACK=1, ack=i+1 服务器说"收到",进入 CLOSE_WAIT
第 3 次 服务器 → 客户端 FIN=1, seq=j 服务器也说"我也没了",进入 LAST_ACK
第 4 次 客户端 → 服务器 ACK=1, ack=j+1 客户端确认,进入 TIME_WAIT → 2MSL 后 CLOSED

在这里插入图片描述

生活例子

  • 你:“我说完了”(FIN)
  • 对方:“嗯我知道了”(ACK)——但对方可能还有话没说完
  • 对方:“我也说完了”(FIN)
  • 你:“好的,挂了”(ACK)→ 等几秒确认对方收到 → 真正挂断

11.4 为什么关闭需要四次而不是三次?

建立时能合并:服务器收到 SYN 后,既要确认(ACK)又要声明自己的序号(SYN),可以放在同一个报文里(SYN+ACK),所以建立只需三次(客户端 SYN → 服务器 SYN+ACK → 客户端 ACK)。

关闭时不能合并:收到对方的 FIN 只表示对方不再发数据了,己方可能还有数据要发给对方,因此不能立刻也发 FIN。正确做法是:先回 ACK(“你的 FIN 我收到了”)→ 己方继续发完剩余数据 → 再发 FIN(“我这边也没数据了”)。所以 ACK 和 FIN 是两个独立步骤,对应两次挥手;加上对方先发的一次 FIN 和最后对你 FIN 的 ACK,一共四次


十二、TCP 状态转移全过程 🔄

12.1 所有 TCP 状态

状态 含义 出现在
CLOSED 初始/最终状态,连接不存在 双方
LISTEN 等待连接请求 服务器
SYN_SENT 已发送 SYN,等待确认 客户端
SYN_RCVD 已收到 SYN 并回复,等待最终确认 服务器
ESTABLISHED 连接建立完成,可传输数据 双方
FIN_WAIT_1 已发送 FIN,等待对方 ACK 主动关闭方
FIN_WAIT_2 已收到 ACK,等待对方 FIN 主动关闭方
CLOSE_WAIT 已收到对方 FIN,等自己应用关闭 被动关闭方
LAST_ACK 已发送 FIN,等待最后的 ACK 被动关闭方
TIME_WAIT 等待 2MSL 后关闭 主动关闭方
CLOSING 双方同时关闭(少见) 双方

12.2 状态转移图

服务器 listen()

客户端 connect() 发 SYN

收到 SYN, 发 SYN+ACK

收到 SYN+ACK, 发 ACK

收到 ACK

主动关闭 发 FIN

收到 FIN, 发 ACK

收到 ACK

收到 FIN, 发 ACK

发 FIN

收到 ACK

2MSL 超时

CLOSED

LISTEN

SYN_SENT

SYN_RCVD

ESTABLISHED

FIN_WAIT_1

CLOSE_WAIT

FIN_WAIT_2

TIME_WAIT

LAST_ACK

12.3 TIME_WAIT 状态(概念要点)

定义:主动关闭连接的一方,在发出对对方 FIN 的最后一个 ACK 之后,进入 TIME_WAIT,等待 2×MSL(MSL = Maximum Segment Lifetime,报文段在网络中的最大生存时间)后才进入 CLOSED。

存在原因

  1. 可靠终止:最后一个 ACK 可能丢失。若己方不等待就关掉,对方重传的 FIN 就无人应答;对方会反复重传。在 TIME_WAIT 期间若收到重传的 FIN,可以再发一次 ACK,保证连接被正常关掉。
  2. 防止旧报文干扰新连接:同一四元组(源/目 IP、源/目端口)在 2×MSL 内可能还有迟到的旧报文。若立刻用同一端口建新连接,可能误收这些旧包。等待 2×MSL 可让旧报文在网络中"过期",避免与新连接混淆。

12.4 RST 复位报文段

概念定义RST(Reset)是 TCP 头部的一个标志位。携带 RST=1 的报文段称为复位报文段,含义是"终止当前连接,不要继续用这个连接";收到 RST 的一方会立刻把连接关闭,并通知应用程序连接被对端重置。

常见触发场景

  • 未监听的端口发起连接,或向不存在的服务发数据 → 对端回 RST。
  • 连接超时提前关闭、在已关闭的 socket 上收到数据 → 可能发 RST。
  • 异常终止连接(如强制关闭、程序崩溃)→ 发 RST 通知对方。
  • 向处于 LISTEN 的端口发送非 SYN 的包(例如直接发数据)→ 可能回 RST。

十三、TCP 可靠传输机制 🛡️

概念定义可靠传输指 TCP 保证按序、无重复、无丢失地把应用层交给它的字节流交给对端应用。实现依赖多种机制配合,而不是单一点。

13.1 机制总览

TCP 可靠传输

发送应答机制
每个报文段必须被确认

超时重传机制
定时器超时未应答则重传

报文排序
乱序到达的报文重排后交付

流量控制
接收窗口控制发送速度

拥塞控制
避免网络过载

13.2 发送应答机制(ACK)

发送端每发一个 TCP 报文段(或一批),都依赖接收端回传 ACK(确认号表示"已收到到哪一字节")。只有被确认的数据才视为已成功送达;未确认的会留在发送缓冲区,等待 ACK 或超时重传。

13.3 超时重传机制

发送端为每个已发出但未确认的报文段维护重传定时器。若在定时时间内未收到对应 ACK,则重传该报文段并重置定时器。这样即使网络丢包,也能通过重传补上。另外,IP 层可能乱序、重复递交,TCP 会根据序号对收到的报文段排序、去重后再交付给应用。

13.4 流量控制与拥塞控制(概念区分)

  • 流量控制:解决"接收方处理不过来"的问题。通过 TCP 头部的窗口字段,接收方告诉发送方"我还能收多少字节";发送方不会发超过该窗口的数据,避免撑满接收缓冲区。
  • 拥塞控制:解决"网络承载不了"的问题。发送方根据丢包、超时等信号,动态调整发送速率(如慢启动、拥塞避免、快速重传、快速恢复),避免把网络塞爆导致大面积丢包。

十四、命令对比速查 🆚

14.1 ifconfig vs ip 命令

操作 ifconfig(旧) ip(新)
查看所有网卡 ifconfig -a ip link show / ip addr show
查看指定网卡 ifconfig eth0 ip addr show dev eth0
配置 IP ifconfig eth0 IP/MASK ip addr add IP/MASK dev eth0
删除 IP ifconfig eth0 0 ip addr del IP/MASK dev eth0
添加别名 ifconfig eth0:0 IP/MASK ip addr add IP/MASK dev eth0 label eth0:0
启用/关闭 ifconfig eth0 up/down ip link set eth0 up/down
修改 MTU ip link set eth0 mtu 9000
改名 ip link set eth0 name newname
刷新所有地址 ip addr flush dev eth0

14.2 route vs ip route

操作 route(旧) ip route(新)
查看路由 route -n ip route show
添加网络路由 route add -net DEST gw GW ip route add DEST via GW dev DEV
添加默认路由 route add default gw GW ip route add default via GW
删除路由 route del -net DEST ip route del DEST
刷新路由 ip route flush to PREFIX

14.3 netstat vs ss

操作 netstat(旧) ss(新)
TCP 所有连接 netstat -tan ss -tan
UDP 监听 netstat -unl ss -unl
显示进程 netstat -tunlp ss -tunlp
路由表 netstat -rn ip route show
过滤端口 ss -tan '( dport = :22 )'
过滤状态 ss -tan state ESTABLISHED
接口统计 netstat -Ieth0 ip -s link show eth0

14.4 CentOS 6 vs CentOS 7 网络管理

对比项 CentOS 6 CentOS 7
接口命名 eth0, eth1 eno1, ens33, enp2s0
管理工具 ifconfig + route ip 命令 + nmcli/nmtui
服务管理 service network restart systemctl restart network.service
配置 GUI setup / system-config-network nmtui
主机名 hostname + 配置文件 hostnamectl set-hostname(永久)
NetworkManager 不完善,建议关闭 功能完善,推荐使用
掩码 NETMASK= 也支持 PREFIX=

十五、Shell 脚本与练习题 📝

15.1 脚本:自动分区、格式化磁盘

练习要求:

  1. 列出所有磁盘,让用户选择(quit 退出,错误重选)
  2. 提醒用户操作可能损坏数据,确认后继续
  3. 抹除所有分区,创建三个主分区(20M、512M、128M swap),格式化
#!/bin/bash
echo "Initial a disk ..."
echo -e "\033[31mWarning:\033[0m"
fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]"
read -p "You choice :" PARTDISK
if [ $PARTDISK == 'quit' ]; then
    echo "quit"
    exit 7
fi
until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK" &> /dev/null; do
    read -p "Wrong option, You choice again:" PARTDISK
done
read -p "Will destroy all data, continue:" CHOICE
until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do
    read -p "Will destroy all data, continue:" CHOICE
done
if [ $CHOICE == 'n' ]; then
    echo "quit"
    exit 9
else
    echo "Partitioning..."
    dd if=/dev/zero of=$PARTDISK bs=512 count=1
    sync
    sleep 3
    echo "n
p
1

+20M
n
p
2

+512M
n
p
3

+128M
t
3
82
w" | fdisk $PARTDISK &> /dev/null
    partprobe $PARTDISK
    sync
    sleep 2
    mke2fs -j ${PARTDISK}1 &> /dev/null
    mke2fs -j ${PARTDISK}2 &> /dev/null
    mkswap ${PARTDISK}3
fi

15.2 脚本:卸载指定磁盘所有挂载

#!/bin/bash
#
for I in $(mount | grep "/dev/sdb" | awk '{print $1}'); do
    fuser -km $I
    umount $I
    echo "$I unmounted ok."
done

dd if=/dev/zero of=/dev/sdb bs=512 count=1
sync
sleep 3

15.3 练习题

练习 1:写一个脚本为指定硬盘自动创建分区(前提:新增一块硬盘 /dev/sdb)

  1. 列出所有磁盘供选择,quit 退出,选错重选
  2. 确认操作可能损坏数据
  3. 抹除分区后创建三个主分区:20M + 512M + 128M(swap)
📖 参考答案

见 15.1 脚本。关键点:

  • fdisk -l 2>/dev/null | grep -o "^Disk /dev/[sh]d[a-z]" 列出磁盘
  • until 循环校验输入
  • dd if=/dev/zero of=$PARTDISK bs=512 count=1 抹除分区表
  • echo "..." | fdisk 实现非交互式分区
  • partprobe 通知内核重读分区表

练习 2:使用 ping 命令测试 192.168.0.151 到 192.168.0.254 所有主机是否在线

  • 在线显示绿色 “ip is up.”
  • 不在线显示红色 “ip is down.”
  • 分别用 while、until、for(两种形式)实现

提示:ping -c 1 -W 1 IP

📖 for 循环参考
#!/bin/bash
for IP in $(seq 151 254); do
    if ping -c 1 -W 1 192.168.0.$IP &>/dev/null; then
        echo -e "\033[32m192.168.0.$IP is up.\033[0m"
    else
        echo -e "\033[31m192.168.0.$IP is down.\033[0m"
    fi
done
📖 while 循环参考
#!/bin/bash
IP=151
while [ $IP -le 254 ]; do
    if ping -c 1 -W 1 192.168.0.$IP &>/dev/null; then
        echo -e "\033[32m192.168.0.$IP is up.\033[0m"
    else
        echo -e "\033[31m192.168.0.$IP is down.\033[0m"
    fi
    let IP++
done

练习 3:网络配置综合

  1. 给 eth0 配置 IP 172.16.251.48/16
  2. 添加路由到 10.0.0.0/8 网段,网关 172.16.0.1
  3. 添加默认路由,网关 172.16.0.1
  4. 用 ip 命令完成同样的操作
  5. 配置写入配置文件使其永久生效
📖 参考答案
# ifconfig/route 方式
ifconfig eth0 172.16.251.48/16
route add -net 10.0.0.0/8 gw 172.16.0.1
route add default gw 172.16.0.1

# ip 方式
ip addr add 172.16.251.48/16 dev eth0
ip route add 10.0.0.0/8 via 172.16.0.1 dev eth0
ip route add default via 172.16.0.1

# 配置文件(永久)
# /etc/sysconfig/network-scripts/ifcfg-eth0:
# DEVICE=eth0
# BOOTPROTO=static
# IPADDR=172.16.251.48
# NETMASK=255.255.0.0
# GATEWAY=172.16.0.1
# ONBOOT=yes

# /etc/sysconfig/network-scripts/route-eth0:
# 10.0.0.0/8 via 172.16.0.1

# 重启服务
# systemctl restart network.service

附录

A. 网络连通性测试工具 🔍

命令 作用 示例
ping 测试 IP 是否可达(ICMP 协议) ping -c 5 -w 10 172.16.251.48
mtr 网络连通性判断(比 ping 更详细) mtr 8.8.8.8
traceroute 查看到目标经过的所有网关 traceroute www.baidu.com
ping -c 5 172.16.251.48     # 发送 5 个 ICMP 包
ping -w 10 172.16.251.48    # 最多测试 10 秒

B. awk 快速参考

df -Ph | awk '{print $1}'           # 取第一列
df -Ph | awk '{print $1,$3}'        # 取 1、3 列
df -Ph | awk '{print $0}'           # 所有字段
df -Ph | awk '{print $NF}'          # 最后一个字段
awk -F: '{print $1,$3}' /etc/passwd # 以冒号分隔取 1、3 列
fdisk -l 2>/dev/null | grep "^Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}'

C. RHEL 网络相关文件路径

文件路径 用途
/etc/sysconfig/network-scripts/ifcfg-IFACE 网卡 IP 配置
/etc/sysconfig/network-scripts/route-IFACE 静态路由
/etc/sysconfig/network 主机名、全局网络设置
/etc/resolv.conf DNS 服务器
/etc/hosts 本地域名解析
/etc/services 知名端口号定义
/proc/sys/net/ipv4/ip_forward IP 转发开关
RHEL5: /etc/modprobe.conf 模块别名
RHEL6: /etc/udev/rules.d/70-persistent-net.rules 网卡命名规则

D. 常用网络端口

端口 服务 端口 服务
20/21 FTP 22 SSH
23 Telnet 25 SMTP
53 DNS 80 HTTP
110 POP3 143 IMAP
443 HTTPS 3306 MySQL
5432 PostgreSQL 6379 Redis

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐