组建隧道中转流量(自建IPLC实现落地)

组建隧道中转流量(自建IPLC实现落地)

1. 前言

突然之前,电报群热烈讨论“隧道中转流量”。非常好奇这是什么技术,本着不懂就问的真理,询问大佬。大佬回答是: 10 块包安装。emmm……生命不息,折腾不止!我自己研究去吧!Google、Baidu 一圈后,在知乎上找到较为贴切问题的帖子,出自大佬 @iCodex (帖子链接见文末)。

我也是刚刚了解 隧道 方面的知识,如有错误请大佬指出。

2. IPLC、MPLS、隧道

我们目标建立的“隧道”概念,与 IPLC 有类似之处,所以先来了解一下。IPLC 粗暴点理解就是专线,直接用网线连接两边用户,不需要经过宽带运营商的机房。具体请看图:

在这里插入图片描述

那什么是 MPLS ?实际上我们无法通过软件手段实现物理层面上的两台服务器直接相连,不能完全达到 IPCL 的效果。所以将通过软件手段实现的“类 IPCL ”称为 MPLS。

至于 隧道 可以理解为一条通过软件构建的虚拟的网线,它直接连接两台服务器的。构建完成的架构图:

在这里插入图片描述

3. 进一步了解隧道

就我目前了解,隧道的实现方案有两类:

  • 使用 Zerotier、WireGuard 。将两台服务器组建在一个内网中,完成隧道部署后,两台机器就相当于在同一 WIFI 下的两台电脑,数据在内网中直接传输。
  • 使用 Stunnel、GOST 的 TLS 加密隧道。服务器 A 将数据加密后传输,到达服务器 B 后,服务器 B 解密转发到目标服务器(如 油土鳖等)

第二类方案操作比较简单,理解起来也比较容易,但缺点是 TLS 等加密方案大多都是基于 TCP 的,所以对这类隧道对 UDP 的支持较差。而第一类方案可以较好地支持 UDP 转发,但由于本身是特定的加密协议ÿ

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用观察者模式来实现对指定点位值的变化进行监控。具体实现步骤如下: 1. 定义一个PLC接口,包含连接、读取、写入操作方法。 ``` public interface IPlc { void Connect(); object Read(string address); void Write(string address, object value); } ``` 2. 定义一个PLC实现类,实现IPlc接口,包含连接、读取、写入操作方法的具体实现。 ``` public class SiemensPlc : IPlc { public void Connect() { // 连接到西门子PLC } public object Read(string address) { // 读取指定地址的值 } public void Write(string address, object value) { // 写入指定地址的值 } } ``` 3. 定义一个PLC连接管理类,包含多个PLC实例,以及连接、读取、写入操作方法。 ``` public class PlcConnectionManager { private List<IPlc> _plcs = new List<IPlc>(); public void AddPlc(IPlc plc) { _plcs.Add(plc); } public void ConnectAll() { foreach (var plc in _plcs) { plc.Connect(); } } public object Read(string address) { foreach (var plc in _plcs) { var value = plc.Read(address); if (value != null) { return value; } } return null; } public void Write(string address, object value) { foreach (var plc in _plcs) { plc.Write(address, value); } } } ``` 4. 定义一个观察者接口,包含值变化通知方法。 ``` public interface IValueObserver { void ValueChanged(string address, object value); } ``` 5. 定义一个被观察者类,包含被监控的点位集合、添加观察者、移除观察者、通知观察者值变化的方法。 ``` public class PlcValueSubject { private Dictionary<string, object> _values = new Dictionary<string, object>(); private List<IValueObserver> _observers = new List<IValueObserver>(); public void AddObserver(IValueObserver observer) { _observers.Add(observer); } public void RemoveObserver(IValueObserver observer) { _observers.Remove(observer); } public void SetValue(string address, object value) { if (_values.ContainsKey(address)) { var oldValue = _values[address]; if (!oldValue.Equals(value)) { _values[address] = value; NotifyValueChange(address, value); } } else { _values.Add(address, value); NotifyValueChange(address, value); } } private void NotifyValueChange(string address, object value) { foreach (var observer in _observers) { observer.ValueChanged(address, value); } } } ``` 6. 定义一个实现观察者接口的类,实现值变化通知方法,用于处理指定点位值的变化。 ``` public class PlcValueObserver : IValueObserver { private string _address; private PlcValueSubject _subject; public PlcValueObserver(string address, PlcValueSubject subject) { _address = address; _subject = subject; } public void ValueChanged(string address, object value) { if (_address == address) { // 处理指定点位值的变化 } } } ``` 7. 在程序中使用PlcConnectionManager、PlcValueSubject、PlcValueObserver类实现读取和写入数据,并监控指定点位的值变化。 ``` var manager = new PlcConnectionManager(); var subject = new PlcValueSubject(); subject.AddObserver(new PlcValueObserver("D100", subject)); var plc1 = new SiemensPlc(); plc1.Connect(); manager.AddPlc(plc1); var plc2 = new ModbusPlc(); plc2.Connect(); manager.AddPlc(plc2); manager.ConnectAll(); var value = manager.Read("D100"); manager.Write("D200", value); subject.SetValue("D100", value); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值