IM相关技术

news2025/2/9 6:58:33

messages表
保存的消息记录(Saved Messages)

bff,session
TON以及tdlib
官方版设置中文 tg://setlanguage?lang=classic-zh-cn
https://web.telegram.org/k/
https://web.telegram.org/a/

https://github.com/TGX-Android
https://github.com/NekoX-Dev/NekoX, 内置公共代理不可用
nebula.chat:企业版客户端。

activitypub:开放社交网络的分布式网络协议

mtproto的go实现

teamgram的linux服务端 Docker部署
CentOS7 teamgram-server环境搭建
signal号称所有数据在用户手上,服务端只存储了无法解密的加密数据,tg里只有secretchats与之功能一样,其他的所有数据tg的服务端理论上可以看
因为tg的服务端存储的不是加密数据,所以才能推出超大群/订阅号等功能,但signal应该是无法支持较大群的
即使是基于signal协议或tg的secretchats机制,但如果开发商留个后门,偷偷上传客户端key,这种情况服务端也能够查看加密数据。

加密有两种,一种是像signal那样,数据即使服务端也无法解密,这只能基于signal协议或tg的secretchat机制。
另一种是服务端对数据的加密,这仅仅是减少因为黑客攻击或其他的导致数据泄露的风险,但理论上服务端(运营方)是有办法查看你的聊天数据的

https://telegram.org/blog/passport 授权其它应用登录

社区版只支持普通聊天和200人以下小群,短信验证码要自己接入.开源版不支持web.
只能搜到设置了username的用户,搜到了才能加好友。没有channel功能
开源的能私聊和群聊.其他功能都需要授权.语音通话不支持
rtc/bots等收费

dc的ip:154.175.55.149。tg handshake 之后会把dc地址保存到安卓本地tgnet.data文件。可以调试代码
主机的话最低配 4核8G

https://github.com/nebula-im/imengine teamgram最早验证版本

tg仅在端到端加密里才有阅后即焚

用户组权限由创建者或管理员在app里控制。底层的权限控制逻辑代码有

c++:folly 是 fb的c++基础库,相当于google的base库,是所有fb的开源c++项目的最底层的库.
基于folly的wangle,相当于fb的c++版本的netty
proxygen是基于wangle的http系列库,支持HTTP/1.1, SPDY/3, SPDY/3.1, HTTP/2, and HTTP/3等
用好这些,单机百万级连接,高性能服务端支持都能仰望了

message id是一个单调连续递增的id,teamgram用的是redis生成的,你可以用其他方式生成,比如zookeeper或etcd等
tg的消息(私聊和群消息)是基于user的单调连续递增id
getNextId,这是服务端做的

TG在创建auth key的时候,服务器第一次会返回一个小于等于2^63-1的pq,它是两个素数的乘积
client 与 server 通信是需要 auth_key 生成 aes_key 来加密的.每个设备都要同步消息

发消息:大群和channel读扩散,小群和普通聊天写扩散
tg的mid有两种:
一种是基于用户的,也就是所谓的写扩散消息,单调连续递增
另一种是基于大群和订阅号的,也就是所谓的读扩散,单调连续递增

但从客户端代码看,仅仅需要单调递增,不是连续也没什么关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xvWkcPdv-1686730337300)(pic/img_6.png)]

uidgen/seqsvr: 序列号生成器:微信的seqsvr最大的问题是一个集群只支持一个序号,一个集群最少3台机器保证一套seq
量不大也可以直接用mysql,redis,大场景上阿里云的话,一劳永逸的方案是用tablestore
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fTtpwbu-1686730337301)(img_2.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJKjy1f7-1686730337302)(img_3.png)]

pts包含了所有需要同步的事件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IosYSbMG-1686730337302)(img_4.png)]

1.数据库里面能看到消息,但是没有推送过来

查一下日志,一般两种情况:

  1. kafka是否正常工作
  2. redis数据是否丢失,注意序号服务(idgen)的redis的数据要持久化

2.redis aof file 丢失

目前的解决方案是通过修复工具手动修复
完全丢失可以从db里捞

3.群消息

1.消息列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LP3GowQD-1686730337303)(pic/img.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMbGSPRd-1686730337303)(pic/img_1.png)]

