Http协议内网穿透的实现

把内网某个nat设备下的web服务要暴露给公网访问该怎么做?比较常见的方式有动态域名(花生壳之类)、端口映射(Ngrok……)等。
我们都知道http协议是基于tcp协议的,tcp可以“打洞”,为什么HTTP不可以呢?
曾经为这个问题google了好久都没找到解决方案。
网络上找到的udp以及tcp打洞的教程很多,这里不再详细说明
http://www.brynosaurus.com/pub/net/p2pnat/ 这个网站有详细的p2p实现原理,有兴趣的朋友自行了解。

根据tcp打洞的原理,我们实现http的穿透主要有以下难点:

  • 现有的http访问库极少有能用指定端口的,需要找到一个能基于固定端口使用的httpRequest库
    很幸运我找到了一个基于.NET的HttpClient扩展的ManagedHandler
    github:https://github.com/newlysoft/HttpClient/tree/dev/src/Microsoft.Net.Http.Client
    我在源码中包含了这个库并进行了相关注释。

基本思路:tcp打洞打通一个本地端口到对方web端口(80)的连接通道。使用该打通的端口尝试到对方web服务的http长连接请求。

这里有个巨坑,如果测试的两端在同一个NAT设备后是无法打洞成功的,所以你的Nat服务器要告诉你的客户端,它们是不是在同个域网,如果是则使用域网ip直连,不是才需要打洞。我就曾经被坑了一个多月差点放弃。后来感谢LJ电信断网了我用手机共享网络才测试成功。在此,我对爱断网的电信致以衷心的感谢。
完整的实现源码请扫码下面的二维码关注我的公众号,回复“SharpNet”,会自动给你回复源码下载地址。

本博客的内容和源码如无特殊声明都为原创,仅供学习交流,如有其他用途请事先咨询本人。

完整的源码请关注我的公众号,回复”SharpNet“查看
我的公众号

欢迎加入技术交流群:14966975

你可能感兴趣的:(Http协议内网穿透的实现)