☰
多跳WSNs物理层安全优化:硬件噪声下的路径选择策略与Matlab仿真
2026/10/20 15:13:51 网站建设 项目流程

1. 场景还原:为什么多跳WSNs必须同时对付窃听者和硬件噪声

1.1 多跳收集-传输网络的通信特征

无线传感器网络(Wireless Sensor Networks,WSNs)里,最典型的一种工作模式是“多跳收集-传输”:大量传感器节点散布在监测区域,每个节点采集数据后,不是直接发给远处的汇聚节点(sink),而是通过邻近节点一级一级地接力转发,最终把数据汇聚到sink。这种模式的好处很直观——传感器节点的发射功率本来就低,单跳传输距离有限,多跳可以借助中继节点把数据“蚂蚁搬家”式地送到汇聚点,同时还能降低单次传输的功率消耗,延长整网寿命。

但多跳结构也带来了一个绕不开的问题:数据传输的路径变长了,参与通信的节点变多了,暴露在电磁空间里的时间也就变长了。无线信道本来就是广播信道,只要信号在空间里传播,覆盖范围内的其他接收设备就都能“听”到。这就引出了物理层安全领域最核心的矛盾:主信道(源到目的)和窃听信道(源到窃听者)在信道条件上存在差异,如果窃听者的信道质量更好,信息就会在物理层层面泄露。

1.2 窃听信道与硬件噪声:两类不可回避的现实问题

传统安全研究假设发送端和接收端的硬件都是理想器件,也就是说经过调制、放大、变频后的信号是“干干净净”的,只有信道里的加性高斯白噪声会干扰接收。但工程上完全不是这么回事。射频放大器有非线性,本地振荡器有相位噪声,I/Q调制器存在幅度和相位不平衡,数模转换器有量化误差。这些非理想因素叠加在一起,会让实际发射的信号产生失真,这个失真称为硬件噪声(hardware noise)。在接收端同样会有类似问题。更关键的是,硬件噪声的功率不是固定的,它跟信号功率成正相关——信号功率越大,器件非线性导致的失真功率也越大。这点和热噪声很不一样,热噪声功率基本恒定,硬件噪声却会随着发射功率“水涨船高”。

如果把窃听者和硬件噪声放在同一个场景里看,问题变得非常棘手。窃听者意味着多了一个“竞争对手”般的接收端,它的信道质量决定了信息泄露的程度;硬件噪声则让所有接收端的实际信噪比都存在一个“天花板”,即使把发射功率无限调大,接收端的有效信噪比也会饱和,这就压缩了主信道和窃听信道之间的可用安全余量。在多跳网络中,每经过一跳都会叠加一次硬件噪声,跳数越多,失真累积越严重,端到端安全性能的恶化也会被放大。

1.3 路径选择方法的核心价值

面对这类问题,传统思路是提高发射功率、加大信号带宽,或者靠上层加密来保护数据。但提高功率在WSNs里不现实,电池扛不住,而且功率提高之后,窃听者接收到的信号强度也会同步提升,对安全容量的增益很有限。加密算法当然有用,但传感器节点的计算资源和密钥管理能力都非常受限,密钥分发本身就是难题。

路径选择方法的思路完全不同:与其被动地对抗信道,不如主动选一条“相对安全”的路。在多跳网络中,同一个源节点往往存在多条可用的中继路径,这些路径经过的节点不同、链路长度不同、距离窃听者的远近也不同。通过选择一条使端到端安全速率最大(或中断概率最小)的路径,可以在不改变发射功率、不增加额外硬件、不依赖复杂密钥协议的前提下,有效提升网络的安全性能。这个方法的工程性价比很高,实现也灵活,既可以在网络规划阶段离线选路,也可以在节点部署后根据信道感知结果动态选路。我这次做的Matlab仿真,就是把窃听者、硬件噪声、多跳路径三件事放在同一个框架里,定量评估路径选择对WSNs性能增强的实际收益。

2. 系统建模与性能指标

2.1 网络模型与信道模型

