内网穿透的实现原理(附源码)
什么是内网穿透。
1. 原理
简单而言,我们要实现的效果就是用户访问服务端的 54512 端口就想是在访问客户的 3306 端口一样。
客户端注册
最重要的当然是客户端与服务端建立连接(这个连接可以是纯 tcp,也可以是 http,websocket 都行,只要能相互通信即可),客户端需要告诉服务端我想暴露哪些端口,然后服务端就会监听对应数量的端口(这个地方可以优化为服务端只监听一个端口)。
这时候就已经完成了客户端的注册。
用户访问
如果用户现在访问服务端的49875
端口,如果想要正确的转发到客户端的9527
端口应该怎样做呢?
将用户的请求数据与当前服务端的端口一起发送到客户端
为什么要发送当前服务端的端口? 因为要告诉客户端当前用户具体要访问的是哪个端口,我们前面返回给客户端端口映射关系。
客户端接收到请求后,查询端口映射关系,然后连接到对应的
9527
上去,并发送服务端发送过来的用户的请求数据,比如说是 http 请求的话 可能是这样的
GET /XXXX HTTP/1.1 HOST: XXXX User-Aagent: xxx
9527
根据对应用户请求数据做出响应,然后发送到与客户端建立的连接中比如说一个 http response `HTTP/1.1 200 OK content-length:xxx \r\n helloworld\r\n`
最后客户端将
9527
的响应数据转发到服务端,服务端又转发到用户。然后就是重复 1~4
可以说是很清楚了,最后项目地址https://github.com/fzdwx/burst
后面可能会考虑出源码从 0 到 1 写完一个简版的。
版权声明: 本文为 InfoQ 作者【风斩断晚霞】的原创文章。
原文链接:【http://xie.infoq.cn/article/4c1496441a4140c2ffdfef1c1】。文章转载请联系作者。
评论