消息体3523227325 这个是群ID 后面是消息递增ID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIHAtDSl-1686730337303)(pic/img_2.png)]

这里再记录一条 这个群ID 的最新消息递增ID
当用户 打开会话列表时 他只会去读取 MESSAGE_CACHE:3523227325_18。
当用户进入会话ID聊天界面后 再去读取 MESSAGE_CACHE:3523227325_*

2. 会话列表管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7sL9byg-1686730337304)(pic/img_3.png)]

会话列表单独存储,存在APP本地库,只需要存储 会话ID

新消息 让用户去监听读取,用户只需要知道 会话ID的最新消息ID ,用户本地去读取获得。循环去读会话ID
当会话ID 服务器最新消息值 和本地值有差异, 就增加未读数, 获取最新内容 渲染到消息列表
会话ID GROUP_3846113625 本地 SEQ 等于18 服务器SEQ ID 等于18 不变

会话ID GROUP_3846113625 本地 SEQ 等于18 服务器SEQ ID 等于20 未读消息+2 拉取 seq 20 消息内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzoIut8n-1686730337304)(pic/img_4.png)]

4.问题

1. updating 发送成功 接收不到

  1. 检查kafka是否正确工作
  2. 检查redis是否运行正常
  3. 查一下错误日志 logs/bff/error.log, logs/msg/error.log

2.错误

ERR_ENTERPRISE_IS_BLOCKED 表示开源版不支持的功能
INTERNEL_SERVER_ERROR 是服务端问题,表明安装配置有问题

5.api

https://core.telegram.org/methods
updates.getState 获取服务端状态,一般第一次登录时会调用
messages.readHistory(peer: InputPeer.inputPeerUser(userId: 100002, accessHash: 6761312346070604377), maxId: 10605)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXQd1gBT-1686730337304)(img.png)]

客户端重连一定要优先走getDifference 流程 ,不然各种掉消息 不同步问题
secret chat在初始化的时候,假如消息的接收方不在线,暂存消息,等对方上线了 再完成密钥交换.
updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;这个类型没有qts,看起来Telegram官方在实现的时候只是把初始化会话相关的消息暂存了一
离线再上线 先走getDifference 里面的otherupdates字段放进去就行了 然后请求和返回的state里面有qts 用来做偏移查询
客户端一定要先处理other_updates,然后再处理new_messages和new_encrypted_messages

6.Telegram 客户端与服务端的交互流程:

Telegram 客户端发送请求到服务器:Telegram 客户端通过与服务器建立的 SSL/TLS 安全连接向服务器发送请求。Telegram 使用自己的协议(MTProto)进行通信,而不是 HTTP 协议。

Telegram 服务器进行身份验证并返回响应:Telegram 服务器通过验证请求中包含的用户身份信息,并在必要时要求客户端进行身份验证。一旦身份验证完成,服务器会生成响应并通过 SSL/TLS 安全连接发送回客户端。

Telegram 客户端解密和处理响应:Telegram 客户端使用服务器提供的密钥对响应进行解密和验证,并通过客户端的动态方法调用(动态方法调用是 Telegram 协议的一个重要特性,它允许客户端和服务器自由地交换数据)将响应中的数据传递到客户端应用程序中。

Telegram 客户端处理响应并进行后续操作:Telegram 客户端接收到服务器响应后,会根据响应的类型执行相应的操作,例如更新用户的聊天列表、发送聊天消息、下载文件等等。这些操作通常涉及到与服务器的多次通信,以确保数据的顺序性和一致性。

总体来说,Telegram 的客户端与服务器的交互是通过安全的 SSL/TLS 连接进行的,整个流程非常灵活和高效,使得 Telegram 能够提供高质量、高速度及可靠性的服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jb8xUip1-1686730337304)(pic/img_5.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-91AlxrKd-1686730337304)(img_1.png)]

Api的 CrC32 的生成,就是截图的TLconstructorSignature 的内容

7.压力负载测试