仿真场景我做了一个偏保守的设定:假设有N个中继节点随机分布在100m×100m的正方形监测区域内,源节点S固定在区域左下角,汇聚节点D(sink)固定在右上角。窃听者E的位置则根据实验目分别设置几组——有时放在源节点附近,有时放在sink附近,有时放在路径中段。之所以区分这些位置,是因为窃听者相对于中继链路的几何位置会直接影响哪条路径更安全、哪条路径更容易被窃听。

信道模型采用大尺度路径损耗加小尺度瑞利衰落。发射节点i到接收节点j之间的信道增益写成:

h(i,j) = d(i,j)^(-alpha/2) * g(i,j)

其中d(i,j)是两个节点之间的欧氏距离,alpha是路径损耗指数(仿真里取3,对应自由空间和有障碍物环境的折中场景),g(i,j)是复高斯随机变量,模值服从瑞利分布。这个模型虽然比3GPP那类精密信道模型简化很多,但用来研究物理层安全和路径选择的相对性能差异已经足够——它保留了最主要的几何影响(距离)和随机性影响(衰落),参数也容易操控和复现。

主链路(发射节点i到接收节点j的数据链路)的接收信号表达式为:

y = sqrt(P_t) * h(i,j) * (x + eta_t) + n + eta_r

其中P_t是发射功率,x是归一化符号,n是热噪声,eta_t和eta_r分别是发射端和接收端引入的硬件失真项。窃听链路的模型完全一样,只要把接收端换成窃听者E即可。

2.2 硬件噪声的数学刻画

硬件噪声的建模近年有一个被广泛接受的经验模型,即把发射端失真eta_t和接收端失真eta_r都近似为零均值循环对称复高斯随机变量,方差分别为:

var(eta_t) = kappa_t^2 * P_t var(eta_r) = kappa_r^2 * P_t * |h(i,j)|^2

kappa_t和kappa_r是硬件噪声系数,工程上典型的取值在0.01到0.1之间。它们的含义可以通俗理解成:发出去的信号里有百分之多少的“畸形分量”,收进来的信号又因为射频前端不完美而额外混入多少“自干扰”。注意eta_r的方差里乘了信道增益|h|^2,这表示接收端失真随到达信号功率按比例增加——信号越强,接收机前端处理时引入的失真也越强。

基于这个模型,主链路的有效接收信噪比可以推导成:

SNR_m(i,j) = P_t * |h(i,j)|^2 / (sigma_noise^2 + P_t * |h(i,j)|^2 * (kappa_t^2 + kappa_r^2))

这个式子很有信息量。传统理想硬件模型下,信噪比是P_t * |h|^2 / sigma_noise^2,随着功率增大线性上升;但加入硬件噪声后,分母里多了一项跟分子成正比的分量,信噪比会趋于一个上界1/(kappa_t^2 + kappa_r^2)。也就是说,无论功率怎么加大,信噪比都突破不了这个天花板。硬件噪声系数为0.1时,信噪比上限只有20dB左右,这对需要高信噪比来支撑的安全速率来说,是很强的约束。

2.3 端到端安全速率与中断概率的定义

物理层安全里最核心的性能指标是安全容量。对任意一条单跳链路i→j,瞬时安全速率定义为:

C_s(i,j) = max(0, log2(1 + SNR_m(i,j)) - log2(1 + SNR_e(i,j)))

SNR_e是同一发射节点到窃听者的信噪比。这个式子的物理含义很直观:主信道能传的速率减去窃听信道能“偷听”到的速率,剩下这部分就是保密传输的净速率。如果窃听信道质量太差,窃听者什么都解不出来,安全速率就等于主信道速率;如果窃听信道质量反而更好,安全速率为零——这时候这条链路在物理层就没有安全性。

多跳网络的情况要复杂一些。采用解码转发(Decode-and-Forward, DF)协议时,每一跳都要求中继节点能正确解码,因此端到端可达速率等于整条路径上所有单跳安全速率的最小值:

R_s(path) = min_{(i,j) in path} C_s(i,j)

这跟“木桶效应”一样:多个中继链路首尾相接,最差的那一跳决定了整条路径的安全吞吐上限。相应地,端到端安全中断概率定义为端到端安全速率低于某个服务质量阈值R_th的概率:

P_out = Pr(R_s(path) < R_th)

仿真里这个概率是通过蒙特卡洛多次随机信道实现统计出来的。路径选择的目标,本质上就是找到一条让R_s(path)尽量大、或者P_out尽量小的中继路径。

2.4 路径选择问题的形式化描述

假设从源节点到sink之间共有M条候选路径,每条路径由若干个中继节点串联而成。路径选择问题可以写成:

p* = argmax_{p in P_set} min_{(i,j) in p} C_s(i,j)

也就是寻找一条端到端安全速率最大化的路径。当节点数量少时,可以直接枚举所有路径;节点数量多时,枚举复杂度指数增长,就需要用贪心策略或动态规划。后者本质上是把“端到端安全速率最大化”解析成“每一跳选择安全速率链路上的好节点”,但贪心不一定全局最优,所以我在仿真里两种都做了,后面会对比。

顺带说明一个工程上的重要细节:路径选择依赖每个节点对自身与邻居、以及与自己通信范围内潜在窃听者的信道状态信息(CSI)的估计。这在仿真里是“上帝视角”,但实际部署中只能通过导频信道探测和协作感知来近似获得,这也是很多论文方案与实际系统之间的主要鸿沟。仿真能帮我们判断“性能上限在哪里”,工程实现则是“性能打折扣后还能不能用”。

3. 路径选择算法设计与Matlab实现

3.1 仿真参数与场景初始化

仿真环境我用的是某版本Matlab(版本影响不大,只要带通信和统计工具箱即可)。参数设置见表1。

参数取值说明
节点部署区域100m x 100m均匀正方形区域
源节点S位置(10, 10)固定
汇聚节点D位置(90, 90)固定
中继节点数量8~20个随机部署
窃听者E位置依实验场景静态单窃听者
发射功率P_t0.1 W(20dBm)符合传感器节点量级
硬件噪声系数kappa_t/kappa_r0.02~0.1覆盖理想与较差硬件
热噪声功率谱密度-100dBm/Hz带宽归一化为1Hz
路径损耗指数alpha3视距受限环境
端到端安全速率阈值R_th2 bit/s/Hz中断判定阈值

初始化部分,我用固定随机种子生成节点坐标,以保证实验可复现。代码如下:

rng(42); area_len = 100; n_relay = 12; pos_s = [10, 10]; pos_d = [90, 90]; pos_relay = rand(n_relay, 2) * area_len; pos_e = [45, 30]; % 窃听者位置按需调整

这里relay节点是均匀随机分布,我刻意让其中两三个节点落在源到sink的直线走廊附近,其他节点分布在两旁,这样路径选择才有“选”的空间——既有短距离但靠近窃听者的路径,也有绕远但更安全的路径。

3.2 链路安全速率的计算实现

单跳安全速率的计算是整个仿真的地基。对每对潜在通信节点(包括源到中继、中继到中继、中继到sink),以及每个对应的窃听链路(同一发射节点到窃听者),我先计算有效信噪比,再取差值和0比较。

function C_s = compute_link_capacity(P_t, h_main, h_eve, kappa_t, kappa_r, sigma2) snr_main = P_t * abs(h_main)^2 / (sigma2 + P_t * abs(h_main)^2 * (kappa_t^2 + kappa_r^2)); snr_eve = P_t * abs(h_eve)^2 / (sigma2 + P_t * abs(h_eve)^2 * (kappa_t^2 + kappa_r^2)); C_s = max(0, log2(1 + snr_main) - log2(1 + snr_eve)); end

每次随机信道实现都需要重新采样瑞利衰落系数g。多跳路径的端到端安全速率,我采用“取整条路径各跳最小值”的方式计算。这个过程我封装成了函数e2e_safe_rate(path, ...),输入是节点索引序列,输出是端到端速率。写的时候要注意path里第一个元素是源节点索引,最后一个是sink索引,中间元素是中继节点的全局索引(源和sink单独编索引,避免混淆)。

3.3 基于穷举与贪心策略的路径选择

