首页 新闻 搜索 专区 学院

请教一个网络穿透的问题...应该很少有人知道吧?呵呵

0
悬赏园豆:20 [已解决问题] 解决于 2013-01-23 15:22

A,B是处于2个不同内网的电脑,他们的路由器(NAPT设备)分别是naptA,naptB.

 

当A的81端口(A:81)向B的82端口(B:82)发送消息的时候,

实际是通过naptA将消息发到向naptB,

而不是直接发给位于naptB内部的B.

 

请问消息到了naptB的时候,naptB是怎么知道消息要发往B而不是naptB内的其它电脑呢?

 

首先我们不知道B在内部的IP地址,其次就算我们知道,在数据包里加上B的内部地址(比如192.168.1.20),我们加的格式也未必是naptB的解析格式...

 

除非,我们在naptB内专门放一台电脑(X)做为消息转发,然后将naptB收到的所有端口的消息都发到X这台电脑上,然后再由X里我们自定义的程序来决定将消息发到内网里的哪台电脑..

 

但是..QQ它没有这样,我们局域网内没有哪台电脑作为QQ的消息转发服务器,处于千里之外的朋友也能从他的内网将消息发到我的电脑上..

有人说QQ是有一台外网的消息转发服务器的,(实际上可能是上千台)当我们打开QQ登录的时候,我们的QQ会每过几秒发一个UDP包到这个服务器上保持连接,这个UDP包内有我们的QQ号,服务器每收到一次之后,检查这个QQ号对应的IP和上次的是否一样,若不一样,那么就更新DB里的记录,当好友给我们发消息时,先去DB查我们对应的IP,然后再把消息发给查到的IP...问题又回到最初的地方了,查到的这个IP是我们外网的IP,也就是路由的IP.将消息发到路由的时候..路由怎么知道要将消息发给我,而不是内网其它的电脑上?

hexllo的主页 hexllo | 菜鸟二级 | 园豆:329
提问于:2013-01-22 15:41
< >
分享
最佳答案
0

UDP/TCP穿透并不总是在所有网络设备上都能正常运作,我记得以前有个老外列举了一些常见的防火墙,通过防火墙规则测试了哪些规则下无法实现穿透。

由于A,B都在NAT后,所以无法直接连接,但是它们都可以连接到公网的服务器 C,因此A和B通过连接C,然后让C来告诉A,B对方的公网IP和端口。这里面还有个网络设备的原理性东西(大学课本《计算机网络原理》),即A在连接C的时候会在网络设备上绑定自己的IP和端口,这个应该很好理解,因为C要回复给A报文时,网络设备必须知道应该把此报文投递到A机器。因此只要A,B知道了对方的公网IP和端口后,就可以向对方发送试探性的握手报文。当然后面还有一些流程,你随便搜索一下就有了。

收获园豆:15
Launcher | 高人七级 |园豆:45045 | 2013-01-22 16:00

经你这么一说,明白了一个问题,A向C发报文的时候,是在NATa上绑定了A的端口的,所以C回A报文的时候,NATa知道这报文是发给A的,这样A就一定能收到C发的东西了.这道理是通的.

 

但是C在给B发报文的时候,(有可能B没有给C发过,所以没有绑定端口),那么C发给B的时候,NATb就没办法转发了..是吗?

 

而QQ呢,B要接收消息,必定是保持了socket连接的,(和服务器的socket连接),A给B发消息的时候,选发到C,然后C发给B一个指令,让B新开一个socket连接,并给A发一个测试包,A收到后,告诉C已经收到了,这时C回A一个消息,让A和B直接连接,不要再通过C了,这样一来,A和B就能直接发消息了,达到了穿透的目的?

 

你是大牛人,麻烦你仔细帮我看看我理解的对不对...你的答案就决定了我以后对穿透的理解了.

hexllo | 园豆:329 (菜鸟二级) | 2013-01-22 16:23

