Linux 网络配置与 TCP/IP 协议

本章从系统讲解 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 地址、子网掩码与路由](#一、网络基础:IP 地址、子网掩码与路由)
  • [二、Linux 主机接入网络的要素](#二、Linux 主机接入网络的要素)
  • 三、网络配置方式总览
  • 四、网络接口命名
  • [五、ifcfg 系列命令:ifconfig / route / netstat](#五、ifcfg 系列命令:ifconfig / route / netstat)
  • [六、iproute2 系列命令:ip / ss](#六、iproute2 系列命令:ip / ss)
  • [七、nmcli 命令(CentOS 7)](#七、nmcli 命令(CentOS 7))
  • 八、配置文件详解
  • [九、TCP/IP 协议基础](#九、TCP/IP 协议基础)
  • [十、TCP 报文头部结构详解](#十、TCP 报文头部结构详解)
  • [十一、TCP 连接:三次握手与四次挥手](#十一、TCP 连接:三次握手与四次挥手)
  • [十二、TCP 状态转移全过程](#十二、TCP 状态转移全过程)
  • [十三、TCP 可靠传输机制](#十三、TCP 可靠传输机制)
  • 十四、命令对比速查
  • [十五、Shell 脚本与练习题](#十五、Shell 脚本与练习题)
  • 附录

一、网络基础: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 就像去邮局查看/修改你家门牌号------能看到当前地址,也能临时换一个。

查看网卡信息
bash 复制代码
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 地址
bash 复制代码
# 两种写法
ifconfig eth0 172.16.251.48 netmask 255.255.0.0
ifconfig eth0 172.16.251.48/16

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

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

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

5.2 route 命令

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

查看路由表
bash 复制代码
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 的才是默认网关

添加路由
bash 复制代码
# 添加网络路由
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

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

删除路由
bash 复制代码
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 就像快递站监控大屏------看有多少包裹在运输中、哪些端口在"开门接客"、路由表长什么样。

bash 复制代码
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 命令

bash 复制代码
# 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 的"升级合体版"------一个命令搞定网卡管理、地址管理和路由管理。

bash 复制代码
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 --- 网络名称空间
bash 复制代码
ip netns list                 # 列出所有 netns
ip netns add NAME             # 创建
ip netns del NAME             # 删除
ip netns exec NAME COMMAND    # 在指定 netns 中执行命令
ip addr --- 协议地址管理
bash 复制代码
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 --- 路由管理
bash 复制代码
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 的现代替代,速度更快,信息更全。

bash 复制代码
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)
bash 复制代码
# 按端口过滤
ss -tan '( dport = :22 or sport = :22 )'

# 按状态过滤
ss -tan state ESTABLISHED

七、nmcli 命令(CentOS 7)🖥️

bash 复制代码
nmcli device status          # 显示网络设备状态
nmcli connection show        # 显示连接列表
nmcli connection up IFACE    # 启用连接
nmcli connection down IFACE  # 禁用连接
修改 IP 地址
bash 复制代码
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

完整示例

ini 复制代码
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

两种格式(不可混用):

bash 复制代码
# 格式一:每行一条
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 配置文件

bash 复制代码
# /etc/resolv.conf,最多三条
nameserver 172.16.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

8.4 本地解析文件

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

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

8.5 主机名配置

bash 复制代码
# /etc/sysconfig/network
HOSTNAME=myserver

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

8.6 别名接口配置文件

bash 复制代码
# /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 重启网络服务

bash 复制代码
# 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 配置工具

bash 复制代码
# 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),格式化
bash 复制代码
#!/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 脚本:卸载指定磁盘所有挂载

bash 复制代码
#!/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 循环参考

bash 复制代码
#!/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 循环参考

bash 复制代码
#!/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. 配置写入配置文件使其永久生效

📖 参考答案

bash 复制代码
# 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
bash 复制代码
ping -c 5 172.16.251.48     # 发送 5 个 ICMP 包
ping -w 10 172.16.251.48    # 最多测试 10 秒

B. awk 快速参考

bash 复制代码
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

相关推荐
REDcker1 小时前
curl开发者快速入门
linux·服务器·c++·c·curl·后端开发
成震19712 小时前
UBUNTU 安装虚拟机
linux·运维·ubuntu
海盗猫鸥2 小时前
Linux基础指令1
linux·服务器
最贪吃的虎2 小时前
windows上如何可视化访问并远程操作linux系统上运行的浏览器或者linux可视化桌面
java·linux·运维·windows·分布式·后端·架构
Turboex邮件分享2 小时前
邮件队列堵塞的深度排查与紧急清空/重定向实战
运维·网络
mzhan0172 小时前
Linux: socket创建之后 interface down 然后再up起来
linux·运维
之歆2 小时前
Linux 软件包管理与编译安装
linux·运维·服务器
瑞华丽PLM2 小时前
电子通讯行业深度定制的国产PLM选型报告与数字化转型建议
网络·plm·国产plm·瑞华丽plm·瑞华丽
廋到被风吹走2 小时前
DDD领域驱动设计深度解析:从理论到代码实践
java·大数据·linux