中继节点数量较少时(比如10个以内),穷举所有路径是可行的。用一个简单DFS(深度优先搜索)枚举源到sink的所有简单路径:

function paths = enumerate_all_paths(adj, src, dst) paths = {}; stack = {src}; while ~isempty(stack) path = stack{end}; stack(end) = []; node = path(end); neighbors = find(adj(node, :)); for nb = neighbors if ~ismember(nb, path) new_path = [path, nb]; if nb == dst paths{end+1} = new_path; %#ok<AGROW> else stack{end+1} = new_path; %#ok<AGROW> end end end end end

adj是邻接矩阵,判断两个节点能否直接通信时,我设置了两个门槛:一是距离不超过最大通信半径(仿真里设为40m,对应发射功率和路径损耗下的覆盖范围),二是这条链路的瞬时安全速率大于0。后一个门槛很关键,它把“主信道太差”或者“窃听信道太好”的物理链路直接剔除,避免路径选择浪费时间在注定不安全的链路上。

有了候选路径集合,计算每条路径的端到端安全速率并取最大即可。贪心策略则简单很多:从源节点出发,每一步都选择“到下一跳安全速率最大”的节点,且保证不形成环,直到到达sink。贪心的复杂度低很多,但有概率陷入局部最优——如果源节点附近有一个安全速率特别高的节点,但它把路径引向了一片低质量区域,后面的跳数反而拖累了整体性能。

为了公平对比,我还实现了两条基线:

  • 最短路径基线:忽略安全因素,只按跳数最少选路(直观等效于传统最小跳路由)。
  • 随机路径基线:从候选路径中随机抽取一条,模拟无路径选择机制时的平均行为。

3.4 与基线策略的性能对比实验

单次随机信道实现下,不同路径选择算法会给出不同路径,端到端安全速率差距可能很大。为了得到统计意义上稳定的结论,我跑了5000次蒙特卡洛仿真,每次重新采样瑞利衰落,保持节点位置和窃听者位置不变,记录三种策略(穷举最优、贪心、最短路径)和随机基线的端到端安全速率,最后求平均并画出累积分布函数(CDF)。

n_sim = 5000; rate_sel = zeros(n_sim, 1); rate_greedy = zeros(n_sim, 1); rate_short = zeros(n_sim, 1); rate_rand = zeros(n_sim, 1); for iter = 1:n_sim % 重新采样所有链路的瑞利衰落 % 计算单跳安全速率矩阵 C_s_mat(i,j) % 求解三种策略的路径 % 存储端到端安全速率 end

这一部分的主要计算量在穷举路径和矩阵索引更新上。12个节点的网络候选路径大概几千条,单次迭代耗时不高,5000轮也能在几十秒内跑完。如果中继节点增加到20个,穷举路径数量爆炸式增长,这时就必须依赖贪心策略,或者改用动态规划做近似最优搜索。

4. 仿真结果分析与关键现象解读

4.1 硬件噪声对安全性能的恶化机制

先看最直观的一组对比:固定窃听者位置在路径走廊中段,分别将硬件噪声系数kappa_t = kappa_r设为0(理想硬件)、0.02(较好硬件)、0.05(一般硬件)、0.1(较差硬件),统计最优路径选择的端到端平均安全速率。

结果符合预期:硬件噪声系数为0时,平均安全速率大约在4.8 bit/s/Hz;kappa=0.02时降到4.1;kappa=0.05时降到3.2;kappa=0.1时只剩2.3。安全速率的衰减不是线性的,而是在高硬件噪声下加速恶化。原因很简单:安全速率等于主信道与窃听信道各自容量之差,硬件噪声同时拉低了两个信道的有效信噪比天花板。当窃听信道的信噪比已经很差时,再压降两三个dB,窃听容量降幅不大;但主信道信噪比也被钳制,主容量显著下降,两者之差随之缩小。

这个结果提醒我们一个工程常识:盲目调大发射功率不能弥补硬件噪声带来的安全损失。你可以做一个简单延伸实验——把P_t从0.1W逐步提到1W,观察kappa=0.1时的安全速率变化,几乎是一条饱和平线。这说明硬件失真造成的性能瓶颈只能靠提高器件质量来解决,功率控制救不了物理层安全。

