普通的UDP程序是无法穿透做了NAT地址映射的防火墙的,那么QQ是如何做到的呢?我参考了几个ICQ代码,都无法实现跨防火墙的功能,请问OICQ是如何做到的?

解决方案 »

  1.   

    给我几个ICQ代码好吗?哪里有下载?
      

  2.   

    以前有人讨论过.....
    好像是在你登录QQ服务器时,记录你的ip+port,由于NAT对转发的条目有时效,所以QQ服务器定时激活该条目,这样就保持了这个连接.
    因此别人就能主动给处于NAT下的你发消息了.......
      

  3.   

    同意7(Nomad) 。
    要解决这个问题先要搞清NAT的原理。
    NAT是通过在实现NAT的网关上为每个网络连接保留如下所示结构的连接来实现内部网到外部网的访问。
    (内部主机IP,内部主机端口,映射在网关上的端口,外部主机IP,外部主机端口)
    当一个网络连接断开时,这个记录就会释放。
    所谓udp不能穿透NAT,就是因为NAT中保存的纪录因为长时间不用而被释放了。所以QQ服务器必须定期向你的QQ发送消息,使这个纪录保持激活。同时也能检查你是否还是ACTIVE的。
      

  4.   

    那么为何第一次发送UDP包服务器就无法响应呢?
      

  5.   

    什么意思?   公网ip第一次给NAT下的客户发UDP不成功?
      

  6.   

    是不是根本UDP就进不来的?一发送完,NAT地址就失效了、
      

  7.   

    是不是根本UDP就进不来的?一发送完,NAT地址就失效了?
      

  8.   

    你试一下就知道了,qq在nat的下能正常通讯的,不只是出去,也能主动进来
      

  9.   

    我就怀疑QQ不是光用UDP这么简单,因为UDP是面向非连接的,那么一旦发送完成,NAT地址是不是就立即失效了呢?
      

  10.   

    不是啊,有个时效,timeout之后才删除该条目.
    QQ可能让它的服务器定时触发映射条目了,所以不会timeout,一直保持
      

  11.   

    比如说,QQ登录时,NAT端记录它的映射(sIP:192.168.0.2  port:4000-->dIP:QQ  dport:xxxx)
    之后QQ服务器就定时触发该映射条目,不让它失效.这样公网ip就能通过这个映射找到客户ip 192.168.0.2了可能是这样吧~~~~~~
      

  12.   

    呵呵,为什么我们公司的防火墙,用icq,oicq都可以呢,我们用的还只是将内部网络的地址映射成外部端口的地址,连端口映射都没有太多的考虑呢,还经过了两个代理才连上internet的
      

  13.   

    那你就要对每个客户登录服务器的时候,记录下来他们的ip和port,然后定时发消息,消息本身不做什么工作,只是起到更新NAT条目timeout的作用,这样NAT下的客户机到公网的线才不会断
      

  14.   

    各位高手,偶不懂NAT。弱弱地问一下,这个问题是不是可以通过监听网络得到答案阿?
      

  15.   

    参<<计算机科学>>2001年第12期P122
      

  16.   

    The IP Network Address Translator (NAT)
    定义在RFC1631
      

  17.   

    与之相关的Classless Inter-Domain Routing (CIDR) 定义在RFC1519
      

  18.   

    我也正在做这件事,而且UDP可以正常进出NAT. 我们可以一起做个测试
    My email: [email protected]
      

  19.   

    不好意思。问个比较弱的问题。我们的局域网是通过2个代理上的internet.我自己做了一个利用udp发送消息的小程序。不过如果不在服务器上运行就只能发不能收了。应该怎么做才可以象oicq那样既可以发也可以收?
      

  20.   

    以下,我们将举例说明NAT的工作原理,假设内部网络的地址段为私有地址段192.168.0.x,其中一台计算机的IP地址为192.168.0.1,我们在防火墙上设定一个用作NAT的地址202.1.1.1。 
      当用户发出连接请求时(假设端口为12345),防火墙将根据NAT设置,分配202.1.1.1的一个端口,假设为2222,分配给该用户; 防火墙为该连接建立一个NAT表项,表项中的内容为来源地址192.168.0.1:12345、已分配资源202.1.1.1:2222; 防火墙将该连接的IP包源地址替换,替换为202.1.1.1:2222,并将数据包发出; 当由数据返回到防火墙时,返回的数据包的目的地址为202.1.1.1:2222,防火墙根据这个地址在表项中查出对应的地址/端口192.168.0.1:12345; 防火墙将返回的数据包中的目的地址/端口改为192.168.0.1:12345,并将IP包发出。整个NAT过程完成。 
      

  21.   

    只能使用同一个socket收发,不能另开一个socket接收,原理请查阅NAT文档。
      

  22.   

    NAT是由防火墙来实现的,不是OICQ自己实现的。至于通过代理,OICQ则必须要写socks代码或代理端开一个tcp转发。所以,根本就没有OICQ能穿透防火墙的说法。有些时候和防火墙后面的人使用qq,都是通过服务器转发来实现的。
      

  23.   

    当然,如果是首先连接对方的是防火墙后面的人,也可以来通讯,因为他的数据包地址都做了转换。如果是防火墙外面的人首先发起连接,是不可能连接上的。象前面说的,只能使用一个socket收发。
      

  24.   

    楼上的众多高手,我用oicq连接服务器为什么找不到呢?是不是跟nat有关呢?有什么测试的方法吗
      

  25.   

    呵呵,先搞清楚NAT转换的原理再说。
    防火墙既然支持NAT转发,那就和qq自己没关系了
    否则就是网管设置的时候为了开放dns的udp包,开放了所有udp?
      

  26.   

    是不是这样的(比如说QQ通过Sygate出去):
    1、QQ登陆服务器,所谓的登陆,就是QQ向服务期发了一条UDP消息,服务期记下这个IP和端口;
    2、QQ服务期定时向这个IP和端口发一条激活消息(QQ定时向服务期发消息是不是也可以呢?),保持这个UDP的联结(使用同一个SOCKET);
    3、其他用户如果要发消息给这个QQ,就发到记录在服务期上的那个IP和端口;
      

  27.   

    必须要做udp mapping,因此必须使用udp协议。
    在网络通讯区搜索一下,以前我们都讨论好多好多次了。
      

  28.   

    Top is better to this question!
      

  29.   

    去看SOCK5协议,流程就是,你和代理服务器发送你要发出去的包,当然
    你发的包上要加上SOCK5协议的壳,具体的资料自己查
      

  30.   

    guanzhu and guanzhu again
      

  31.   

    很多人把防火墙,网关,代理搞混了。不过这几种技术在产品中确实经常重叠。QQ通过SOCKS代理连接外部必须设置SOCKS代理的IP和端口,程序中用SOCKS协议封装UDP包。而通过NAT,QQ不用任何特别的实现,所有地址端口转换由NAT完成
      

  32.   

    与NAT无关,QQ只是使用了一些标准代理协议,如HTTP代理协议,SOCKS代理协议
    NAT只是一个IP和PORT分配策略,充分利用IP和PORT的资源
      

  33.   

    那么,我想知道,如果说QQ可以穿透防火墙,那么,为什么在防火墙内部使用QQ的“二人世界”功能不能和外部的人聊天呢?请解释一下。
      

  34.   

    回unalone(阿龙):
    二人(A和B)世界中如果两人都在不同的防火墙中。
    QQ服务器为S
    A->S   A登录S
    S->A   S能向A发UDP报文,因为A主动向S发送过数据,在NAT建立了一条通路B->S
    S->B   同上A->B   不可能,因为两者在不同的防火墙,不能建立最初的通路A->S->B  这种是QQ的高级会员的二人世界采用的方式
    B->S->A  同上
      

  35.   

    照 pielly(hoho)所说;
       那nat的条目就不需要定时更新了!
      

  36.   

    关注一下
    我也是socket的爱好者
      

  37.   

    回zhangds(可靠性)
    nat的条目是需要用主动发keepalive来维持的,由服务器端发起或客户端发起都可以。但按服务器编程的惯例,是一个发起一个回应,这样双方都能确定对方没有死机。
      

  38.   

    我绝对赞同 pielly(hoho) 的观点。
      

  39.   

    各位老师,请解释一下,在不同的NAT内,为什么文字消息可以直接传送,而声音就不行?
      

  40.   

    那要问问你自己网络上声音和文字有什么不同呢?波长不同?另外我看原问题如下:
    普通的UDP程序是无法穿透做了NAT地址映射的防火墙的,那么QQ是如何做到的呢?我参考了几个ICQ代码,都无法实现跨防火墙的功能,请问OICQ是如何做到的?
    也就是说,不考虑代理,主要是UDP穿透防火墙的问题。
    据我所知(所知不多),支持NAT地址映射的防火墙(你的公司把它当作网关,甚至有的防火墙还兼作代理——比如青鸟,就不说那么多了),应该是不需要去在程序上做什么特别的支持。至于NAT映射地址表的刷新时间,我觉得内部地址的映射主要检查的是网卡地址、内部地址这样的对应关系。
    至于在QQ上提供http 或者socks4/5的代理支持,那又是另外一回事儿了,看看协议,似乎没什么好讨论的。
    对于NAT、防火墙等概念所知不多,还请了解详细情况的朋友把概念解释清楚,大家统一认识咯,这样就不至于你说你的,我说我的了。呵呵,一点愚见,有玉的请砸过来 x)
      

  41.   

    各位老师,请解释一下,在不同的NAT内,为什么 "OICQ" 文字消息可以直接传送,而声音(两人世界)就不行?
      

  42.   

    NAT只能处理,IP报头中的地址信息和UDP/TCP报头中的端口信息,而很难处理报文载荷里面含有端口信息的情况。
    当使用OICQ文字信息的时候,就是简单的UDP报文,文字信息放在报文载荷中。而当使用语音或者“二人世界”的时候,是首先通过UDP报文协商出一个TCP连接。然后在TCP连接上面传送内容。因此在协商TCP的连接的时候,在UDP报文中含有了TCP的端口信息,因此NAT就很难支持了。
      

  43.   

    NAT只能处理,IP报头中的地址信息和UDP/TCP报头中的端口信息,而很难处理报文载荷里面含有端口信息的情况。
    当使用OICQ文字信息的时候,就是简单的UDP报文,文字信息放在报文载荷中。而当使用语音或者“二人世界”的时候,是首先通过UDP报文协商出一个TCP连接。然后在TCP连接上面传送内容。因此在协商TCP的连接的时候,在UDP报文中含有了TCP的端口信息,因此NAT就很难支持了。
      

  44.   

    其实,好像在2001年上半年左右,清华BBS上网络编程一栏中公布了OICQ的协议规则,如果你稍微了解防火墙的工作原理和因特网基础编程,大概都会明白。
        (去年我们学校的网挺快的,我当时看了一下。今天我本来想上去给大家拷下来,很不愉快的是,我连清华BBS都没有上去就没有反应了。
        谁让我在林业大学,网太次了。)
      

  45.   

    复人: squiffy() (  ) 信誉:97  2002-3-4  10:24:34  得分:0  
     
     
      NAT只能处理,IP报头中的地址信息和UDP/TCP报头中的端口信息,而很难处理报文载荷里面含有端口信息的情况。
      当使用OICQ文字信息的时候,就是简单的UDP报文,文字信息放在报文载荷中。而当使用语音或者“二人世界”的时候,是首先通过UDP报文协商出一个TCP连接。然后在TCP连接上面传送内容。因此在协商TCP的连接的时候,在UDP报文中含有了TCP的端口信息,因此NAT就很难支持了。 
    明白你的意思了。就是说在udp协商创建新的tcp连接的时候,给对方提供的实际上是自己的内网IP,所以导致向对方发起连接的时候存在问题。
    不过,我觉得这个协商可以不用对方提供他自己的IP给我,而由从对方发来的udp报头中取出(已经被NAT转换出来),只需要借鉴Passive方式,由防火墙内的一方向外部发起tcp的连接请求,就能避免这样的问题了。不过,如果双方都在防火墙内,是不是就只能借助服务器中转了。因为,不能向在内网中的一个host发起连接请求吧(先不论防火墙规则),那如何是好?pielly的意思我明白,补充这样的情况:如果你在内网,我是无法主动发送udp包给你的,只能借助服务器与你协商,然后由内网中的你发起tcp连接到我。如果我也在内网,那么我们只能通过一个能直接连接,或者至少能接收udp包的服务器角色来中转。即,在内网的一方必须主动发出udp包或者tcp连接请求,如果双方都在内网,只能通过服务器中转。即便使用代理服务器也是一样的咯。
    呵呵,还好我这里内网全是真实IP,不用做NAT转换。网管偷懒,开放了低端口的UDP——方便DNS解析。
      

  46.   

    請交一個問題,為什麼在我們公司裡,oicq是無法使用的呢?公司的代理服務器是win2k+ISA.內部的計算機要通過登陸網絡(有域名).Somebody Help Me!
      

  47.   

    UDP是否可以:
    A,B都在NAT后边 
    A->server,B->Server
    server得到A,B的IP和端口后,分别告知B,A
    A利用的得到的B的IP和端口与B直接通讯
    我在NAT上没有试验过,不知能否可行,望大师指点
      

  48.   

    squiffy(),可是语音传输并不需要TCP连接,RTP是可建立在UDP之上的。既然文字可以传,把其他任何数据当成文字传送未尝不可?
      

  49.   

    RTP是建立在UDP之上的,但是使用的UDP端口都是协商出来的,视频和语音分开。NAT主要是处理不了协商UDP端口的这个报文。
    而传文字,事先都知道用哪个端口,就不存在协商的问题。因此可以使用了。
      

  50.   

    公司的路由器怎么才能不让大家使用OICQ呢,设置路由哪项
      

  51.   

    csdnchen(csdnchen) 你开个帖子,我告诉你。呵呵。
    使用防火墙功能,禁止目的端口是8000的UDP报文,就可以禁止QQ。