漫谈qq通信原理

注:转载请注明blog.csdn.net/gcc_sky

Table of Contents

  • 1 QQ通讯原理
    • 1.1 聊天消息通信
      • 1.1.1 NAT及NAPT介绍及内网client通过NAPT登录到服务器
      • 1.1.2 两内网client通过UDP打洞(holepunching)互接发消息

1 QQ通讯原理

发送消息时利用UDP打洞;登录时类似使用HTTP协议,进行交互,只是腾讯使用自主研发的服务器或协议。

1.1 聊天消息通信

1.1.1 NAT及NAPT介绍及内网client通过NAPT登录到服务器

NAT(Network Address Translation)最初是在路由器中的一个模块。

每个处于网络中的节点都具有IP地址,但是全球IP地址是有限的,不可能为每一个连入网络的节点都分配唯一一个节点;在实际网络环境中,其实并不需要每个主机都拥有自己的IP,如处于同一局域网的若干台主机,它们同外网通信其实只需要一个外网IP即可。那么此时就需要一个中间模块来处理IP多到一的映射关系,这个模块就是NAT,它完成内网与外网关系的记录及管理,但NAT只完成局域网中IP的映射。

另一种NAT为NAPT,它不仅负责建立IP间的映射关系,同时也为创建管理端口映射。接下俩NAPT将是我们讨论的重点。我们的内网client可通过NAPT连接外网服务器与之通信,如下图:

漫谈qq通信原理_第1张图片

client A(10.19.9.89:55579)往外网server(121.115.11.81:80)发送数据。

首先,它经过NAT模块,NAT为其创建会话(session A),并临时分配端口(31234,与client A端口55579对应起来),而此时的TCP包中的源地址由原本的10.19.9.80:55579变为61.183.172.149:31234;

当server响应内网client A请求时,它实际发送的目标地址是NAT(61.183.172.149:31234),当NAT接收到这样的数据包时,并查询是否有端口映射(61.183.172.149:31234 <–> 10.19.9.89:55579),如有,即将数据包发送给client A进一步处理。

根据创建session时分配端口的方式不同,NAPT分为以下两种:

1. ConeNAT,则在创建新session时,仍使用之前的临时端口,如上图方式;

2. sysmetricNAT,创建新session时,重新分配临时端口,如下图:

漫谈qq通信原理_第2张图片

1.1.2 两内网client通过UDP打洞(holepunching)互接发消息

假设,两个处于不同外网的局域网clientA/B同时连入server,clientA与clientB是好友,clientA通过server得知在线好友clientB的外网IP,然后给该外网IP发送消息;然而,实际上好友clientB并不知道并不知道好友A给自己发消息(换句话说,没有准备相应socket进行消息接收),即clientA发送的消息将被clientB中的NAT拒绝;那么如何完成两外网client间的通信呢?我们需要一中介来为client间传达悄悄话,让他们为通话做好准备(建立连接,监听,接收。。),这种技术称为“打洞”;

漫谈qq通信原理_第3张图片

首先,clientA告诉server“我准备发消息给B,能帮我告诉他,准备下吗”,

server则告诉在线的clientB”A找你聊天,请准备一下“,

clientB收到通知,准备好后告诉server”请麻烦帮我告诉A,我已经OK了“;

server收到clientB回应,则告诉A”B已经准备好了,你请继续“;

这时候A就开心了,开始向B发送信息,进行聊天。


你可能感兴趣的:(磕磕碰碰学网络编程)