场景
再开发web微信扫码登录时,遇到了一个问题,手机扫码后,生成二维码时传的回调地址没有被触发。这个触发行为时其他服务器执行的,回调地址是本机的方法。这个问题已经遇到了很多次了,比如微信小程序开发,其他第三方应用集成,我们都需要被其他服务器主动访问。
解决方式:内网穿透。
内网穿透是什么?怎么解决的以上问题?
举个有趣的例子
在计算机里有这样的规则:
1.名字只能有特定的字符串构成且是有限的,我们人口太多不够用。
2.没有名字的话就无法与别人沟通。
为了解决这个问题,日常是这样解决的:提供传信服务的公司就默认的为某个地区的一片用户都配备了一个传信员。
小花和aa是有自己的名字的,他们之间可以通信。
但是为了其他用户可以正常使用,如果小花接下来不想说话了或者太久没放信到信箱了,用户2不能一直占用这个信箱。这样小花没办法主动找用户2
这时就有了一个好心人解决这个问题,让有情人终成眷属。
当然这里注意:ab需要一直骚扰aa,且还要一直问小区a的用户2,他还需不需要服务。(怎么感觉在欺负老实人)
与是小花在ab的帮助下就可以一直和小区a的用户2有一句没一句的聊天了。
这里小区a的用户2通过ab让小花可以主动找他的行为,就是内网穿透的大致实现了。
回归现实
以上的场景的问题出现在我们日常开发中。
- 对于名字则对应着我们的公网ip(ipv4)
- aa对应着路由器
- 编号1,2,3...就对应着我们的局域网ip
- aa的信箱就对应路由器的端口,aa会维护一个NAT表去管理映射关系
- ab就是提供内网穿透的服务器
小花则是想要主动访问我们电脑的第三方服务器
对于公网地址的数量缺少,我们的电脑一般都只有局域网ip。于是其他服务器想访问我们的电脑就需要很大的代价(比如一直发一些没用的数据,保持NAT表中的映射(当然他们也不会这样做))。
很显然内网穿透的价值就是让我们开发的时候省力一点,不用去部署到服务器看效果。总结与思考
这里提供两个已经用过的内网穿透方式:
- 运行sh -R 80:localhost:8080 localhost.run 这个是提供的免费映射运行后就自动给一个域名(缺点就是不是很稳定)
- 如果你有一个服务器就使用frp进行映射(这个比较稳定)
思考:很多局域网能实现的功能是不是用内网穿透就可以实现了呢,比如:远程操控等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。