现代操作系统的内核(如 Linux 内核)中有一个专门的模块叫做:
网络协议栈(Network Stack)
主要职责详解
| 职责 | 类比说明 | 技术术语 |
|---|---|---|
| 1. 接收和发送数据包 | 公司前台接收快递 & 发送包裹 | 数据链路层、IP 层、传输层 |
| 2. IP 地址管理 | 给每个员工分配邮箱地址 | IPv4 / IPv6 地址配置 |
| 3. 路由选择 | 快递要走哪条路线最短最快 | 路由表(Routing Table) |
| 4. 封装与解封装 | 包裹加标签 / 拆标签 | 数据封装(Encapsulation)与解封装(Decapsulation) |
| 5. 传输控制(TCP) | 控制文件是否完整送达 | TCP 流量控制、拥塞控制 |
| 6. 端口号管理 | 不同部门接收不同类型的快递 | 端口绑定、监听、转发 |
| 7. 安全防护(防火墙) | 保安检查包裹内容 | Netfilter / iptables / nftables |
| 8. NAT 转换 | 公司统一出口代理 | Network Address Translation |
| 9. 域名解析支持 | 内部电话簿查询联系方式 | DNS 解析缓存、本地 hosts |
| 10. 支持多种协议 | 公司支持各种沟通方式(电话、邮件、视频会议) | 支持 TCP、UDP、ICMP、HTTP、HTTPS、FTP 等 |
类比图:操作系统网络部门的组织架构
| 小组 | 类比角色 | 职责 |
|---|---|---|
| 套接字接口组(Socket Layer) | 客户接待员 | 接收进程请求(如浏览器访问网页) |
| 传输组(TCP / UDP) | 快递打包组 | 控制可靠传输或快速发送 |
| 网络组(IP 层) | 邮政分拣中心 | 决定发往哪个城市(IP 地址) |
| 链路组(MAC 层) | 快递站 | 决定发给哪个局域网内的目标主机 |
| 路由组(Routing) | 导航调度中心 | 选择最优路径(下一跳) |
| 设备驱动组(NIC Driver) | 快递员 | 实际把包裹送出去(通过网卡) |
| 安全组(Netfilter / Firewall) | 保安检查岗 | 检查是否允许通行 |
| NAT 组 | 公司代理出口 | 统一管理内部员工对外通信 |
| DNS 缓存组 | 内部电话簿管理员 | 记录域名与 IP 的对应关系 |
Linux 的网络部分是一个庞大的子系统,主要包括以下几个关键模块:
✅ 1. 套接字接口组(Socket Layer)
- 接收应用程序的请求(如 send(), recv())
- 分配并管理端口号(如随机端口 54321)
- 支持多种协议(TCP、UDP、RAW socket)
- 将数据传递给传输层(TCP/UDP), 是用户空间与内核空间的桥梁
✅ 2. 传输组(TCP / UDP)
- TCP:可靠传输、流量控制、拥塞控制
- UDP:快速但不保证送达
✅ 3. 网络组(IP 层)
处理 IP 地址、TTL(生存时间)
分片重组(当包太大时)
查找路由表
使用 ARP 协议获取目标 MAC
决定从哪个网卡发出去
支持多路径负载均衡
✅ 4. 链路组(MAC 层)
- 添加 MAC 地址头(源 MAC、目标 MAC)
- 将传输数据帧传给驱动
✅ 6. 设备驱动组(NIC Driver)
- 控制网卡硬件(如 Intel E1000、Realtek RTL8111)
- DMA 机制:直接内存访问,提高效率
- 中断通知:数据已发完 / 已收到
✅ 7. 安全组(Netfilter / Firewall)
匹配规则(iptables/nftables)
修改、丢弃、转发数据包
连接状态跟踪(conntrack)
✅ 8. NAT 组(Network Address Translation)
- 修改源地址和端口
- 实现内网访问外网
- 支持端口复用(PAT)
相关工具的使用
socket api
1. lsof - 查看进程打开的网络连接
用途:列出进程打开的文件描述符(包括 Socket 连接)。
常用命令:
#查看网络连接 lsof -i # 查看所有网络连接 lsof -i -p <PID> # 按 PID 过滤 lsof -i -c nginx # 按进程名过滤(如 nginx) lsof -i :80 # 查看 80 端口的占用 lsof -i :8080-8090 # 查看 8080 到 8090 端口的连接 lsof -i TCP # 仅 TCP 连接 lsof -i UDP # 仅 UDP 连接 #查看打开文件 lsof -p <PID> # 查看进程打开的所有文件(含 Socket) lsof /var/log/nginx.log # 查看谁在访问某个文件输出关键字段:
COMMAND:进程名称。PID:进程 ID。USER:运行进程的用户。TYPE:类型(如IPv4、IPv6)。NODE:协议(如TCP、UDP)。NAME:连接地址(如localhost:8080->1.2.3.4:443)。
2. netstat 或 ss - 网络连接统计
用途:查看系统网络连接、路由表、接口统计等(
ss是更现代的替代工具)。常用命令:
# 查看所有 TCP 连接及关联进程(需要 root 权限) netstat -tulnp # 查看某个进程的网络连接(按 PID) netstat -anp | grep <PID> ss -a # 显示所有连接(包括监听和非监听) ss -tunlp # 常用组合:显示所有 TCP/UDP 监听和连接 #按照状态过滤 ss -t state established # 查看所有已建立的 TCP 连接 ss -t state listening # 查看所有监听的 TCP 端口 ss -t state time-wait # 查看 TIME-WAIT 状态的连接 #按端口或ip过滤 ss -tunlp sport = :80 # 查看源端口为 80 的连接 !!! 等号左右空格不可少 ss -tunlp dport = :443 # 查看目标端口为 443 的连接 !!! 等号左右空格不可少 ss dst 192.168.1.100 # 目标 IP 为 192.168.1.100 的连接 ss src 10.0.0.1 # 源 IP 为 10.0.0.1 的连接参数说明:
-t:TCP 连接。-u:UDP 连接。-n:不解析域名(直接显示 IP)。-l:仅监听中的连接。-p:显示关联进程。-4/-6:仅 IPv4 或 IPv6。
输出示例:
👉
Rec-Q和Send-Q表示当前队列中的数据大小 👉Local Address:Port是你的本地地址和端口 👉Peer Address:Port是目标地址和端口 👉State表示连接状态(ESTAB = 已连接)
3. strace - 跟踪进程的 Socket 系统调用
用途:实时跟踪进程的 Socket 相关系统调用(如
socket,bind,connect,send,recv)。示例:
# 跟踪进程的所有网络相关系统调用 strace -e trace=network -p <PID> # 跟踪特定系统调用(如 connect 和 send) strace -e trace=connect,sendto,recvfrom -p <PID> strace -f -e trace=network -p <PID> # 跟踪进程及其子进程的网络调用 strace -e trace=network -p <PID> -o network.log # 输出到文件 # 查看进程与某个 IP 的交互(结合 grep) strace -p <PID> -s 1024 -e trace=network 2>&1 | grep "1.2.3.4"关键系统调用:
socket():创建 Socket。bind():绑定地址。connect():发起连接。send()/recv():发送/接收数据。accept():接受连接。
** 调试常见网络问题**
场景 1:连接被拒绝
若
connect返回ECONNREFUSED,表示目标端口未监听:connect(3, {sa_family=AF_INET, ...}, 16) = -1 ECONNREFUSED (Connection refused)场景 2:DNS 解析失败
若
getaddrinfo失败,可能是域名解析问题:socket(AF_INET, SOCK_DGRAM, IPPROTO_IP) = 3 sendto(3, "example.com", ...) = 32 recvfrom(3, 0x7ffd..., 1024, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)场景 3:数据传输异常
通过
sendto和recvfrom的返回值,判断是否发送/接收了预期大小的数据:sendto(3, "payload", 1024, 0, NULL, 0) = 512 # 实际发送 512 字节(可能被截断) recvfrom(3, buffer, 4096, 0, NULL, NULL) = -1 EAGAIN # 非阻塞模式下无数据可读
使用场景总结
- 快速定位端口占用:
lsof -i :80或ss -tulnp | grep 80。
- 查看进程的实时网络调用:
strace -e trace=network -p <PID>。
传输层
- 同上
ss
网络层
1. ip addr(IP 地址管理)
作用: 查看、添加或删除网络接口的 IP 地址(替代传统的
ifconfig)。常用命令
| 命令 | 作用 |
|---|---|
ip addr show | 查看所有接口的 IP 地址 |
ip addr add 192.168.1.100/24 dev eth0 | 给 eth0 添加 IP |
ip addr del 192.168.1.100/24 dev eth0 | 删除 eth0 的 IP |
- 输出解析
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::211:22ff:fe33:4455/64 scope link
valid_lft forever preferred_lft forever
1. 第一行:接口状态与基本属性
2: eth0:2是内核分配的接口索引号。eth0是接口名称(通常是以太网卡)。<BROADCAST,MULTICAST,UP,LOWER_UP>:BROADCAST:支持广播通信。MULTICAST:支持组播。UP:接口已启用。LOWER_UP:物理链路已连接(如网线插好)。
mtu 1500:最大传输单元(MTU)为 1500 字节(标准以太网值)。qdisc fq_codel:使用的队列算法为fq_codel(公平队列+流量控制)。state UP:接口处于活动状态。group default:接口属于默认组。qlen 1000:传输队列长度为 1000 个数据包。
2. 第二行:MAC 地址
link/ether 00:11:22:33:44:55:接口的 MAC 地址(物理地址)。brd ff:ff:ff:ff:ff:ff:广播 MAC 地址(所有位为FF表示广播帧)。
3. 第三行:IPv4 地址配置
inet 192.168.1.100/24:- IPv4 地址为
192.168.1.100。 - 子网掩码为
/24(即255.255.255.0)。
- IPv4 地址为
brd 192.168.1.255:广播地址scope global:地址作用域为全局(可跨子网通信)。eth0:地址绑定的接口名称。
附加行:IPv4 地址有效期
valid_lft forever:地址永久有效(无过期时间)。preferred_lft forever:地址永久优先(无临时降级)。
2. ip route(路由管理)
作用: 管理 路由表(决定数据包如何转发)。
常用命令
| 命令 | 作用 |
|---|---|
ip route show | 查看当前路由表 |
ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0 | 添加静态路由 |
ip route add default via 192.168.1.1 | 设置默认网关 |
ip route del 10.0.0.0/24 | 删除路由 |
- 输出解析
default via 192.168.1.1 dev eth0 proto static metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
10.0.0.0/24 via 192.168.1.1 dev eth0
default via 192.168.1.1:默认网关(所有非本地流量走192.168.1.1)。192.168.1.0/24 dev eth0:本地子网,直接通过eth0通信。10.0.0.0/24 via 192.168.1.1:静态路由,访问10.0.0.0/24的流量走192.168.1.1。dev eth0: 数据包出口的网络接口(网卡)proto static: 路由来源:static(手动配置)、kernel(内核自动生成)、dhcp等metric 100: 路由优先级(值越小优先级越高)scope link: 局域网通信
4. ip neigh(ARP 缓存管理)
作用: 查看和管理 ARP 缓存表(IP 和 MAC 地址的映射)。
常用命令
ip neigh show #查看 ARP 表输出解析
192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
192.168.1.100 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALE
lladdr 00:11:22:33:44:55**:对应的 MAC 地址。REACHABLE:ARP 条目有效(STALE表示可能过期)。
5. traceroute(路由追踪)
作用: 显示 数据包从本机到目标主机的路径(经过哪些路由器)。
常用命令 :
traceroute <ip>输出解析
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.456 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms 6.789 ms 7.123 ms
3 203.0.113.1 (203.0.113.1) 10.111 ms 11.222 ms 12.333 ms
4 8.8.8.8 (8.8.8.8) 15.444 ms 16.555 ms 17.666 ms
30 hops max:最多追踪 30 跳(防止无限循环)。