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

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

市面上有很多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连接,如果是服务器端程序还需要解除关联。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值