今天在做php处理邮件的时候,应为php mail()函数要求有一台不需验证就能用的smtp,这个只能在电脑上搭建,突然就想到了内网穿透,内网映射。当时计算机网络老师讲课的时候提过一句,当时想回来自己看看,后来有事就耽误了。今天搜了一下,简单写写,全是个人见解,欢迎指正。
1,什么是内网穿透
简单来讲,在自己电脑上搭了一个apache服务器,或者其他的什么服务器都行,甚至是求生之路。自己localhost访问可以,别人在用一个局域网(交换机,无线网)下输入ip也能访问,但是除了这些别人就访问不了了。这台服务器是在内网的,不是外网(大家都能访问),因为你分配到的ip也只是一个局域网ip,外网压根就找不到你。所以就有了这项技术,内网穿透。
2,内网穿透的例子
有次上web技术导论,老师让做一个网页,如果把网页拷到u盘上拿过去展示太low了,直接在教学电脑上输入网址去访问我的笔记本多方便。这个笔记本是内网的,我就要把他映射到外网上,也就是内网穿透,这样访问一个外网地址就能相当于访问自己pc了。网上已有的花生壳,net123等都可以用。那么自己怎么实现呢,因为真的实现要用到外网的主机,然而穷碧并没有
,所以只能猜想。
![可怜](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cute.gif)
3,内网穿透的实现猜想
内网主机A向外网主机B发送数据,会经过你的网管M,所以真实的通讯过程是A->M->B,这时B收到的通讯是M的,也就是说M包办了这个内网所有与外网的通讯,只是端口不同。所以A:a->M:ma->B:b,小b代表端口,B返回数据,B:b->M:ma,这时M中会有记录,Ma这个端口是要给A的,至此完成通讯。重点就是M中会有记录,那个端口给哪个主机,所以就利用这一点。
首先有台外网主机B,然后内网主机A想B主动发送请求包,这个请求包包括A的ip,B会记录下A的ip,M的ip,M的端口,然后new一个ServerSocket,端口ba,为要映射的A开设映射服务,端口是ba,这个服务拿到的数据全都转发给M:a,同时把ba返回给A,A这里就知道B的端口。支持外网数据已经能通过B:ba发给A了,现在处理A如何回复消息。应该是B再new一个Socket访问M:ma,也就是A,这时B中的ServerSocket会拿到两个Socket,一个是外网请求的,另一个是A的,把这两个输入输出流以交换,搞定。