tnc-fhh开源代码之IMCV测试

本文总结了tnc-fhh项目中IMCV对的测试情况,包括exampleimcv、dummyimcv、hostscannerimcv及platidimcv等模块的功能与交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

距离上一次接触tnc-fhh这个开源项目已经过去了一年。最近在看相关论文时无意瞄了眼这个项目的官方文档,就在闲暇(假装很忙^\\^)又重新读了遍官方文档,并跑了跑项目里模拟的IMCV对,这里做个总结。

总体描述:

官方文档位于一级目录下doc/tncfhh.pdf,其中提到tncsim可以在无NAA和NAR的情况下模拟TNCS和TNCC,用来测试IMCV对。tncsim每次加载完IMC和IMV模块后,由IMC模块发起一个TNC握手。加载的模块由/etc/tnc/tncsim_config配置(安装后),在tnc-fhh项目中实现的imcv都分配了特定的消息类型:

  • vendorId-------0x0080ab
  • example-----0xfe       dummy----0x31      clamav----0x41      platid----0x33     attestation----0x34      hostscanner----0x30

每个imcv在启动的时候都会读日志配置文件log4cxx.properties的内容,其实没有这个文件这些imcv都写了默认的日志配置,这里晒个自己配的日志文件,毕竟少一个启动warning是好事。:

#设置rootlogger为DEBUG级别,使用了fa一个Appender
log4j.rootLogger=DEBUG,fa
#对Appenderfa进行设置:
#这是一个控制台的Appender,
log4j.appender.fa=org.apache.log4j.ConsoleAppender
log4j.appender.fa.Threshold=DEBUG
#输出方式(Target)为标准输出,
log4j.appender.fa.Target=System.out
#输出格式(layout)为PatternLayout
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern=[%-5p] %d %l : %m%n

需要注意的是日志的级别应设为DEBUG,但不该更高,否则会丢失运行信息,在log4cxx中,日志优先级为:FATAL >> ERROR >> WARN >> INFO >> DEBUG >> TRACE。

(一)example imcv:

这对imcv只是简单的发送helloworld报文。输出的第一部分截图如下:

发现tncsim先启动S端后启动C端,然后C端就发起了一次TNC握手,终端输出了报文的抓包内容,并且还输出了这些报文的xml格式。其中的关键数据是base64编码的,用解码器解码可得到内容。这里用明文形式表示了其传递的过程:

其中,BatchId为包序号,recipient为接收方。

C                                                                                                      S

 |---->(Example message from ExampleIMC)                                   |  

 |                               (Example message from ExampleIMV)<--------|

 |---->(Another example message from ExampleIMC.)                      |

 |                                                                                    (allow)<-------|

是不是感觉很扯,没错,我也觉得很扯。很古怪的ACL,但毕竟作者在文档里说了这个例子的目的是教你开发IMCV对。

(二)dummy imcv:

接下来是第二个imcv的测试,测试流程如上,协议过程如下:

 

C                                                                                                   S

 |---->(DummyIMC message 0, action = isolate)                            |  

 |                                                                             (isolate)<--------|

好吧,这个更扯淡的ACL。官方文档给出的说法是/etc/tnc/dummyimc.file里的内容将会被IMC发送给IMV,其中仅有allow, isolate, none三个选择,再由IMV给出回应。

 

(三)hostscanner imcv:

再来一个imcv对的测试,这回的看名字就知道是在按port做的ACL,应该会有意思,协议流程如下:

C                                                                                                     S

 |---->(HostScannerIMC active)                                                        |  

 |                                              (TCP20,21,22...UDP631)<--------|

 |---->(TCP20=close...UDP631=open)                                              |

 |                                                                                   (allow)<-------|

(四)platid imcv:

这个imcv一开始总是会出段错误,我用gdb跟踪发现报错发生在log4cxx的一个宏里,好奇葩!在网上找了半天发现该项目的github里有人也问过这问题。后来他通过注解掉对log4cxx的调用做了折中处理。这里说明一下,在一级目录/imcv/plaid/imv/src下的FileCertManager.cpp里注解掉构造函数和虚构函数内容,然后重新make && make install。

          FileCertManager::FileCertManager(const char *certfile)
          {
          //    LOG4CXX_TRACE(logger, "FileCertManager()");
          //    loadCertsFromFile(certfile);
          }
          FileCertManager::~FileCertManager()
          {
          //    LOG4CXX_TRACE(logger, "~FileCertManger");
          }

关于platid与clamav这两个imcv的协议内容,可以参考官方文档,因为报文被RSA加密所以这里不写过程了。

最后

有时间了可以按照官方文档开发一个attestation的imcv,协议流程就按TCG的规范来,当然,这都是后话了^__^假装自己以后有心思折腾这个。

### 使用 TNC-Transformer 进行序列预测 TNC-Transformer 结合了卷积神经网络(CNN)和变压器(Transformer)的优势,能够有效捕捉时间序列中的局部细节以及全局依赖关系。对于使用 TNC-Transformer 模型执行序列预测任务而言,具体实现涉及以下几个方面: #### 数据准备 首先需准备好待预测的时间序列数据,并对其进行必要的预处理操作,比如标准化、归一化等。考虑到模型设计特点,建议采用分块策略将较长的时间序列切分成多个较短片段[^2]。 ```python import numpy as np from sklearn.preprocessing import StandardScaler def preprocess_data(data, patch_size): scaler = StandardScaler() scaled_data = scaler.fit_transform(np.array(data).reshape(-1, 1)) patches = [] for i in range(len(scaled_data)-patch_size+1): patches.append(scaled_data[i:i+patch_size]) return np.array(patches), scaler ``` #### 构建模型架构 根据描述,TNC-Transformer 主要由两大部分构成——缩减单元 (RC) 和正常单元 (NC),其中 RC 负责提取多尺度特征并逐步降低分辨率;而 NC 则侧重于建立不同层次间的关系[^5]。针对序列预测场景,可以适当调整各组件配置以更好地适配实际需求。 ```python import torch.nn as nn import torch class TNCTransformer(nn.Module): def __init__(self, input_dim, hidden_dim, num_heads, num_layers, output_dim): super(TNCTransformer, self).__init__() # Define RC layers here... rc_output_channels = ... # Set appropriate value based on your application self.rcs = nn.Sequential( ConvBlock(input_dim=input_dim, out_channels=rc_output_channels), ... ) d_model = rc_output_channels * ((input_dim // 16)**2) encoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=num_heads) self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) self.fc_out = nn.Linear(d_model, output_dim) def forward(self, src): batch_size, seq_len, _ = src.shape # Pass through RC to get multi-scale features and downsampled representations. rc_outputs = self.rcs(src.view(batch_size*seq_len, -1)).view(batch_size, seq_len, -1) cls_token = torch.randn((batch_size, 1, rc_outputs.size(-1))).to(device) transformer_input = torch.cat([cls_token, rc_outputs], dim=1) pos_encodings = generate_positional_encoding(transformer_input.size(1), transformer_input.size(-1)) transformer_input += pos_encodings.to(device) encoded_seq = self.transformer_encoder(transformer_input.permute(1,0,2)) prediction = self.fc_out(encoded_seq[0]) # Use the class token's representation for final prediction. return prediction ``` 请注意以上代码仅为示意性质,实际开发时还需依据具体情况完善各个模块的具体定义与参数设置。 #### 训练过程 完成上述准备工作之后即可进入训练环节。此期间应充分利用已有的无标注或弱标注的数据资源实施有效的自监督学习机制,从而提升模型泛化能力[^1]。与此同时,在有限规模的带标签样本集上开展微调工作有助于进一步提高性能表现。 ```python criterion = nn.MSELoss() # Or other suitable loss function depending on task nature optimizer = optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): model.train() running_loss = 0.0 for inputs, targets in train_loader: optimizer.zero_grad() outputs = model(inputs.float().to(device)) loss = criterion(outputs.squeeze(), targets.float().to(device)) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader)}') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值