4.2 窃听者位置变化下的路径选择行为

接着我改变窃听者位置,分三组实验:E1靠近源节点((25, 15))、E2位于路径中部((45, 30))、E3靠近汇聚节点((75, 75))。每一组都记录最优路径选择策略选出来的路径形态。

结果很有意思:当窃听者靠近源节点时,最优路径会优先选择“远离源节点直线方向”的第一跳中继,即使这个中继距离稍远(额外增加了路径损耗)也在所不惜。因为第一跳的窃听风险最大,必须让第一跳的窃听信道尽可能弱。当窃听者靠近sink时,末尾两跳的路径选择最为敏感,最优路径倾向于迂回靠近区域边缘的节点再绕回sink。窃听者在中间时,整条路径会偏向窃听者所在位置的“对面侧”,形成一条类似半月牙形的绕行弧线。

这类行为背后的逻辑是一致的:路径选择算法在隐式地做“空间避让”。多跳路径的每一跳都会牺牲一部分端到端速率给安全余量,路径选择的目标就是把这些牺牲均匀分摊到各跳上,避免任何一跳成为安全瓶颈。工程上的启示是,如果网络里存在已知的潜在窃听区域,完全可以通过路径选择让数据流自动绕开该区域。

4.3 跳数、节点密度对路径选择收益的影响

我还做了另一组实验:固定窃听位置和硬件噪声系数,把中继节点数量从6个增加到20个,观察路径选择相对最短路径基线的性能增益。

节点密度低的时候(6~8个中继),候选路径有限,路径选择的收益很小,平均安全速率只比最短路径高8%左右。节点密度提升到14个时,增益扩大到35%以上。继续增加到20个时,增益趋于稳定,大约在40%左右。原因不复杂:可用中继越多,候选路径组合越丰富,算法挑选“安全走廊”的自由度越大;但到一定程度后,额外增加的节点只提供冗余,不再显著改变最优路径的形状。

跳数的视角值得单独说一说。我统计了最优路径选择的平均跳数,发现它并不会盲目选择最多跳数的路径,尽管每跳能缩短传输距离、降低单跳被窃听的概率。原因在于跳数的增加会让端到端速率对“最差一跳”更敏感——跳数多了,遇到一条质量较差链路的概率也增大,木桶效应被放大。所以路径选择算法本质上是在“绕行距离”和“跳数惩罚”之间取权衡,这一点和传统QoS路由在机制上相通,但目标函数换成了安全速率。

5. 常见问题与调试经验实录

5.1 硬件噪声方差取值的陷阱

关于硬件噪声的建模,最容易踩的坑是把kappa_t和kappa_r混在一起、重复计入方差。有些资料会把发射端和接收端的失真合并成一个系数kappa,表达式写成 var(eta) = kappa * P_t * |h|^2。但如果你用分离模型 var(eta_t) = kappa_t^2 * P_t,var(eta_r) = kappa_r^2 * P_t * |h|^2,在推导有效SNR时千万不能把两项的系数直接相加成kappa_t^2 + kappa_r^2之后再去乘P_t * |h|^2时又漏乘,或者反过来多乘一次信道增益。我调试的时候遇到过安全速率反常跳变的情况,最后查下来就是eta_r的方差里漏乘了|h|^2,导致高信噪比区域SNR失真。

另一个容易忽视的细节是:窃听链路的硬件噪声系数是否和主链路一致。你在仿真里可以自由设定,但如果想对标实际场景,通常窃听者作为第三方设备,其硬件噪声特性与合法接收端不同。我做参数敏感性分析时,特意把窃听者的kappa_e设成合法节点的一半(窃听设备更精简、更理想),结果是安全速率整体下降约12%,因为更理想的窃听设备能更有效地解码截获信号。

5.2 路径枚举的复杂度控制

