Netty内网穿透原理

Mars 2019年11月05日 46次浏览

内网穿透github源码地址(含有使用说明):源码地址 包含服务端程序和客户端程序。服务端包含了一个代理服务端,客户端包含了一个本地代理客户端。

流程分析

  1. 服务端入口启动ServerMain的时候会先解析启动参数,之后会启动一个TcpServer服务端。监听指定服务端端口
	h  	 服务端的网络地址,即 服务端运行的服务器外网 IP 或 hostname
	p   	 服务端的端口
	pwd 	 服务端的 password
  1. 之后在客户端入口ClientMain启动客户端,同样先解析启动参数,参数如下:
	h  	 服务端的网络地址,即 服务端运行的服务器外网 IP 或 hostname
	p   	 服务端的端口
	pwd 	 服务端的 password
	proxy_d  被代理的应用网络地址
	proxy_p  被代理的应用端口号
	remote_p 服务端对外暴露访问该应用的端口
  1. 之后创建客户端TcpClient并启动,保存各参数到客户端handler里面,客户端启动之后会和服务端建立长连接,并且一直会有心跳包发送,同时会发送一个注册消息,该消息带有需要服务端暴露的端口,当服务端收到该消息时会创建一个内部服务,暴露客户端指定的端口,等待请求连接。
  2. 外部设备访问客户端指定服务端暴露的端口(服务端ip+客户端指定服务端暴露的端口),外部设备就会和服务端内部的服务端建立连接,建立连接的时候会发送一个消息给客户端,该消息通知客户端,有请求和内部服务端建立连接,因此客户端收到消息会创建一个内部客户端,并保存该内部客户端handler到客户端的handler中的map中。
  3. 当屋外部设备和内部服务端建立连接完成时,内部服务端会接收到设备消息,并将该消息通过外部服务端发送到外部客户端,并且消息type为数据包data,当客户端接收到时,会使用之前保存的内部客户端handler获取到channel,并进行write操作,以此来请求本地的应用,当本地应用处理完成会返回,此时内部客户端的handler就会读到此消息,由于内部客户端保存了外部客户端的channel,因此使用该channel写数据发送到服务端。
  4. 服务端接收到消息之后,同样转发到内部服务端,并响应给相应的设备。
  5. 至此,本次请求基本结束,执行断开操作。内部服务端接收到请求断开操作,随后使用外部服务端发送断开连接请求,客户端收到,即关闭内部客户端channel,随后触发内部客户端的channelInactive,在该方法是以外部客户端向服务端发送断开连接消息,服务端接收到,找到内部客户端与之建立连接的chanel,执行close操作,到此一个请求流程全部结束。

执行流程图解

客户端和服务端启动和建立连接流程: Netty内网穿透流程图.png 当接收到请求时的执行流程: Netty内网穿透流程_请求流程.png