现代操作系统的内核(如 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 的网络部分是一个庞大的子系统,主要包括以下几个关键模块:

使TIMCPAsPCsyos/cc_线uksU/reoDWltcPD+i,--k------aA--F-AeTtRitP--t--r--IT--aP---eI--(--a--PT-----l--)--n--L--L---n--S,--s----i--N-e--o--p----n--I-t--cs--o----k--C-,--ky--r---------es--t----L--D---t_------a--r---s--L----y--i---Le--a----e--v---an--y----r--e---yd--e------r---et--r---------ro-----------(-----------)------------------------------------------------------------------------------------------------------------+++++++++++

✅ 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)

    NNeettffIiiTPllCttPMee/ArrUCDPIPRNEPRUOTUTINGDNAT

✅ 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:类型(如 IPv4IPv6)。
    • NODE:协议(如 TCPUDP)。
    • NAME:连接地址(如 localhost:8080->1.2.3.4:443)。

2. netstatss - 网络连接统计

  • 用途:查看系统网络连接、路由表、接口统计等(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。
  • 输出示例:

    NtuecdtppidSEUtSNaTCtAOeBNNR00ecv-QS00end-QL1*o9:c25a.3l1563A8d.d1r.e1s0s0::P5o4r3t21Pee3r9*.:A1*d5d6r.e6s6s.:1P8o:r8t0

    👉 Rec-QSend-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:数据传输异常

    通过 sendtorecvfrom 的返回值,判断是否发送/接收了预期大小的数据:

    sendto(3, "payload", 1024, 0, NULL, 0) = 512  # 实际发送 512 字节(可能被截断)
    recvfrom(3, buffer, 4096, 0, NULL, NULL) = -1 EAGAIN  # 非阻塞模式下无数据可读
    

使用场景总结

  1. 快速定位端口占用
    • lsof -i :80ss -tulnp | grep 80
  2. 查看进程的实时网络调用
    • 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 eth0eth0 添加 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: eth02 是内核分配的接口索引号。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)。
  • 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 跳(防止无限循环)。