2、网络基础回顾:TCP/IP协议栈、路由表与策略路由、Netfilter框架简介

各位同学,咱们今天聊点实在的。边缘计算设备嘛,说白了就是要在各种网络环境下都能稳定工作。你想想看,一个设备可能同时连着4G、Wi-Fi、还有有线以太网,怎么让它们协同工作?这就得从网络基础说起了。

我个人习惯,讲网络必先讲TCP/IP协议栈。这东西就像网络世界的交通规则,不懂它,后面所有优化都是瞎搞。

2.1 TCP/IP协议栈:数据包的“快递流水线”

TCP/IP协议栈,其实就是一套数据打包和解包的流程。我经常跟团队里的小朋友说,你就把它想象成寄快递:

  • 应用层:你要寄的东西本身,比如HTTP请求、MQTT消息
  • 传输层:填快递单,TCP保证不丢件,UDP只管发不管到
  • 网络层:写收件地址,也就是IP地址,决定包裹往哪个方向走
  • 链路层:实际送货的卡车和道路,比如以太网帧、Wi-Fi信号

我在项目中遇到过一个问题:设备上报数据偶尔会丢失。查了半天,发现是应用层直接用了UDP,但没做重传机制。后来改成TCP,问题就解决了。嗯,这里要注意——TCP虽然慢一点,但可靠。边缘计算里,控制指令必须用TCP,数据采集可以用UDP。

核心要点:数据从应用层一路向下,每层加一个头部,这叫“封装”。接收端再一层层拆开,这叫“解封装”。整个过程就是协议栈在做的事。

2.2 路由表:数据包的“导航地图”

路由表,说白了就是设备内部的一张地图。数据包要出门,得先查这张表,看看走哪条路。

咱们用Linux系统举个例子。你执行 ip route show,会看到类似这样的输出:

default via 192.168.1.1 dev eth0 proto static 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 
10.0.0.0/8 via 10.0.0.1 dev wlan0 proto static

这三条规则什么意思?

  • 第一条:默认路由。所有不知道往哪走的包,都扔给192.168.1.1(通常是你的路由器)
  • 第二条:本地局域网。192.168.1.x网段的包,直接走eth0网卡发出去
  • 第三条:特定网段。去10.x.x.x的包,走wlan0无线网卡

路由匹配的原则是最长前缀匹配。什么意思?就是谁的掩码越长,谁优先。比如目标IP是10.0.0.5,它既匹配默认路由(掩码0),也匹配第三条(掩码8),那肯定走第三条。

避坑指南:我曾经在调试多网卡设备时,发现ping外网总是超时。查了半天,原来是默认路由配了两条,一条走eth0,一条走wlan0。系统随机选了一条,结果选到了没插网线的那张卡。记住:默认路由只能有一条,除非你用策略路由。

2.3 策略路由:让数据包“按需选路”

普通路由表只能根据目标IP选路。但边缘计算设备往往有多个网络接口,需求更复杂。比如:

  • 视频流走4G,因为带宽大
  • 控制指令走有线,因为延迟低
  • 日志数据走Wi-Fi,因为省钱

这时候就需要策略路由了。它允许你根据源IP、端口、协议类型等条件,选择不同的路由表。

Linux里实现策略路由,主要靠 ip rule 命令。举个例子:

# 创建两个独立的路由表
echo "100 eth0_table" >> /etc/iproute2/rt_tables
echo "200 wlan0_table" >> /etc/iproute2/rt_tables

# 配置路由表内容
ip route add default via 192.168.1.1 dev eth0 table eth0_table
ip route add default via 10.0.0.1 dev wlan0 table wlan0_table

# 添加策略规则:从eth0来的包,查eth0_table
ip rule add from 192.168.1.100 table eth0_table priority 100
# 添加策略规则:目标端口是80的包,走wlan0_table
ip rule add ipproto tcp dport 80 table wlan0_table priority 200

你看,这样就能实现精细化的流量控制。我在做工业网关项目时,就用这个方案让PLC控制数据走有线,监控视频走4G,互不干扰。

注意:策略路由的优先级数字越小,优先级越高。如果多条规则匹配,系统会选优先级最高的那条执行。我曾经因为优先级设反了,导致所有流量都走了4G,月底一看流量费,心都在滴血。

2.4 Netfilter框架:数据包的“交通警察”

Netfilter是Linux内核里的一个钩子框架。说白了,它允许你在数据包经过协议栈的特定位置时,插入自定义的处理逻辑。

数据包在协议栈里会经过五个关键点:

钩子点 位置 典型用途
NF_IP_PRE_ROUTING 数据包刚进来,还没做路由决策 DNAT(目标地址转换)
NF_IP_LOCAL_IN 数据包要发给本机 防火墙过滤
NF_IP_FORWARD 数据包要转发到其他网口 转发控制、NAT
NF_IP_LOCAL_OUT 本机发出的数据包 SNAT(源地址转换)
NF_IP_POST_ROUTING 数据包即将离开本机 MASQUERADE(伪装)

我们常用的iptables,其实就是Netfilter的用户态配置工具。你写的每一条iptables规则,最终都会变成Netfilter框架里的一个钩子函数。

举个例子,边缘设备做NAT上网:

# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 添加MASQUERADE规则,让内网设备通过eth0上网
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 允许转发流量通过
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

这段配置,说白了就是让内网设备(wlan0侧)能通过eth0访问外网。MASQUERADE会自动把内网IP换成eth0的IP,外网回包时再自动换回来。

实战经验:我在做车载边缘计算设备时,遇到过一个问题:4G模块拨号成功后,设备能ping通外网,但内网其他设备却上不了网。查了半天,发现是忘了开IP转发。就一行命令的事,折腾了我两个小时。所以,做网关类功能,第一件事就是检查 ip_forward 有没有开

2.5 三者如何协同工作?

咱们把这三个东西串起来,看看一个数据包从内网设备发出,到访问外网服务器,经历了什么:

  1. 应用层生成HTTP请求,交给TCP/IP协议栈
  2. 协议栈封装成IP包,目标IP是外网服务器
  3. 数据包到达 NF_IP_LOCAL_OUT 钩子点,iptables检查是否需要SNAT
  4. 策略路由,根据源IP或端口,决定走哪张路由表
  5. 路由表,找到下一跳地址和出接口
  6. 数据包到达 NF_IP_POST_ROUTING 钩子点,执行MASQUERADE
  7. 通过物理网卡发出去

你看,每一步都有明确的分工。TCP/IP协议栈负责封装和解封装,路由表负责选路,Netfilter负责在关键节点做修改和过滤。三者缺一不可。

我的建议:刚开始学的时候,别急着搞复杂配置。先在一台Linux虚拟机上,用 tcpdump 抓包看看数据包是怎么走的。亲眼看到SYN、ACK、FIN这些标志位,比看一百遍理论都管用。

好了,网络基础就回顾到这里。下一章咱们开始实战,用这些知识来配置多网络接口的切换和负载均衡。到时候你会发现,今天讲的这些东西,每一个都会用到。