基于tdlib( https://github.com/teamgram/teamgram-td )或madeline( https://github.com/teamgram/teamgram-madeline )定制一个压测客户端

8.加密

  1. secretchat是密文,服务端也无法解密
  2. 其他的数据目前是明文存储,如果有需求,能加密存储,但是运维时一定要保护好数据加密key

9.Layer

Telegram的Layer是一种通信协议,它由多个层组成。每个层都有不同的功能,用于处理不同的任务和数据传输。

以下是Telegram的Layer各层的功能:

Layer 1:处理基本的数据传输和加密。
Layer 2:添加了消息确认和重试机制。
Layer 3:添加了消息序列化和压缩功能。
Layer 4:添加了分片传输和快速重传功能。
Layer 5:添加了支持代理服务器的功能。
Layer 6:添加了支持VoIP(Voice over Internet Protocol)和视频通话的功能。
Layer 7:添加了支持文件传输和更高级别的加密功能。
每个层都建立在前一个层的基础上,并添加了新的功能和改进。这些层一起构成了Telegram的通信协议,使得Telegram可以高效地传输数据并保护用户隐私。

Telegram的协议版本有很多,以下是一些较为重要的版本及其作用:

Layer 1:最初的Telegram协议版本,支持基本的消息传递和文件传输功能。
Layer 17:引入了加密聊天功能和群组聊天功能。
Layer 23:引入了语音通话和视频通话功能。
Layer 39:引入了公共频道和超级群组功能。
Layer 52:引入了内置支付功能。
Layer 86:引入了可编辑消息、快速回复和多项选择等新功能。
每个协议版本都有不同的功能和改进,旧版本的客户端将无法访问新版本的功能,因此需要升级。同时,新版本的协议可以提高安全性和性能。

10.MTProto

MTProto是Telegram使用的加密协议,用于保护用户数据的安全性和隐私。它是一种自主开发的加密协议,与其他加密协议(如TLS和SSL)不同。
MTProto使用称为“Diffie-Hellman密钥交换”(Diffie–Hellman key exchange)的算法来协商会话密钥,该算法允许客户端和服务器在不泄露密钥的情况下进行安全通信。

MTProto还使用称为“AES-256-CBC”(高级加密标准)的对称加密算法来加密通信。该算法是当前最安全的加密算法之一,它使用256位密钥来保护数据的机密性。

此外,MTProto还使用称为“Perfect Forward Secrecy”的技术来保护用户数据的安全性。这意味着即使攻击者能够获得以前的通信记录,也无法解密以后的通信记录。

总的来说,MTProto是一种非常安全和可靠的加密协议,它为Telegram用户提供了高水平的安全保障

tg 没有 .proto 文件
所有的 .proto 都是外面这些开发根据 tg协议生成的 大多都是参照 windows开源代码里的 schemel.tl文件生成的

11.技术实现

tdlib:用于构建Telegram客户端的跨平台库

协议最外层支持了Transport层相关的一些特性,比如精简版本,QuickACK;再往里面一层是MTProto层,确定了协议的版本之后,MTProto层主要是安全层面的考虑,
所有的安全相关的机制都在这一层处理,比如授权密钥(确保会话的安全性),消息的签名msg_key(确保消息未经篡改);最后是加密过的payload,payload对应就是具体的应用层协议了。

支持PFS.
完美前向保密 (PFS : Perfect Forward Secrecy),也称为前向保密,是一种允许客户端和服务器之间进行短期私钥交换的加密方式

最麻烦的是frontend、handshake和session这块

1. 对于10w的大群,tg群聊一条消息的延迟性为什么感觉不出来?

应用层多播,参考直播弹幕的实现
假如10W人都在线,如果有一百台网关,一个网关也就是1000个在线。网关机订阅统一的10W人群的下推通道,真正的消息扇出就分散到了网关机上,每个也就1000个在线客户端的下推

2.tg的未读消息计数

用msgid 来减
当前超级群最大msgid - 用户已读msgid -(再排掉这个范围内 被删除的消息数量)就是用户未读数
超级群是读扩散 共用一份历史数据 msgid 肯定是连续的啊

官方149.154.167.51 ,
47.103.102.219 社区版

12345
5222
电商、办公类的im都是永久保存的

https://www.betaqr.com/ fir.im 为开发者提供测试应用极速发布,应用崩溃实时分析、用户反馈收集等一系列开发测试效率工具服务
https://github.com/DanTheMan827/ios-app-signer, iOS重签名

https://sms-activate.org/ ,虚拟号码平台

12.IM相关

一套高可用实时消息系统实现:大规模用户

goim

Telegram 客戶端版本比較

1.同类项目:

openim,rocket.chat,铁丝,
wire,tox,matrix的element,
https://www.potato.im/
Signal,mattermost

Mastodon:p2p模式IM,但是可以污染个别实例的域名

Python实现的Telegram MTProto库

Telethon:Pure Python 3 MTProto API Telegram client library, for bots too!

ime2e端对端加密阅后即焚UI
signalYY
TinodeNN简洁
ToxYNX
Briar支持torNX
MatrixYN
JabberNN
NebulaChatYY

fragment.com
c#服务端im:https://github1s.com/loyldg/mytelegram

IRC:应用层的协议。其主要用于群体聊天,但同样也可以用于个人对个人的聊天。早期
STUN:P2P网络要求通信双方都能主动发起访问,但是NAT设备的存在,却阻断了这种主动访问,导致P2P应用无法正常运行。STUN是一种解决P2P应用NAT穿越问题的常用技术。
它允许网络设备找出通信端点经NAT设备后的IP地址和端口号,并利用这些信息在通信双方之间建立一条可以穿越NAT设备的数据通道,实现P2P通信

使用MTProto协议:pyrogram
客服机器人
Telegram(电报):新手指南、使用教程及频道推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类与对象(上)

类与对象(上) 1.面向过程与面向对象初步认识2.类的引入3.类的定义4.类的访问限定符以及封装4.1访问限定符4.2 封装 5.类的作用域6.类的实例化7.类对象模型7.1计算类对象的大小7.2类对象的存储方式的猜想 8.this指针8.2this指针的特性 1.面向过程与面向对…

JavaWeb之JSP

文章目录 JSP的基本介绍JSP的本质JSP的三种语法JSP头部的page指令language属性contentType属性image.pngpageEncoding属性import属性autoFlush属性 - 给out输出流使用buffer属性 - 给out输出流使用errorPage属性isErrorPage属性session属性extends属性 JSP中的常用脚本声明脚本…

贸易企业缺进项严重,如何减轻13%的增值税税负?

贸易企业缺进项严重,如何减轻13%的增值税税负? 《税筹顾问》专注于园区招商,您的贴身节税小能手,合理合规节税! 贸易企业的增值税税负很重,这不仅是因为13%的高额增值税税率,也因为贸易企业缺进…

K8s 部署 Apache Kudu 集群

一、K8s 部署 Apache Kudu 集群 安装规划 组件replicaskudu-master3kudu-tserver3 1. 创建命名空间 vi kudu-ns.yamlapiVersion: v1 kind: Namespace metadata:name: apache-kudulabels:name: apache-kudukubectl apply -f kudu-ns.yaml查看命名空间: kubectl …

傻白入门芯片设计,形式化验证方法学——AveMC工具学习(二十)

一、形式验证方法学 (一)什么是形式化验证? 形式化验证方法学是使用数学证明的方法,分析设计中所有可能的状态空间来验证设计是否符合预期。形式化验证方法主要有三个方面的应用:定理证明、模型检验和等价性检查。 …

让你不再疑惑语音翻译怎么弄

语音是人类交流的一种最基本的方式,但是当我们需要和来自不同国家或地区的人交流时,语言的限制往往让我们感到无力。然而,如今的语音翻译技术正在以惊人的速度发展,使得我们的声音可以轻松地跨越语言的界限。那么,你知…

强化学习:蒙特卡洛方法(MC)

引入蒙特卡洛方法例子 以抛硬币为例,将结果(正面朝上或反面朝上)表示为作为随机变量 X X X ,如果正面朝上则 X 1 X1 X1 ,如果反面朝上,则 X − 1 X-1 X−1,现在要计算 E [ X ] E[X] E[X]。    我们通常很容易…

JDK常用的数据类型【1】 ——HashMap(分享篇)

x mod 2^n x & (2^n - 1) 1. 拿到 key 的 hashCode 值 2. 将 hashCode 的高位参与运算,重新计算 hash 值 3. 将计算出来的 hash 值与 (table.length - 1) 进行 & 运算数据结构 1.B树 和 B树 B树叶子节点可以存放多个元素B树的叶子节点之间是有指针的 红…

网络安全|渗透测试入门学习,从零基础入门到精通—收集信息篇

目录 前面的话 1、收集域名信息 1.1、Whois查询 ​编辑1.2、备案信息查询 2、收集敏感信息 3、收集子域名信息 3.1、子域名检测工具 3.2、搜索引擎枚举 3.3、第三方聚合应用枚举 3.4、证书透明度公开日志枚举 本章小结 前面的话 本人喜欢网络完全的一些知识&#xff…

老油条辞职信写好了,00后卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司,成功拿到了offer,薪资也从12k涨到了18k,对于工作都还没两年的我来说,还是比较满意的,毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王,感觉自己年轻&#xff0…

出现报错Invalid bound statement (not found): xxx.xxxMapper.方法名 时的几种异常排除方法

报错信息:Invalid bound statement (not found): com.ruoyi.enterpriseman.trade.mapper.TradeEnterpriseMapper.selectTradeEnterpriseList 1.mapper.xml中的namespace和实际的mapper文件不一致 这个问题其实很好解决,瞪大眼睛,仔仔细细看看…

[SSM]Maven详解

目录 Maven 自动化构建工具 Maven简介 Maven的核心概念 maven约定的目录结构 仓库 POM文件 生命周期、命令、插件 Maven在IDEA中的应用 IDEA集成maven IDEA创建Maven版java工程 IDEA创建Maven版web工程 IDEA中导入Maven工程(module) 依赖管理…

Windows 离线安装mysql5.7

一、下载MySQL5.7最新版 1、官网地址 https://downloads.mysql.com/archives/community/ 2、下载MySQL5.7最新版 下载下图所示的安装包: 二、安装MySQL5.7 1、解压 将刚才下载压缩包解压搭配目录C:\software\mysql-5.7.41,(路径大家可…

背完这195道软件测试面试题,帮你轻松拿下提前批offer

前言: 最近在整理字节,阿里,腾讯,京东的面试题,挑了一部分在四个大厂面试题中出现频率比较高的,发现还是基础知识比较多,废话不多说,你们自己看看,这里小编只放了面试题&…

电动超声波硅胶洁面仪单片机开发方案

近来,网红超声波洁面仪受到人们喜爱,特别是爱化妆的女性朋友,常用来清洁脸部肌肤。在本方案中,洁面仪IC采用宇凡微YF单片机,我们提供多种洁面仪方案,根据不同功能需求有多个洁面仪芯片可供选择。 一、超声波…

价值5k的软件测试企业级实战项目,只为了回答你软件测试如何学!

学习软件测试如何学,在回答这个问题之前,我先分析下,在企业中做项目整个测试流程是什么样的,你清楚了整个企业的测试流程,就会清楚企业做测试需要什么?从而也就会明白如何去学测试。 1、需求: …

JDBC --- Java的数据库编程

目录 🍈一、数据库编程的必备条件 🍉二、什么是 JDBC JDBC 的优势 🍊三、JDBC 使用流程 以及 常用接口和类的讲解 🍡0. 前置工作 🍭1. 引入依赖 🍬2. 数据库连接Connection 🍬3. 创建操…

11-基于51单片机电子密码锁门禁(实物图+原理图+源程序+仿真+论文)全套资料

编号: 011 本系统采用 51单片机 24C02芯片矩阵键盘 继电器 开锁指示灯 LCD1602液晶 蜂鸣器 而成 1.单片机型号:STC89C52/51、AT89C52/51、AT89S52/51可以任选。程序通用 2.采用矩阵按键输入、1602液晶显示、继电器模拟开锁、发光二极管为开锁指示灯,继电器是可以外…

适配器模式(九)

不管怎么样,都要继续充满着希望 上一章简单介绍了建造者模式(八), 如果没有看过, 请观看上一章 一. 适配器模式 引用 菜鸟教程里面的 适配器模式介绍: https://www.runoob.com/design-pattern/adapter-pattern.html 适配器模式(Adapter Pattern&#…

出海品牌直播带货:虚拟主播的优势与挑战,以及未来趋势揭秘

随着全球化的发展和网络技术的进步,海外直播带货成为了品牌拓展海外市场的一种新方式。而在这个数字化时代,虚拟主播的出现给海外直播带货带来了全新的可能性。 在传统直播带货中,品牌需要派遣代表或明星代言人亲自现场演示产品,…