路由器与NAT穿透

普通用户可以忽略本节内容。

为减轻服务器负担,OpenQQ在收发文字、图片和文件的时候,通常无需经过服务器器中转,客户端和客户端之间是直接通讯的,即p2p方式。
我们知道,外网计算机是不能主动发送数据给内网计算机的,只有收到过内网计算机发来的数据之后,外网计算机才能向该内网计算机发送数据。

假设客户端A和客户端B分别位于不同的局域网中,那么对于A、B相互就是外网计算机,不管是A发给B,还是B发给A,对方都是收不到的。
那么A和B是怎么建立信道进行通讯的呢?这就涉及到NAT穿透的问题,穿透要通过服务器搭桥,所以任何p2p的软件,都需要有服务器的。

但是并非所有路由器的NAT都能成功穿透,如果OpenQQ检查到A和B之间没有穿透成功,那么A和B之间的通讯就会自动通过服务器中转。
所以不管NAT穿透是否成功,对于最终用户的使用基本上是没有影响的。

怎么判断NAT穿透是否成功呢? 方法有两个:

1、在内置聊天窗口向对方发送文件,如果没等双方响应,系统自动开始用离线文件形式发送,说明NAT穿透不成功,和对方的p2p信道没有建立起来。
2、QQBuddy提供了一个p2p属性,如果已经穿透对方的NAT,数据无需经过服务器中转,可直达对方,此属性会返回True,例如:

For Each bd As QQBuddy In QQClient.Buddies
    If bd.Online Then
        Output.show(bd.Name & iif(bd.p2p,"(
已穿透)","(未穿透)"))
   
End If
Next

路由器NAT的类型有以下四种:

完全锥型(
Full Cone NAT)
限制锥型(
Restricted Cone NAT)
端口限制锥型(
Port Restricted Cone NAT)
对称型(
Symmetric NAT)

前三种NAT类型都是可以穿透的,只有最后一种对称型无法穿透。
所以我们在采购路由器的时候,可以了解一下其NAT类型,另外企业用的话,最好用企业级的路由器。

好消息是,市面上绝大多数路由器都是前三种类型的,我到目前为止测试了不下10种路由器,还没有遇到完全不能穿透的。
而且一般企业的OpenQQ通讯数据量,就是完全通过服务器中转,也不至于让服务器服承担过重,除非持续发送大文件。
此外,局域网也不存在NAT穿透的问题。
所以对于多数用户来说,本节的问题其实不是问题,有所了解即可。

需要注意的是,穿透不成功并非总是NAT类型的问题,可能是被防火墙阻拦了;也可能可能是网络问题,伙伴们都知道,国内三大电信运营商之间的互联互通情况还是很不理想的。


本页地址:http://www.foxtable.com/webhelp/topics/3034.htm