whatsapp用的什么通信协议

本文是洞悉硅谷系列文章的第二篇,我们将介绍一下怎样搭建Whatsapp系统?。本系列现在包含下面几篇文章:

1, 洞悉硅谷系列一:Uber系统构建

2, 洞悉硅谷系列二:Whatsapp系统构建

Whatsapp提供了和微信大概千篇一律的功能。现在服务了10多亿的用户,是环球最大的即时通讯App。

1,总体架构

Whatsapp的大抵架构如下:

图片引用自https://codetiburon.com/create-chat-app-like-whatsapp/

上面的架构提现了下列几个重要点:

  1. Whatsapp接纳了XMPP及时通讯协议。后来渐渐用内部实现的基于XMPP的扩展协议来更换掉了XMPP。
  2. App端使用SQLite当地数据库存储已经收到的聊天信息和用户!已经发送但由于网络缘故没有发送成功的聊天信息。
  3. Whatsapp的后台大部分都是Erlang编写的。
  4. 使用Ejabberd作为XMPP协议的即时通讯服务器。Ejabberd是可扩展性最好的一种Jabber/XMPP服务器之一,支持多个服务器摆设,而且具有容错处置,单台服务器失效不影响整个集群运作。
  5. 使用Erlang VM BEAM ,同时写了大量的patch来对BEAM进行优化。
  6. 服务器端操作系统使用FreeBSD。
  7. 使用Erlang web服务框架Yaws来提供HTTP接口,这些接口重要提供登录、注册、上传图片/视频、获取历史消息列表等功能。Yaws服务返回的部分内容被CDN进行缓存。
  8. 使用Mnesia来管理分布式数据库。Mnesia 是 Erlang 运行时中自带的一个数据库管理系统(DBMS)。
  9. 纵然用了关系型数据库好比Mysql,也使用了NoSQL数据库Riak。
  10. 后台通过WebSockets向移动端App推送消息。

2,XMPP简介

Whatsapp使用XMPP(E x tensible M essaging and P resence P rotocol)协议来完成即时聊天消息的通报。XMPP代表了:

  • P(Protocol),XMPP是一个协议,一组系统间通讯的尺度。
  • P(Presence),Presence决定了XMPP实体的状态,用来告诉服务器该实体是在线、离线要么繁忙。
  • M(Messaging),指用户发送的消息。XMPP使用一种非常高效的推送机制来及时发送用户消息。
  • X(eXtensible),正如上文提到的,Whatsapp后来用基于XMPP的扩展协议来更换了原生的XMPP协议。

XMPP一样平常会被拆分为两部分,XMPP焦点协媾和XMPP扩展协议。

XMPP焦点协议定义了如下服务:

  • 一对一消息。即一个用户给另一个用户发送消息。
  • 数据通讯安全机制。通过使用STARTTLS、TLS和SASL等协议来确保消息通报的安全性。
  • 在线状态和通讯录。在线状态服务可以获取通讯录内里的好友的状态;而通讯录服务则帮助管理通讯录,好比用户使用新手机登录时,可以通过该服务拉取好友列表。

XMPP扩展协议则定义了如下服务:

  • 群聊。该服务容许创建聊天室。
  • 服务发现。容许客户端应用来发现服务端提供了哪些服务。

一个典型XMPP应用架构如下:

图片引用自https://www.blikoontech.com/xmpp/xmpp-a-soft-friendly-introduction

上图有几点需要说明:

  • 客户端应用之间不会直接通讯,而是通过server进行通讯。
  • 当server1连接的客户端A(App、PC)给server2连接的客户端B发送消息时,server1会主动将消息转发给server2,然后由server2负责将消息推送给客户端B。

用户之间发送消息时,使用Jaber id作为通讯地点。一个Jaber id由user、domain、resource组成。好比下图中的 http://user1 @server1.com/pc就是一个Jaber id。

图片引用自https://www.blikoontech.com/xmpp/xmpp-a-soft-friendly-introduction

server之间使用jaber id里的domain来定位客户端地点的server。

user1大概会使用差别的装备,好比平板电脑、pc要么智能手机来访问同一个账户,Jaber id里的resource用来区分这些差别的装备。

3,XMPP中几种常见的消息

3.1 聊天消息
图片引用自https://www.blikoontech.com/xmpp/xmpp-a-soft-friendly-introduction

上图是一个简单的基于XMPP协议的聊天消息,由App发送给server。这个信息内里大概包含的字段及其含义如下:

  • to,吸收端Jaber id。
  • from,可以留空,该客户端所连的server会主动帮助添补该字段。
  • type,消息种类
    • chat,一对一聊天
    • groupchat,群聊
    • headline,消息被当做新消息流,无需相应
    • error,碰到错误
  • body,消息内容
  • thread,我们大概同时和多个人/群在聊天,这个thread用来标识属于哪一个会话。客户端App会根据这个thread来组织聊天记载。
3.2 获取好友的在线状态

通过订阅好友的在线状态,当好友状态发生变更时,客户端会收到类似如下信息:

图片引用自https://www.blikoontech.com/xmpp/xmpp-a-soft-friendly-introduction

QQ提供了好友在线状态表现功能,微信实在没有实现这个功能。

3.3 查询消息

客户端可以向server发送查询消息来获取某些信息。

图片引用自https://www.blikoontech.com/xmpp/xmpp-a-soft-friendly-introduction

上面是一个查询通讯录的例子。当用户使用一部新手机登录自己的聊天软件时,可以通过类似的方法获取好友列表(通讯录)。

4,怎样维护服务器和客户端的映射关系数据?

