• 串口隔离内外网的通信协议设计


    在一些安全性要求比较高的敏感行业,如电信运营商,内网不允许和外网有直接或间接的以太网相连。但实际的应用又需要访问内网的某些服务,怎么办呢?比较好的办法是使用串口通信来构造一个代理程序。

    市面上有很多USB转RS232串口的转接线,可以买一跟公头、一根母头,分别插在两台电脑的USB或Type-C口上,系统通常会自动安装驱动,映射为一个COM口。最大速率可设置,比如设置为260K左右的波特率,接近2G时代的带宽,也足以顺畅地调用Web API了。

    本文不讨论具体写串口通信程序的具体代码,主要讨论下协议的设计。

    一、设计目标:

    0、通用http代理或反向代理,即web应用不需要做任何修改;

    1、程序尽量简单,无状态,TCP收到数据不用缓存,直接发往串口;

    2、两头的TCP连接会有多个,需要建立对应关系;

    3、串口收到的数据需缓存后处理,识别对应的TCP连接后进行分发;

    4、串口通信数据发出后不管,不需要确认;

    5、忽略偶发串口通信异常,恢复后不能影响后面的通信。

    最后一点意味着,串口通可能偶尔不可靠,不能把它当成类似TCP那样的可靠连接,但也不能把它当成UDP那样的独立数据包进行处理。

    二、设计要点:将串口数据当成字节流,发送时插入起始前导识别字符

    假设前导识别字符为 ~,则为了防止原有内容中也包含这个字符,连续3个~才算协议头的开始,协议头分为三部分:

    前导标识串

    tcp连接句柄号,即socket的整数转换为数字字符串,后续数据都是这个连接的数据,直到新的协议头

    协议头结束字符,表示操作:+请求对端创建一个新的连接(连接参数是配置约定的);-请求对端断开连接;*正常的数据

    三、举例说明:

    比如客户端在外网,侦听某个tcp端口,服务端在内网,将代理某个web服务(访问某个内网ip并取结果):

    1、客户端收到一个连接,socket句柄为11,此时客户端程序发出串口数据:

    ~~~11+

    2、服务端收到后,创建和目标地址的连接,程序将此连接和对端连接11进行关联;

    3、客户端发送web api请求:

    ~~~11*http头数据

    4、服务器收到串口数据后将http头数据转发到目标地址

    5、服务器收到目标地址的应答,将应答结果发给客户端:

    ~~~11*http 200 OK头数据和json应答数据

    6、任何一方断开后,均可给对方发送:

    ~~~11-

    收到后断开对应的tcp连接,如果是服务器端程序还需要解除关联。

    经过实际应用检验,十分可靠,而且通过了运营商最严格的安全审核。

  • 相关阅读:
    html列表
    【推荐系统】推荐系统-基础算法 冷启动、及深度学习在冷启动上的应用
    mac+idea中安装配置gradle方法
    C#通过FTP与异构系统实现业务接口
    [Linux 基础] linux基础指令(1)
    Splunk serverclass 没有生效
    高性能高维向量的KNN搜索方案
    【深度学习】深度学习实验二——前馈神经网络解决上述回归、二分类、多分类、激活函数、优化器、正则化、dropout、早停机制
    使用screw自动生成数据库文档
    【Unity】U3D TD游戏制作实例(五)防御塔设计:对象排序、锁定敌人、攻击敌人、防御塔特色功能实现
  • 原文地址:https://blog.csdn.net/bluesen/article/details/127118628