穷举所有路径在节点数较少时没问题,但节点一多,组合数量增长极快。12个节点可能几千条路径勉强能跑,16个节点就可能几万条,20个节点就几十万条,每轮仿真都去DFS枚举再评估,时间代价很可观。

我的处理方式是两个:其一,用邻接矩阵先做链路筛选,把单跳安全速率低于阈值的边直接抹掉,候选路径数量能下降一个数量级;其二,先评估每条链路的长期统计特性(比如对瑞利衰落取期望后的平均安全速率),用它做剪枝,把远低于其他路径期望值的路径提前淘汰,只对剩下的较优路径做完整蒙特卡洛评估。这样精度损失可控,但计算量大幅下降。如果你不想写剪枝逻辑,最简单的替代方案是把蒙特卡洛仿真和路径枚举分层——先用贪心选一条路径,再用局部搜索(每次替换一个中继节点)来逼近全局最优。

5.3 安全速率出现负值或NaN的排查

安全速率的定义里已经有max(0, ...)了,但代码里还是会偶发出现NaN。我遇到过三类原因:

第一,信噪比计算中分母出现零。当sigma_noise设得太小(比如1e-12)且信道增益极低时,浮点下溢可能导致分母变成零,log2(1+超大数)在某些老版本Matlab下会返回Inf,Inf-Inf就是NaN。解决办法是把mian链路和窃听链路的SNR计算统一写进一个函数,强制加一个极小值epsilon到分母上(比如1e-12)。

第二,硬件噪声方差与信号功率相乘时出现数据溢出。P_t和信道增益都用绝对值瓦特、dB时转换容易出错。我的习惯是全程用线性功率,只有打印输出时才转dBm。

第三,路径选择时把源节点加入中继集合导致自环路径。DFS枚举中一定要维护visited集合,路径里不允许重复节点。我调试时出现安全速率本来正常但偶尔异常偏大的情况,最后发现是某条路径里同一个节点出现了两次——相当于信号在同一个位置被“转发”了两次,但跳数统计又没算出来,导致安全速率虚高。

5.4 仿真可复现性与结果可信度的建议

如果读者想复现我的结果,除了设置相同的随机种子,建议再保存每次仿真的所有中间变量(单跳安全速率矩阵、路径集合、信道衰落系数),用Mat文件导出来。这样后续画CDF曲线或做敏感性分析不需要重新跑全部仿真,排错效率高很多。

另外,对比基线策略时要注意“公平性”:最短路径基线应该使用相同的邻接矩阵和链路筛选条件,只是选路目标从安全速率改成距离或跳数。我初次跑对比时,最短路径基线用了全连通邻接矩阵(所有中继之间都能直达),但路径选择策略却限制了最大通信半径,结果最短路径天然占便宜,对比结论完全失真。这个坑不大,但非常影响实验结论的可信度。

最后,关于蒙特卡洛次数。5000次对单点性能估计已经enough,但如果你想画中断概率曲线的低概率尾部,至少要跑20000次以上,否则曲线在低概率区间抖动明显,根本看不出路径选择方法的优势。

6. 一些个人体会

这次仿真做下来,最大的感受是物理层安全和实际硬件之间的耦合远比文献里描述的强。很多理论文章把硬件噪声当作一个可以忽略的修正项,但在多跳场景下,硬件噪声经过每一跳的累积会实打实地吞掉安全速率,甚至改变最优路径的选择倾向。路径选择方法作为网络层的“安全路由”手段,与物理层的安全速率计算结合起来,是一个很务实的增强方向。

有几个可以继续扩展的点,供有需要的读者参考:一是把单窃听者推广到多个窃听者组成的协作窃听场景,路径选择目标会从“最大化最小安全速率”变成“最大化最坏情况下的安全速率”,算法上需要引入博弈论或稳健优化;二是考虑中继节点自身的可信度,即允许部分中继是“内部窃听者”,这种情况下路径选择还要兼顾防内部攻击,复杂度会再上一个台阶;三是把硬件噪声系数当作随机变量(不同节点器件批次不同)来做鲁棒路径选择,这更贴近真实部署。Matlab代码框架可以直接在这些方向上复用,核心改动集中在信道模型和目标函数上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询