一、登陆。
QQ登录到QQ服务器时,会建立一个TCP连接来保持在线状态,TCP连接的远程端口一般是80,采用UDP方式登陆时是8000,但服务器不会一直保持与客户端的tcp通信,之后使用udp每隔一段时间发送心跳数据包来确定qq客户端是否还在网络中存活。由于qq客户端的ip地址不定,但账号是唯一的,因此当客户端a发送连接请求,服务器接收后,知道a上线了,会把qq端的a的账号和ip记录下来,保存在一个表中或其他位置,同时服务器会告诉qq客户端在线好友的ip地址,当a需要与好友通信时,直接使用ip就ok了。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端口)
其实红字部分是不正确的,QQ的文件传输采用的是P2P,也就是为什么在相同局域网下,两个人用QQ传文件会非常快,这里用到的是NAT打洞技术,下面我会详细的说明
无论是传文件还是聊天文字技术上都可以使用P2P,P2P 都可以用UDP实现,而UDP在NAT打洞上面更加方便和成熟,所以腾讯应该是优先UDP,但是使用UDP为了增加可靠性,尤其是传文件,就要用到UDP模拟TCP ,也就是他所谓的新TCP,看来在UDP安全通信方面,腾讯应该很牛逼了