前面提到,当server1服务的客户端A给server2服务的客户端B发送消息时,server1会主动将消息转发给server2。条件是server1能从某个地方找到客户端B和server2的映射关系,知道客户端B如今正连在server2上。

首先可以确定的是,这个映射关系肯定不会维护在server上,对于server来说,最紧急的事情,是维持和客户端之间的巨大连接(根据之前对Whatsapp内部工程师的采访,Whatsapp的一台server可以连几百万个客户端App),这些连接本身就要占用大量内存,以是内存应该尽量用来服务更多的客户端,而不是用来保存这些映射关系数据。

Whatsapp将这些映射关系数据存在在一个单独的微服务集群上,我们暂时叫这个微服务集群为session服务。对于上面的例子,server1在收到用户A的消息后,会将消息发送给个session服务,session服务将消息路由给server2,再由server2通过Websockets推送给用户B。

5,怎样实现群聊?

对于群聊来说,需要解决的重要问题,就是知道这个群内里有哪些用户。这些信息可以存储在别的一个微服务集群上,这个集群我们称之为group服务。session服务在收到某一条群发消息后,会调用group服务来获取这个群内里的全部用户信息,然后将消息挨个发送给这些用户。

为了进步group服务的吞吐量,我们很轻易使用同等性hash来管理这些group服务集群,在定位某一个群时,使用group id来做hash即可。

本文只是根据网上找到的有限的一些质料对Whatsapp的实现机制做了推测。同时,有些质料也是好几年之前的了,大概并不可以或许反应Whatsapp的最新环境,大家任意看看就好。

参考:

    https://www. blikoontech.com/xmpp/xm pp-a-soft-friendly-introduction whatsapp-architecture-facebook-bought-for-19-billion.html https://www. jianshu.com/p/84d15683b 61e
WhatsApp协议分析陈诉 0、分析结论:

1.whatsapp音视频通讯,必须在对方同意通讯的底子上,才可以或许获取对方的外网IP地点, 经过对whatsapp 通讯的流程分析,发现要想在对方不知情的环境下获取对IP地点,是无法实现的。详细详见下面的分析過逞。

2.whatsapp语音通话是经过加密处置的,密钥在通话开始前经过XMPP协议传送给对方的, 以是通讯過逞音视频通讯包是无法监听聊天内容的。详细详见下面的分析過逞。



1、语音通讯之获取对端外网IP 分析過逞:

景象: ClientA 给 ClientB 发起语音通话请求, ClientB同意电话请求, 最终由CLientB停止电话请求!!

一、ClientA 给 ClientB 发起语音通话请求, ClientA端调用startCall 函数,

1.调用 generateE2EKeys 天生一个E2E的callkey, callkey用于通话的数据的加解密

2.发送一个calloffer请求给ClientB, 请求包中含有callkey

3.ClientB收到calloffer请求后, 读取出callkey,用于通话的数据的加解密,

4.然后回答一个PreAccept一个回答包给ClientA。包中含有音视频的一些属性信息,用于ClientA初始化OpenSLSE 的Player的参数

4.ClientA 收到PreAccept请求包信息,初始化,为通话做预备工作。 然后等候ClientB的选择:同意通话,还是拒绝通话。

二、ClientB:同意通话请求 --- Client端调用acceptCall

1.调用audioStream启动ClientB的通讯从操作,SRTP的操作,OPENSL音频方面操作

2.发送Accept回答包给ClientA, Accept包含,ClientB的外网IP地点--endpoints, 音视频的编码格式--encoding, 音频的样本收罗率:rate

3.ClientA 收到Accept包,调用nativeHandleCallOfferAccept 函数,收到对端的外网IP地点,然后创建P2P连接,连接成功开始通话

综上分析: 必须需要ClientB同意通话,才能拿到用户ClientB的外网IP地点,以是要实现静默方法获取对端的IP地点是不大概是事情。

2、语音通讯之语音信息加解密 分析過逞:

1.WhatsApp的语音通讯使用的是SRTP协议进行传输的,如下图所示:

2.WhatsApp语音数据在网络传输前经过两次加密, 一次是WhatsApp语音数据的加密, 二是SRTP传输协议内部加密。 两次加密使用都是对称加密算法, 两次加密的密钥都出处于一个32位随机变量Callkey。而callkey 根据上文分析师在通话前C!all-Offer请求包通报的。

综上所述: 无法通过是解私语音数据包来实现!对语音的监听的!!!


null

时间: 06-14

TCP (传输控制协议)


传输控制协议(Transmission Control Protocol, TCP)是一种连接导向的、可靠的、基于位元组流的运输层(Transport layer)通讯协议,由IETF的RFC 793说明(specified)。在简化的电脑网路OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

在网际网路协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。差别主机的应用层之间常常需要可靠的、像管道一样的连线,但是IP层不提供这样的流机制,而是提供不可靠的包互换。

应用层向TCP层发送用于网间传输的、用8位元位元组表现的资料流,然后TCP把资料流分割成得当长度的报文段(通常受该电脑连线!的网路的资料链路层的最大传送单位(MTU)的限定)。之后TCP把结果包传给IP层,由它来透过网路将包传送给吸收端实体的TCP层。TCP为了保证不发生丢包,就给每个位元组一个序号,同时序号也保证了传送到吸收端实体的包的按序吸收。然后吸收端实体对已成功收到的位元组发回一个相应的确认(ACK);假如发送端实体在公道的来回时延(RTT)内未收到确认,那么对应的资料(假设遗失了)将会被重传。TCP 用一个校验和(Checksum)函式来查验资料是否有错误;在发送和吸收时都要盘算校验和。

TCP连线包括三个状态:连线创建、资料传送和连线停止。


本文网址: http://www.wtotea.com/doc/202117184244_3783_1951817854/home