qq应用层协议.docx
- 文档编号:26421339
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:13
- 大小:24.71KB
qq应用层协议.docx
《qq应用层协议.docx》由会员分享,可在线阅读,更多相关《qq应用层协议.docx(13页珍藏版)》请在冰豆网上搜索。
qq应用层协议
竭诚为您提供优质文档/双击可除
qq应用层协议
篇一:
qq聊天程序的网络通信原理
qq聊天程序的网络通信原理
卢平
(通信工程
(2)班e09680220)
qq的通信协议
qq的通信协议是一套基于二进制数据的自己开发的应用层网络协议。
其中使用一些公司的加密算法。
qq基本通信协议支持udp和tcp两种基本协议方式。
两种方式的基本数据结构是一样的。
只是tcp包多了一个描述长度的头部。
qq的通信原理
qq聊天程序采用的是c/s通信模式,即客户/服务模式,它把一个应用划分成功能不同的两个部分,分别在不同的计算机上运行,其中一个为服务端程序,用来响应和提供固定的服务,一个为客户端程序,用来向服务端提出请求和要求某种服务。
在数量关系上,通常有一对一的(即一个服务端程序和一个客户端程序之间通信),也有一对多的(即一个服务端程序和多个客户端程序之间通信),也有多对多的(即多个服务端程序和多个客户端程序之间通信)。
所谓服务端程序、客户端程序也是相对的概念,有时在一个程序中既有服务端又有客户端的功能。
qq聊天程序分成了两个程序,一个安装在腾讯公司的服务器上,我们称之为服务端程序,一个安装在qq用户的计算机上,我们称之为客户端程序。
在许多介绍网络通信编程的书籍中有关网络聊天的例子,当一个客户要与另一个客户聊天时,第一个客户先把聊天数据发送给服务器,然后服务器再把聊天数据转发给第二个客户,服务器好像一个中转站,这在客户数量比较少时,服务器还能承受,在客户数量比较多时,服务器肯定要瘫痪。
何况客户之间还要传送文件、语音聊天、视频聊天等等,为了减少服务器的压力,各客户端之间需要直接通信。
1。
在服务端和客户端之间(一对多)
用于客户端程序登录,验证用户密码,获取其它在线好友信息等等。
2。
在客户端和客户端之间(多对多)
用于在线好友间直接通信聊天。
此时每个客户端程序上既有实现服务端功能的部分,又有实现客户端功能的部分,前者用于接收聊天数据,后者用于发送聊天数据。
在用c/s模式进行通信时,作为客户端在请求与服务端连接时需要知道服务端的ip地址,腾讯公司的服务器具有固定的公网地址,这没有问题。
但是在客户端和客户端之间通信时,每个用户的ip地址都是isp所给的临时地址,无法固定,那么某个用户要与另一个用户连接时,怎么知道对方的ip地址呢?
当一个用户连接到internet后,获得了一个临时的公网地址,当登录到qq时,qq服务端会获得该上线用户的ip地址,然后告知其他要与该上线用户聊天的用户,其他用户就可以连接该用户与之直接通信了。
在win32平台上,对于众多的基层网络协议,winsock是访问它们的首选接口。
如果想从头开发一个网络通信应用程序,tcp/ip就是首选协议之一。
为了保证可靠的数据传输,宜选择tcp协议。
在开发工具方面,Vc是我的首选,但Vb可能拥有更多的使用者,所以我用Vb6。
0作为开发工具编程实现,以便更多的读者能够理解。
喜欢Vc的的读者要将其转化成Vc下的代码也很容易。
在Vb中有一个winsock控件,它为Vb网络编程提供了一条便捷的途径。
qq的登陆验证过程
首先qq客户端向服务器发送一个请求登录令牌的数据包,服务器返回登录令牌。
这个令牌是在服务器端生成的,和客户端的ip地址,版本信息等数据相关。
以后会用到这个令牌
去进行其他操作。
在qq客户端得到登录令牌之后。
就会向服务器发送一个包含登录信息的登录请求,要求登录。
服务顺会首先看看客户端的号码,守址和版本是否可以在本服务器上进行登录。
如果可以的话,就验证客户端的登录信息是否与服务器上保存的登录信息进行比较,匹配的就向客户端返回一个登录成功的数据包;不匹配返回登录失败。
因为qq的服务器有很多台,可能要分管不同的qq版本、ip等。
所以如果客户端的号码、ip地址和版本无法在本服务器进行登录,服务器就返回一个重定向包,让客户端去另外一台服务器登录。
其实整个qq登录过程就是这么简单的两个步骤。
(1)监听
先在窗体上加一个winsock控件,名称设为“winsockserver”。
由于服务端需要和所有客户端通信,需要很多winsock控件,因此把刚加入的winsock控件winsockserver改为数组,只要将winsock控件的index属性设为0即可,此时winsockserver数组只有一个元素,以后可根据需要动态增减。
当窗体载入时,只会创建winsockserver(0)这一个winsock控件实例。
作为服务端程序,首先要有一个winsock用于监听客户端的连接请求,自然就用winsockserver(0)作为监听winsock,所以先要设置其通信协议为tcp,然后设置本地端口,以便客户端通过该端口与服务端连接,最后通过listen方法监听。
privatesubForm_load()
co(qq应用层协议)ndb’自定义函数condb用于和存储用户信息的数据库连接,具体实现见源程序。
winsockserver(0)。
protocol=scktcpprotocol‘设置通信协议为tcp
winsockserver(0)。
localport=8888‘设置本地端口
winsockserver(0)。
listen’监听
endsub
(2)请求与服务端程序建立连接
当用户输入用户名和密码单击登录按钮后,在用户机上的客户端程序所做的事情是先请求与服务端程序建立连接,这需要先在客户端程序的登录窗体上加一个winsock控件,名称设为“winsockclient”。
然后设置通信协议,要连接的服务器ip地址,远程端口号要与服务端监听所设置的本地端口一致,最后通过connect方法请求与服务端程序建立连接。
privatesubcommand1_click()‘单击登录按钮事件
winsockclient。
protocol=scktcpprotocol‘设置通信协议为tcp
winsockclient。
Remotehost="127。
0。
0。
1"‘要设置正确的服务器ip地址winsockclient。
Remoteport=8888‘远程端口
winsockclient。
connect‘请求与服务端程序建立连接
endsub
(3)接受客户端程序连接请求
当客户端请求与服务端程序建立连接时,处于监听状态的服务端会收到消息触发connectionRequest事件,所以服务端程序接受客户端程序连接请求的工作在connectionRequest事件方法中完成。
由于winsockserver(0)专用于监听,所以要新加载一个winsock控件与该客户端通信,为了保留每个在线客户的信息,我定义了一个onlineuserinformation结构类型的数组onlineuserinfo,它和winsock控件数组相对应,比如onlineuserinfo(i)中存放的是与winsockserver(i)通信客户端的信息,其中onlineuserinfo(i)。
bused表示winsockserver(i)控件是否已被载入在与某个客户端通信使用,如未使用,则通过load方法将winsockserver(i)控件动态载入,随后调用accept方法接受客户端程序连接请求。
其中maxonlineuser是一个常量,表示最大在线用户数量。
typeonlineuserinformation
busedasboolean‘对应下标的winsock控件是否已被载入在用
useridasstring‘对应的用户id
ipaddrasstring‘对应的客户机ip地址
bloginedasboolean‘对应的用户是否登录
endtype
qq密码的破解:
对于我们破解qq密码来说,最重要的就是这个登录包。
在这里包含了和qq密码相关的信息。
其中初始密钥是一个16字节的随机数,用于本身的加密。
这里最重要的就是密码密钥加密的一个空字符串。
所谓密码密钥就是用qq口呤进行两次md5加密后得到的密文,然后以这个密文作为密钥去加密一个空字符串,这次加密使用了反馈的tea算法,加密结果放在qq登录包里,让服务器去验证,由于qq的加密算法使用特殊的填充机制使用qq服务器可以验证出用户密码是否正确,这个会在后面进行详细的解释。
qq登录包里面还有一些诸如登录状态,登录令版和很多未知的内容。
但是这些对于我们破解qq密码来说都没有什么太大的作用。
需要特别提到的是,前面的请求登录令牌包是不加密的,而这个登录包除了初始密钥本身以外的部分都要用初始密钥进行加密,加密算法同样是反馈的tea。
qq服务器在收到这个登录包之后,首先要用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的密信息去解密密码密钥加密的那个空字符串密文,我现在还不确定qq服务器上保存的是密码明文还是密码密钥。
猜测是密码密钥。
这样服务器就用密码密钥去解密那段16位密文,如果用户提交的密码是正确的。
才可以解密成功。
否则解密函数会返回空,认证就失败了。
当验证qq客户端密码准确无误后。
就返回一个登录成功包。
qq的加密算法
了解了上面的qq登录的通信协议之后还不足以破解qq密码,我们还需要掌握qq的加密算法。
前面提到了,密码密钥是用户密码进行两次md5加密之后得到的结果。
然后再用空个结果作为密钥使用tea算法进行加密。
tea是tinyencryptarithmetic的缩写。
顾名思义就是一种比较简单的小型加密算法。
它用一个16字节的密钥去加密一个8字节的明文。
得到一个8字节的密文。
也可以反向从密文解密出明文。
具体的算法可以到网上搜索查阅。
这里就不在赘述了。
但是qq使用的tea虽然是标准的tea。
但是qq却使用了一种自己特殊的填充反馈机制,qq消息被分为多个加密单元。
每一个加密单元都是8字节。
使用tea进行加密。
加密结果再作为下一个单元的密钥。
如果明文本身的长度不是8的倍数。
那么还要进行填充。
使其成为8的倍数。
填充的时候会用一个32位随机数存放于明文的开始位置。
再在明文的最后用0填充为整个长度是8的倍数。
由于会向后反馈这样即使对于相同的明文,因为使用了不同的随机数。
也会产生完全不同的密文。
使用这种特殊的填充反馈算法所导致的结果就是,一段密文只能用加密它的密钥进行解密。
如果使用不正确的密钥。
就无法得到正确的填充结果。
最常见的就是解密后得到的填充数值不是0,这样就判断解密失败。
服务器正式根据这种机制来确定客户端口的密码是否正确的。
这也是我们破解qq密的原理所在。
穷举破解qq密码
有了以上的思路。
只要写出程序就可以实现qq密码的破解了。
首先是抓包。
可以使用winpcap来抓包。
这样在hub环境下可以抓到所有的qq包。
在交换环境中。
我们可以使用一些aRp欺骗工具。
同样可以抓到特定ip所发出的包。
还有qq的加密算法的实现。
参考网上的
perl-oicq和lumaqq等代码也可以轻易实现。
然后用字典或者暴力破解的方法对密文进行解密即可。
解密的过程用伪代码表示如下:
结果=decrypt(密文,md5(md5(密码))),如果结果不为空的时候就是正确的密码。
qq的聊天
(1)发送信息。
一般而言,qq最主要的功能就是聊天。
这样传送数据就是其中的一个重
要途径。
在qq用户发送聊天数据以前,需要在列表框中选择与之通信的好友信息如id及ip地址等。
而当服务器程序根据所选好友的具体位置以及列表框中找到有关控件数据下标值,其实也就是目标id及ip、时间、内容等分别宣示于发送端的聊天窗口中,进而实现聊天双方信息的交换。
(2)接收信息。
如前面所述,接收信息成为了qq的又一重要途径。
一般情况下,qq用
户在接收时,都会逐一读取每条聊天的数据资料,并根据发送方的ip地址以及所在数组中找到发送方的id,然后再利用自定义的方式与过程,把发送信息方的聊天双方的id及ip、时间、内容等显示在接收端的聊天窗口中。
qq文件/自定义表情传送
大家都知道,qq可以传送文件,可以发送自定义表情。
先说官方表情。
官方表情实际发送的是命令字,而没有发送表情。
客户端收到命令字后,会自动解释为对应的表情。
因此,qq20xx正式版的客户端发出的新版表情,在qq20xx及以前的版本无法找到相对应的表情,就无法解释,看到的就会是空白信息,但查聊天记录就会有[表情]字样。
自定义表情的传送是以文件传输方式进行的。
下面说文件传输方式:
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的文件传送就通过服务器中转的方式,顺利进行。
qq是一个基于tcp/udp协议的通讯软件,而msn是基于tcp协议的通讯软件。
那么qq是如何通讯的呢?
在tcp/ip协议中,唯一标识一个应用进程的是socket,它通过网络层的ip地址和传输层的端口号来实现,对与同一个ip地址的内部网络,通过不同的端口号来标识不同的qq进程;当你登陆qq游戏服务器的时候,服务器会保留你的保留ip地址和端口号信息,并在你的好友的qq进程中进行列表显示,然后两个进程就可以通信了。
通常,发送文件的计算机首先要通过消息服务器将其ip地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话。
随即,发送计算机与接收计算机就会在确定好的端口范围内,建立起tcp或udp连接开始文件的检索与传输。
在默认状态下,qq优先采用了udp(userdataprotocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用tcp协议传输数据。
与tcp协议不同,udp协议并不提供数据传送的验证机制——在整个文件传输过程中如果出现数据报的丢失,协议本身并不能作出任何的检测或提示。
因此,通常人们把udp协议称为不可靠的传输协议。
udp协议适用于无须应答、要求时效的软件使用,这样的设计正好与qq追求的目标相符,所以qq优先使用了此协议进行一切功能应用。
但是,由于udp协议具有不可靠性,常会因种种原因导致消息或数据的发送失败(很多时候会发现发送文件给对方接收时,对方根本收不到要求接收文件的消息。
或是发送聊天消息时,对方根本没有收到过消息)。
显然,udp协议由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大
降低了执行时间,使速度得到了保证。
qq在数据传输上更注重实际性能,为了获得更好的使用效果,往往可以牺牲一定的可靠性。
因此,使用qq来传输数据,在很多时候就成了一个“不错”的选择。
一般内网传输首选qq,速度最快,qq的文件传输是直接个人对个人,采用p2p的传输方式,具有不需中转的优势,而且服务器都在国内,传输性能要高于外国im软件。
篇二:
通信协议
通信原理之osi七层参考模型
(一)
1、什么是计算机网络
谈计算机通信原理当然离不开计算机网络,那么什么是计算机网络。
官方定义:
计算机网络是由两台或两台以上的计算机通过网络设备连接起来所组成的一个系统,在这个系统中计算机与计算机之间可以进行数据通信、数据共享及协同完成某些数据处理的工作。
其实说白了就是,计算机组成的网络或者说在这个网络系统中有很多计算机,这里的计算机不仅仅指我们的电脑,其实指的是所有在网络中的网络设备,比如手机,平板电脑等。
2、计算机之间如何进行通信
有了计算机等设备,也就得考虑如何连接起来他们,这就是他们之间该如何通信的问题。
对计算机来说,就是一个硬件设备,如何让计算机与计算机连接起来,必需需要软件的支撑。
那么支持计算机通讯的软件是什么呢?
就是计算机网络参考模型。
这个计算机网络参考模型就是计算机网络软件。
最经典的当然是国际化标准的osi(opensysteminterconnect开放式系统互联)参考模型。
它是通过一个机器上的一个应用进程与另一个机器上的进程进行信息交互。
下面我们了解下这个模型。
2.1、osi七层模型
上面我们已经知道,计算机和计算机之间是通过两个软件进程连接起来的。
但想让这两个进程之间进程通信,还需解决很多问题。
osi参考模型解决此问题是,首先就是分层,简单的来说,这两个进程之间的通信是通过七大部分来完成,也就是osi七层参考模型。
每一层都完成网络当中的一个独立任务。
下面是七层模型图:
这张图看起来确实复杂,让我们分解来看,主机a和主机b都的进程都分七层处理,下面首先了解下各层什么作用。
(1)物理层
在osi参考模型中,物理层(physicallayer)是参考模型的最低层,也是osi模型的第一层。
物理层的主要功能是:
利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
使其上面的数据链路层不必考虑网络的具体传输介质是什么。
―透明传送比特流‖表示经实际电路传送后的比特流没有发生变化。
物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和规程特性。
如规定使用电缆和接头的类型、传送信号的电压等。
在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是bit。
理解着确实难,不过总之一句话,就是把最初的电流什么,为上一层提供物理连接。
保证电流的透明化等。
(2)数据链路层
datalinklayer,osi参考模型的第二层,它控制网络成和物理成的通信,是一个桥梁,其主要功能是如何在不可靠的物理线路上进行数据的可靠传递。
说白了就是保证传输的可靠性。
为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。
帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及检错和控制信息。
其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。
如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
数据链路层的功能独立于网络和它的节点和所采用的物理层类型,也不关心是否正在运行word、excel或使用internet。
有一些连接设备,如交换机,由于它们要对帧解码并使用帧信息将数据发送到正确的接收方,所以它们是工作在数据链路层的。
数据链路层在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧在信道上无差错的传输,并进行各电路上的动作系列。
数据链路层在不可靠的物理介质
上提供可靠的传输。
该层的作用包括:
物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
感觉挺难懂的,简单总结为保证数据传输的可靠性,还有纠错和重发机制等。
(3)网络层
networklayer,osi参考模型的第三层。
其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。
网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点a到另一个网络中节点b的最佳路径。
由于网络层处理,并智能指导数据传送,路由器连接网络各段,所以路由器属于网络层。
网络负责在源机器和目标机器之间建立它们所使用的路由。
这一层本身没有任何错误检测和修正机制,因此,网络层必须依赖于端端之间的由dll提供的可靠传输服务。
简单的来说就是在网络中找到一条路径,一段一段地传送,由于数据链路层保证两点之间的数据是正确的,因此源到目的地的数据也是正确的,这样一台机器上的信息就能传到另外一台了。
但计算机网络的最终用户不是主机,而是主机上的某个应用进程。
这个过程由传输层实现。
(4)传输层
transportlayer,osi参考模型的第四层。
传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。
除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。
例如,以太网无法接收大于1500字节(byte)的数据包。
发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。
该过程即被称为排序。
工作在传输层的一种服务是tcp/ip协议套中的tcp(传输控制协议),另一项传输层服务是ipx/spx协议集的spx(序列包交换)。
网络层交给传输层后,传输层必需标识了服务是哪个进程请求的,要交给谁的问题。
我把东西交你时,希望通知你一下,就是会话层的工作。
(5)会话层
sessionlayer,osi参考模型的第五层。
负责在网络中的两节点之间建立、维持和终止通信。
会话层的功能包括:
建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。
通知有人给你打好招呼,以便进行通话。
就像现在我和你说话,你耳朵听到了也能理解,但如果下面是外国人,他听到了我的声音,他理解了吗?
他不能理解。
那对于计算机网络来言,客户机发了一个请求给服务器,服务器应该能理解这个请求到底是什么,所以接下去的问题是你怎么样理解?
这个理解有两个层次,我讲中国话,他只能懂英文,那么这当中应该有一个翻译。
把汉语翻译成英语,这样的工作就交给下一层表示层来做了。
(6)表示层
presentationlayer,osi参考模型中的第六层。
应用程序和网络之间的翻译官,在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。
表示层管理数据的解密与加密,如系统口令的处理。
例如:
在internet上查询你银行账户,使用的即是一种安全连接。
你的账户数据在发送前被加密,在网络的另一端,表示将对接收到的数据解密。
除此之外,表示层协议还对图片和文件格式信息进行解码和编码。
(7)应用层
applicationlayer,osi参考模型中的最高层,即第七层。
应用层也称为应用实体(ae),它由若干个特定应用服务元素(sase)和一个或多个公共应用服务元素(case)组成。
每个sase提供特定的应用服务,例如文件运输访问和管理(Ftam)、电子文电处理(mhs)、虚拟终端协议(Vap)等。
case提供一组公共的应用服务,例如联系控制服务元素(acse)、可靠运输服务元素(Rtse)和远程操作服务元素(Rose)等。
主要负责对软件提供接口以使程序能使用网络服务。
术语―应用层‖并不是指运行在网络上的某个特别应用程序,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。
举个例子来理解:
我这边说的是普通话,对面对方只能动英文,对方通过表示层把我的话翻译成了普通话,但未必对面就某些特殊汉子,词组的意思。
那么就需要专业知识和
领域知识,学习后才能听懂。
应用层就是干这个的。
对于计算机来讲,每一个应用都有它特定的表达方式。
总结下:
1.物理层:
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。
这一层的数据叫做比特。
2.数据链路层:
定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。
这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- qq 应用 协议
![提示](https://static.bdocx.com/images/bang_tan.gif)