浅谈:内外网那些事

其实应该放到域名ip那些事,不过一直没填坑,索性单独写一篇。老规矩,还是类比,虽然原理差别大点。。。

可以想想生活中一个常见的场景,打电话,如果一个业务打电话联系一个大公司里面的某一个客户,那么一般而言是需要总机转分机的。比如业务的手机号是13300001111,大公司的总机66666666,要联系的客户分机号888。

如果业务只是在某个公共地方发布了消息和自己的手机号13300001111,而公司的客户看到了这个消息,于是用自己的分机打了过去,电话打通了,业务和客户可以正常沟通。然而,业务只知道是66666666打过来的,换句话说,电话断了,业务想打回去找这个客户就难了,客户则还是可以打电话去找这个业务。

这就是平时最常见的内网电脑可以访问外网站点服务器的过程。外网服务器的地址是你知道的,你上它的网站其实是通过http协议发送了请求,建立连接后它通过http协议发送了回复,然后你就看到了网页。然而外网服务器却没法主动,也就是不经你先请求建立的连接,发网页到你的电脑上,就算你来者不拒,它想发也法找到你。

再看一遍类比,客户想业务能主动找到它,于是告知了分机号码888。业务就可以通过总机66666666转888找到客户。这样就可以理解为,大公司内部是一个内网,大公司总机和业务是在公网上。总机号6666666可以理解为客户公司公网IP,而888则是公司公网IP映射到客户分机的端口。那总机做的事情就是NAT,以及将分机的地址(多少无所谓)的端口(多少无所谓,用来通电话)映射到总机的888端口上面。

然而现实中,如果没有这个分机号,比如客户随便插了个电话做分机,或者总机不想外面骚扰内部,虽然客户还是可以用分机联系到业务,但业务依然没法找到客户,这就是端口映射能否成功是取决于很多环节,任何一环卡住就断了。不幸的是,我们家用宽带的运营商基本都限制了端口和端口映射。

如果客户和业务有非常重要的联络,要随时都能找到对方,而总机转不到888,怎么办?最简单的情况是,客户另外搞了个手机号18800002222,也就是一个公网IP。然而客户说不想自己花钱,就是要用免费的分机,怎么办?

因为总机不给转,那就给客户找另外一个”总机“33333333能转的。客户先用分机打到”总机“上联通,然后业务打到”总机“,有点像三方通话。只要这个”总机“客户保持连通,那么业务任何时间打过来,都可以找到客户。更重要的是,如果这个”总机“33333333是公开的,意味着不是这个业务,还可以是张三李四,也可以随时打到这个客户的分机,尽管客户公司的总机66666666依然是只出不进不为转接。

这就是内网穿透,客户分机(内网)和”总机“的通道穿透了客户公司的总机(内外网关)。穿透的目的是暴露了客户分机(内网)在公网上,这样公网其他人不会被客户公司总机(内外网关)拦截,而可以直接访问客户分机(内网)。承担这个工作的”总机“就是代理。

如果联系客户的业务,他不是手机号,也是一个业务公司总机77777777的分机555,那他和客户之间又如何保持一个畅通的直接联系呢?是的,VPN该出场了,然而超出本文范围,打住不提。。。

再把这个类比引申一下。如果客户说,只有我找你,不许你找我,那业务不知道分机888也好,总机66666666不给转也好,其实是一种保护(没错,运营商就是这么说的)。但真的可以不用你找我?想象一下,微信,别人发消息给你,实际上是通过微信服务端中转到你的客户端(安全性,小心),微信服务端怎么找到你的呢?

可以是你的客户端已经和微信服务端建立了一个连接,一直保持,这样那边有话随时你能听到。不过,连接真的能一直保持么?你可能会挂电话(关客户端),电话线路可能切断(长连接中断)。那断了怎么办,微信找不到你了,你又不知道微信找不到你了?

那你的微信客户端就得去找微信服务端,这个过程如果是你人手去做,那就晚了(好比你晚上才开机,看到白天的信息),所以你的微信客户端自打安装就一直活跃在后台,时不时主动发个消息给微信服务端(前面说了,你找他是随时可以的),这样服务端就有办法找到你。这后面的技术原理就不多说了,我也不懂,但逻辑道理就是这样,也和内外网有关系。这就是为什么当你做微信API开发时候,必然要面临内外网的问题,你得让微信服务端找到你自己做的服务端。

发表评论