问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?
也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址。问题二:是不是QQ在通信时根本不适用IP,QQ客户端先是访问QQ服务器端,然后QQ服务器端再为要建立连接的QQ客户端建立连接?问题三:QQ客户端可以访问QQ服务器端,然后服务器端获取QQ客户端的IP建立通信,是不是这样的过程如果是,这个过程是怎么处理的呢?问题四:QQ客户端虽然IP地址不固定,但是在建立与QQ服务器端的通信时,必须提供自己的IP被服务器获取,然后才能建立他们之间的通信,进而在建立客户端之间的通信。也就是,只要能上网就有IP,只不过客户端的IP,是被QQ客户端获取了,然后才建立通信的。(这是自己的猜测,不知对否

解决方案 »

  1.   

      具体实现不知道诶```````目前研究的不是那块```````估计腾X 是个中转站吧``````客户登QQ  然后服务器端查询 把相应权限给他 改状态值 然后读取好友信息``````发信息 -服务器(中转处理)-另1个用户-回复-(中转处理)-到自己
                全凭猜想``````````
      

  2.   

    你都知道了还问什么啊,如果QQ客户端不需要连接服务器就可以完全自主通信,那它就不叫QQ了,应该叫Very NB QQ,那样的话,你还登录干嘛?
      

  3.   

    参考资料一、登陆。
      
         不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。因此,假如你所在的网络开放了80端口(80端口是最常用端口。。就是通常访问Web的端口,禁掉它的话,你的网络对你来说价值已经不大了),但没有屏蔽腾讯的服务器IP,恭喜你,你是可以登陆成功QQ的。
    二、聊天消息通信。
         采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。大家都知道,UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
    三、文件/自定义表情传送。
         大家都知道,QQ可以传送文件,可以发送自定义表情。先说官方表情。官方表情实际发送的是命令字,而没有发送表情。客户端收到命令字后,会自动解释为对应的表情。因此,QQ2008正式版的客户端发出的新版表情,在2007beta4及以前的版本无法找到相对应的表情,就无法解释,看到的就会是空白信息,但查聊天记录就会有[表情]字样。
         自定义表情的传送是以文件传输方式进行的。
         下面说文件传输方式:A要向B发送一个文件,于是发出一个文件传送请求。服务器收到这个文件传送请求后,转发给B,同时或者在B应答后,将A的IP地址同时发送给B。B这个时候就得到了A的真实IP。这里的IP是你的本机IP。也就是说,如果A处在内网,B得到的地址就是一个内网地址。B得到了A的地址之后,就会尝试去连接A。如果B也处于内网,那么,显然A跟B之间的连接是无法建立的。这个时候,客户端就会请求服务器进行文件中转。因为服务器具有公网 IP,处在内网的A跟B都是可以连接到服务器的,于是,A跟B的文件传送就通过服务器中转的方式,顺利进行。(注:服务器文件中转使用443端口)
    *    注:什么是内网、公网
         内网、公网是两种Internet的接入方式。
         内网接入方式:上网的计算机得到的IP地址是Inetnet上的保留地址,保留地址有如下3种形式:
         10.x.x.x
         172.16.x.x至172.31.x.x
         192.168.x.x
         内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问Internet。
         内网的计算机可向Internet上的其他计算机发送连接请求,但Internet上其他的计算机无法向内网的计算机发送连接请求。
         公网接入方式:上网的计算机得到的IP地址是Inetnet上的非保留地址。公网的计算机和Internet上的其他计算机可随意互相访问。
         所以,如果一个局域网只开放80端口,QQ是可以登陆成功的,也可以进行聊天。但传送文件也是不可以的,除非你们都在同一个内网。如果局域网还同时开放443端口,那么,恭喜你,QQ的功能你都可以正常使用。QQ是不是TCP和UDP一起用?如果用UDP,如何做到信息的可靠发送? 
    答Q即可以使用TCP也可以使用UDP,但QQ默认是使用UDP协议,因为UDP协议消耗资源小,发送速度快,但当UDP协议不能正常转发的时候,就会采用TCP协议进行发送.而信息的可靠发送是通过各种验证机制来完成的,这一点你可以去GOOGLE之类的网站去搜索下. 
    QQ用的是UDP打洞技术还是HTTP遂道? 
    答:发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是TX自行开发的
    因为用户一般都是在局域网内,地址都为私有IP,IM服务器是如何将信息转发到用户的? 
    答:如果使用TCP就没什么好说了~由内网向外网连接,只要能够连接上进行握手了,消息就可以畅通无阻的进行发送了.如果使用UDP的话,就是使用的打洞技术了,只要通道打通了,发送消息基本和TCP没什么区别,要做的只是维护消息的完整性而已.QQ是一个基于TCP/UDP协议的通讯软件,而MSN是基于TCP协议的通讯软件。
    那么QQ是如何通讯的呢?在TCP/IP协议中,唯一标识一个应用进程的是socket,它通过网络层的IP地址和传输层的端口号来实现,对与同一个IP地址的内部网络,通过不同的端口号来标识不同的QQ进程;当你登陆QQ游戏服务器的时候,服务器会保留你的保留IP地址和端口号信息,并在你的好友的QQ进程中进行列表显示,然后两个进程就可以通信了。 
         通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话。随即,发送计算机与接收计算机就会在确定好的端口范围内,建立起TCP或UDP连接开始文件的检索与传输。 
         在默认状态下,QQ优先采用了UDP(User Data Protocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用TCP协议传输数据。与TCP协议不同,UDP协议并不提供数据传送的验证机制——在整个文件传输过程中如果出现数据报的丢失,协议本身并不能作出任何的检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。 
         UDP协议适用于无须应答、要求时效的软件使用,这样的设计正好与QQ追求的目标相符,所以QQ优先使用了此协议进行一切功能应用。但是,由于     UDP协议具有不可靠性,常会因种种原因导致消息或数据的发送失败(很多时候会发现发送文件给对方接收时,对方根本收不到要求接收文件的消息。或是发送聊天消息时,对方根本没有收到过消息)。显然,UDP协议由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。QQ在数据传输上更注重实际性能,为了获得更好的使用效果,往往可以牺牲一定的可靠性。因此,使用QQ来传输数据,在很多时候就成了一个“不错”的选择。 
         一般内网传输首选QQ,速度最快,QQ的文件传输是直接个人对个人,采用P2P的传输方式,具有不需中转的优势,而且服务器都在国内,传输性能要高于外国IM软件。
      

  4.   

    qq通过服务器验证个人信息,然后获取联系信息发消息通过udp
    传文件直接建立tcp以前抓包分析的,现在估计变动也不会太大
      

  5.   

    首先,当你在电脑上安装了QQ之后,那些基本的界面神马的都已经在你的机器上了,当你点击登录的时候QQ程序会自己获取你的本地IP然后传给腾讯服务器端,它会给你分配一个唯一的标识符,这个标识符可能是根据你的QQ号码和IP等信息按照一定的算法生成的。。当你想和一个好友聊天时,它会获得你所选择的好友的基本信息如QQ号码等,然后找到你好友的IP建立连接,就可以进行通讯了,IO就不用说了吧。。
      

  6.   

    问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?
    也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址。网络相关: TCP/IP NAT
      

  7.   

    问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?
    也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址。客户端不需要固定IP,只要客户端连到服务器,服务器就会记住这个用户的当前IP问题二:是不是QQ在通信时根本不适用IP,QQ客户端先是访问QQ服务器端,然后QQ服务器端再为要建立连接的QQ客户端建立连接?网络通讯 必须是使用IP和端口的 建立的连接也是基于 IP的问题三:QQ客户端可以访问QQ服务器端,然后服务器端获取QQ客户端的IP建立通信,是不是这样的过程如果是,这个过程是怎么处理的呢?客户端给服务器发个包, 服务器接到这个包 是有来源的,也就是来自哪个IP哪个端口问题四:QQ客户端虽然IP地址不固定,但是在建立与QQ服务器端的通信时,必须提供自己的IP被服务器获取,然后才能建立他们之间的通信,进而在建立客户端之间的通信。也就是,只要能上网就有IP,只不过客户端的IP,是被QQ客户端获取了,然后才建立通信的。(这是自己的猜测,不知对否)差不多
      

  8.   

    1:不需要固定ip是因为使用了现在的局域网技术,在服务器端看到的你的ip是你的网络出口ip,就是你的网关在网络上的ip。而局域网内的机器使用的是一个内网ip。他在通信的时候是这么做的,每个内网ip在网关上开一个端口,凡是这个端口就是你这个内网ip的。
    2:服务器会把你的IP和端口记着,然后其他人的ip和端口也在 ,你俩通信的时候你发一句话 其实是发给了两个人,一个是服务器 一个是你要聊天的那个人。
      

  9.   

    问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?
    也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址。
    服务器端不会以qq用户端的ip作为唯一标识,服务器端会以qq账号作为唯一标识,所以这个账号肯定是唯一的,一个账号登陆时每次都可以有不同的ip地址,但账号却相同,当账号a登陆服务器,服务器会记录下账号a的ip地址,去通知a的好友,告诉他们,a上线了和现在的ip地址,a的好友就可以跟他通信了
    问题二:是不是QQ在通信时根本不适用IP,QQ客户端先是访问QQ服务器端,然后QQ服务器端再为要建立连接的QQ客户端建立连接?
    只要是网络层的通信,都会涉及到ip/tcp协议,就肯定需要ip,qq客户端登陆qq服务器,服务器只是记录登陆状态,不会一直和qq保持通信,只会每隔一段时间发送心跳数据包,来确实qq客户端是否还在网络上。当qq客户端a上线后,服务器会告诉a,目前a的在线好友的最新ip地址,当a需要与任意好友通信时,直接使用ip地址就ok了。qq客户端a与qq客户端b通信,可以两种方式,第一就是qq服务器有转发的服务器,第二是,a与b直接通信,不会告诉qq服务器。不知道腾讯用的是哪种
    问题三:QQ客户端可以访问QQ服务器端,然后服务器端获取QQ客户端的IP建立通信,是不是这样的过程如果是,这个过程是怎么处理的呢?
    是这样的过程,qq客户端请求一个连接给服务器,服务器接收后,知道qq端a上线,把qq端a的账号跟目前的ip会记录下来,放在在线列表里或者其他的地方,然后每隔几分钟或者几秒钟给qq端a发送心跳包,问他是否还在线,来确保qq端a的最新状态。这里客户端与服务器的通信方式是udp。而不会时时刻刻都在用tcp连接。
    问题四:QQ客户端虽然IP地址不固定,但是在建立与QQ服务器端的通信时,必须提供自己的IP被服务器获取,然后才能建立他们之间的通信,进而在建立客户端之间的通信。也就是,只要能上网就有IP,只不过客户端的IP,是被QQ客户端获取了,然后才建立通信的。(这是自己的猜测,不知对否)
    恩,服务器不会以ip作为唯一标识,会以账号作为唯一标识,但与账号通信的时候会用到账号目前所对应的ip,客户端与客户端通信也如此
      

  10.   

    MSN的协议我懂。
    QQ不清楚,聊天好像也是经过服务器转发。传文件是P2P,打洞。
      

  11.   

    我最近在写一个类似QQ的IM工具(当然和QQ差远了),呵呵
    所有的信息都通过服务器中转本来也想实现文件传输这个功能的,后来放弃了:
    文件如果通过服务器中转,那服务器负担太重(我的机子配置不高)
    想实现P2P打洞,在有的局域网上成功了,有的死活成功不了
    (当然,服务器一定要运行在公网,有的客户端运行在局域网)
    后来干脆把这个功能删了
      

  12.   

    其实原理很简单服务器的IP是固定的,也就是说这台服务器是固定的,不变的.   
    你自己做通信的话,也必须用一台计算机做服务器
    服务器会一直监控是否有客户端请求连接用户登陆的时候,向服务器请求,服务器接收到请求,通过了,然后进行一第列的数据处理.
    再把状态反馈给你及所有与你相关的QQ好友.这里你与服务器建立了连接,就可以进行通信.
      

  13.   

    我猜想下:
    1:你需要用户名和密码登录,但是你的地点不固定,
    所以每个QQ客户端都会先向固定服务器连接(至于是一个或者两个或者n个 那是人家技术处理问题,不谈),
    然后验证成功,你就登录。
    2:我们知道黑客们会通过检查自己的ip进出来判断好友的ip,那么说明一个问题:你的QQ和你好友聊天时之间的信息是两者互传的,也就是不经过QQ服务器转发(当然聊天信息到底经过还是不经过处理..不知道)
    那么就说明了一个问题:我们的QQ一定知道了好友的ip而好友QQ也知道了你的ip然后互相发送信息。
    那我们的ip是怎么被知道的呢;
    很明显,QQ在你登录的时候,记录你的ip地址,然后将好友在线的信息发给你,你要聊天时,你的QQ就知道了对方的ip发送过去,我想客户端还处理隐身等问题...猜想。所以我猜:
    1:地址不定的客户端先向服务器请求登录,服务器验证,成功后记录客户端ip
    2:服务器处理客户端的好友列表、群信息等,然后发送列表信息至客户端。
    3:客户端收到这些信息,处理对方在线、隐身等状态,此时在客户端应该有一个好友QQ+好友ip列表【列表应该是不断刷新的】
    (我想隐身是个问题可能有两种:
    1:先将ip发送至客户端然后客户端处理为隐身,此时客户端一定有隐身好友的ip了。但是这样貌似不安全)
    2:隐身好友的ip不会过来,当你主动发此消息时,qq找不见应有的ip对象,本地返回一个错误,然后向服务器“询问”、服务器查找有没有这个好友的ip,如果有,消息转发给此好友,若隐身的回复,那么服务器就默认隐身的认同对方发现自己,将隐身的ip给客户端,然后显示为在线等
    .....当然,或许有更好的方法,这些全部是我的 猜测 。
     )
    4:好友与好友之间聊天,这个过程不经过服务器,那么我们看见的qq客户端应该是一个既是服务器又是客户端的结构,以上均为自己推测 ,若有更好的,欢迎指正,呵呵,如有雷同,他是盗版。