@hexllo: B没给C发过的话,C是无法把报文发送给B的,因为 B 在 NAT 后,你的理解是正确的。只是在A,B通过C知道了对方的公网IP和端口后的流程还比较长。我建议你读一下这篇文章:http://wenku.baidu.com/view/6b8904956bec0975f465e2c9.html

Launcher | 园豆:45045 (高人七级) | 2013-01-22 16:31

@hexllo: qq在登录的时候肯定会跟服务器通信,期间必定经过nat设备,所以B没发消息给C发过消息,端口也早已经在登录的时候,或者你说的发送心跳包的时候绑定了。

ITailor | 园豆:194 (初学一级) | 2013-01-23 08:58

@ITPuppy: 这不就是NAT穿透的前提条件,A和B都必须先和C建立连接吗?QQ登录的过程不就包含了此过程吗?因此不管你是在登录,还是后续发心跳包(这是为了保证在NAT设备上的信道存活),这不都是B先要发消息给C吗?不要把业务上的逻辑同技术上的原理混淆了。

Launcher | 园豆:45045 (高人七级) | 2013-01-23 09:33
其他回答(3)
0

这货提问不少,没见过他结贴

收获园豆:1
Rich.T | 园豆:3440 (老鸟四级) | 2013-01-22 16:03

靠,不是不结贴,是没有满意的答案啊..

我每当看到未结那么多的时候,都去看看有没有能结的..

如果我结了,那么以后人家一搜索类似的问题,把我的问题列出来了..

人家看了也没有答案,还浪费时间..这多不好

百度上很多就这样的.博客园好多了,没有复制的回答.

支持(0) 反对(0) hexllo | 园豆:329 (菜鸟二级) | 2013-01-22 16:08

@hexllo: 

没有满意的也没见你说哪有疑问,发贴这么多,不可能没一个回答合你意的

支持(1) 反对(0) Rich.T | 园豆:3440 (老鸟四级) | 2013-01-22 16:10

@Rich.T: 好吧..我改!

支持(0) 反对(0) hexllo | 园豆:329 (菜鸟二级) | 2013-01-22 16:29
0

你这个问题就像在问,我在内网上网站下载游戏,那么那个网站服务器是怎么把游戏发到我机器上的呢?我不是躲在内网吗!

收获园豆:1
凹出来 | 园豆:33 (初学一级) | 2013-01-22 16:27

我了个去..你总结得太精辟了吧?是这理.

 

我不知道内网向外发消息的时候,会把端口先绑定到路由上,刚刚才知道的.

支持(0) 反对(0) hexllo | 园豆:329 (菜鸟二级) | 2013-01-22 16:28
0

题目没看。但如果真如楼上说得那样,我有些无语。你去网站上下载游戏,那么是否有你的套接字信息???难道这些套接字信息部够找到你。至于你说得naptB怎么知道是你而不是其他机器。我有些无语,这里真想喷下你的题目,我估计这个没几个人不知道。路由映射表难道是看的?她的学习记忆功能难道是摆设?你刚才通过这个出去的,这里就已经记忆了你的实际终端信息,并在这里形成一个映射关系,映射到这个公网ip的一个端口上。也正因为这个原因,下次外部的包才得以通过这里到达你的机器,否则早被丢弃了,这个就是打洞。

网络打洞,所以,不可以使用tcp,第二需要一个公网服务器。去找几本书多看看吧。网络编程的基本知识点

收获园豆:3
BLoodMaster | 园豆:135 (初学一级) | 2013-01-23 01:07

看了你的题目,我更无语了。什么QQ没有内网中转服务器???我简直崩溃了。QQ是服务器先来连接你还是你先去连接他?看来你对udp网络穿透一窍不通。下次问问题的时候,别写什么没几个人知道的嘲讽的话,纯粹找喷的,当然如果你的问题真的高深的话,除外,拿这种低级问题,用那样的题目,我不喷你,简直对不起观众

支持(0) 反对(0) BLoodMaster | 园豆:135 (初学一级) | 2013-01-23 01:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册