P2P应用中的NAT穿透原理(简析版)

原文地址:http://hi.baidu.com/iammutex/blog/item/de93c3554dddfc173a29353d.html

很久以前看了点很基础的东西,写一下,免得忘记了。

从TCP/IP协议上来讲,P2P应该是一种应用层上的东西。他有自己的应用层协议,然后利用TCP或者UDP来传送中间的数据。

最简单的一种情况,就是两台公网机器的通信,什么叫公网机器,就是你的IP不是一个私有网段的IP,而是一个在INTERNET世界里通用的IP。明白了吗,就是说不是什么192.168.*.*之类的。

这样的话,你机器上装了P2P的软件,然后你的信息提交到服务器上,你的软件开一个端口侦听远端另一个P2P结点的数据。就OK了。比如端口开在3456上,那么服务器就知道在 你的IP:3456这个位置可以和你建立连接。

这样,每个人把自己的一个IP:PORT对应的表给服务器,然后别人可以查找,发现了一些机器就可以互相联了。至于他想干什么。那就看这个P2P软件具体的作用了。

但是我们知道有一个东西叫子网,有一个东西叫NAT,还有私有网段,这就比较麻烦了。什么意思呢??

就是说,我们因为IP不太够用,而且一台机子一个IP也会影响一些方面的性能,所以经常是一堆机器用一个公网IP。通过路由器接一个网口多人共享的都是这个原理拉。这就出现一个问题,你们只有一个IP。你们几台机器又怎么区分呢??这时候就要用到私有IP分子网了。很简单,就是在所有可用的从0.0.0.0到255.255.255.255之间,有一些IP是不能让人申请的,他们叫私有IP。专门的用处就是建立子网。比如192.168.*.* 一共有65536个IP。。都是给子网用的。

多的不说了,都很基础,不了解的自己查查吧

比如现在在212.183.33.33(公网IP)下面有几个机器:192.168.0.100 192.168.0.101 192.168.0.102...

其中一个(192.168.0.100)用浏览器去访问一下baidu.com.其实就是向baidu.com对应的IP的机器的80商品发送一个GET包。

通常的情况是我们可以看到百度的页面,说明百度收到我们的请求然后发回了请求的页面。但是,他怎么知道是 192.168.0.100 请求的呢。而没有传到其它两个机器上去呢??

这就是路由器的功劳了,路由把我们的请求包装了一下,其实baidu.com看到的,只是从212.183.33.33(公网IP)这个地址的发出的请求。

也就是

子网ip:本机port ----路由器-----公网ip:另一个port

比如你本机开的是3333端口去联baidu的80端口,经过路由之后可能就变成5555端口对联80端口了,而且IP变成了公网IP。

这时baidu发回来的包还是找这个5555端口。。因为路由有记录,知道5555端口表示第一个机器的3333端口。所以就直接又发回来了,你感觉没什么差别。

看这一句话:因为路由有记录。。

如果没有记录呢??那他就不知道这个包是给谁的,他就丢了他。OMG。

所以,如果P2P的一台机器是公网IP。一台是子网。那只能让子网里的这个去联公网的那个。然后公网发过来的包才不会被当垃圾给扔掉。是吧。

下面是最复杂的情况。如果两个机器都在不同的子网中呢??那你发给我的我收不到。我发给你的你也收不到。路由就像家长一样,把两个相爱的孩子的信件给没收了。(呵呵。。。)

这时就要一个中间人了。它,就是服务器。

服务器是公网机器。这个很好保证。这时这两个机器A,B相连接。

1。A向服务器发一个包。服务器收到的是什么呢??是公网IP+一个端口。

2。服务器知道了A的机器在路由上对应的端口之后,就可以命令B向A的公网地址的端口(上面那个商品)发一个包了。这个包A是收不到的,因为路由知道,A是和服务器沟通,服务器的IP向这个端口发的包他才会转给A。这个包什么作用呢??其实是骗一下B的路由器。试想如果在B这样做了之后,A再发回一个包给B,B的路由是不是以为上次发给A的包成功了,A回了这个包,那这个包就不会丢掉了。(妙啊)。。所以,下一步。

3。A向B刚才发送的端口发一个包,这个包上面已经说了,可以通过B的路由。然后就可以A,B通信了。

其实这个过程有一个理念前题。就是A向服务器发的包的端口要和向B发的东西的端口一样才行。

PORT:A>B == PORT A>SERVER

这个是在大多数情况下可以保证的。具体查看Symmetric NAT和Cone NAT两种NAT的区别吧。

发布了14 篇原创文章 · 获赞 5 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/laoyouji/article/details/8130842