近段时间对微信等即时通信工具的通信方式很是好奇,就学习钻研了一下,粗浅心得记录如下。
一、长连接
客户端好比风筝,长连接好比牵着风筝的线,线的这一端系在服务器的“手里”。“风筝”漫天飞,IP号很可能不停地变,每变一次,客户端就将新IP号告诉服务器,以确保长连接通畅。服务器若想找那个客户端,只用通过长连即可。长连接的存在与客户端的IP号老是变化有重要关系。
IM服务器(即时通信服务器)总是“一对多”,一台服务器同时维持百万级别的长连接应该不罕见。这么多客户端如果长时间(比如4.5分钟,或30分钟)不与服务器通信,通信系统就会“掐断”这个联系。为了不被掐断,就每隔一段时间(小于掐断时间,如4.4分钟、29分钟)“假”联系一次(比如发一个空包),告诉通信系统:我们还联系着呢!这就是“心跳”。
二、即时通信的“通信方式”
方式一只通过TCP连接,如下图:

通过TCP连接,可靠性高,适用于诸如QQ、微信、支付宝等通信软件的账户登录和支付相关功能。其缺点是时延较长,但由于已经建立了长连接,省去了连接时间,而且使用场景对时间要求不高,使用频率较低,这种较长时延还是可以接受的。比如超市付款,等待后台反应时间,0.1秒和0.5秒的消费体验差距不大。但这种较长时延放在文字聊天、视频通话上,体验是很糟糕的。
方式二:客户端、服务器之间的“双向UDP连接
简单文字信息”传递,如下图:

A和B之间通过IM中转连接。A和IM、B和IM之间都是双向UDP连接。比如A和IM之间,A要向B发信息,先以UDP方式将信息发给IM,IM收到信息后,马上以UDP方式给A一个反馈:我收到了!这就是双向UDP连接。随后IM再把该信息以UDP方式传给B,B收到信息后,马上以UDP方式给IM一个反馈:我收到了。
UDP连接信息传递快,时延低,适合聊天场景,为了克服其传递信息不可靠的缺点,再多加一个对方的反馈:如果信息发过去,一定时间内没有反馈,说明对方可能没收到信息,那就再发一遍,或给出“信息传递失败”提示。即使带上反馈,总时延可能也是用户无法察觉的。
“大文件”(视频、图片、音频等)的传递,如下图:

这种情况与传递简单文字信息相似,不同的是此时通过IM中转的不是信息的内容,而是信息存储的地址。A发送信息之前,先把文件存储在“文件服务器”中,将返回的地址传给IM,IM再把地址信息传给B,让B根据地址,去“文件服务器”自取。
此过程时延较长,但使用频率不大,用户总体体验还行。
方式三点对点UDP连接,如下图:

首先,A从客户端获取B的IP及状态(如是否在线),将数据打成“包”,源源不断地向B“扔去”,B也将要发送的数据打成包,源源不断地向A“扔过来”。这其中应该有一些技术手段保障接收到的数据包尽量少丢包、不乱序。
以前学UDP时,总是迷迷糊糊,书本上讲的一带而过,感觉UDP就像“广播”,漫无目的地“播送”,其实不然。UDP方式下要向某客户端发数据包,必然要知道对方的IP,就像投篮必然要知道篮筐在哪里。而对方的IP总在变化(一会用流量,一会用WiFi),要想时刻知道对方的IP,必然要用到服务器到客户端的长连接,通过长连接,服务器才能清楚知道客户端的IP。这些知识,在讲UDP时大多书本没说清楚,讲得初学者如坠云雾。UDP连接由于有其速度快的优越性,其不可靠性又可以通过技术手段大大降低,在现实中被广泛应用(视频/语音聊天、视频会议、直播等),但书本上具体应用的介绍却偏少了。
三、心得体会
写此文之前,觉得都想清楚了,可真提笔写时,又觉得困难重重:一些原理还是没搞清楚,一些名词还有待进一步确认,示意图怎么画,材料怎么组织;可真正写出来了,觉得脑子清晰多了,收获多多,力量倍增,有一种征服的快感。
所以,一个阶段的学习之后,要总结总结,写一写,整理一下脑子,做一下记录,从而有真正的提高。
要有想法,更要勇于、善于将想法变成现实。

学习总结:即时通信的方式相关推荐

  1. 视频会议系统EasyRTC常见的几种架构方式及应用场景:MCU/SFU、视频会议、应急指挥、即时通信

    我们这里常说的RTC可以理解为WebRTC技术,因为WebRTC技术是目前使用最广泛的即时通信技术,虽然在早期我们提到WebRTC.提到视频通话就会想到P2P的方式,但实际的视频通话方式背后的逻辑有很 ...

  2. 阿里云旺即时通信OpenIM(一)基础学习

    文章目录 概述 下载 申请 创建项目 概述 OpenIM是阿里百川开发的一套即时通信的第三方SDK,可以帮我们快速实现即时通信的功能.免费,功能不是很强大,而且已经停止维护和更新了.我在论坛上看到很多 ...

  3. 即时通信是机遇也是挑战

    2019独角兽企业重金招聘Python工程师标准>>> 即时通信给运营商带来哪些挑战? 即时通信将分流运营商的传统业务     即时通信软件不仅与运营商提供的短信.语音一样,可以实现 ...

  4. 中油即时通信电脑版_市场营销之即时通讯营销

    ✎ IM营销又叫即时通讯营销(instantmessaging),是企业通过即时工具im推广产品和品牌,以实现目标客户挖掘和转化的网络营销方式. 封面设计丨Sweety 责编丨花花 第60篇丨每日一篇 ...

  5. BIO、NIO、AIO 详解和基于BIO模式下即时通信

    第一章 BIO.NIO.AIO课程介绍 身边同学写的,没发布出来,我算是转载 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者 ...

  6. IOS- 即时通讯原理,使用XMPPFramework实现即时通信

    即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前者是以数据流的形式,将传输数据 ...

  7. 飞信2015服务器未响应,即时通信天下已定 飞信再难复活

    谈及飞信,或许移动的老用户会有印象.移动旗下的飞信曾名噪一时,便捷的通讯工具而且可以与短信无缝对接,但随着智能手机的普及微信出现,飞信悄然失去了光彩.而如今移动虽然想重金砸活飞信,但飞信复活已经难于上 ...

  8. (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案

    一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...

  9. [C# 网络编程系列]专题九:实现类似QQ的即时通信程序

    引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在 ...

最新文章

  1. Sql Server相关报错解决
  2. 【百家稷学】卷积神经网络的前世、今生与未来(武汉工程大学技术分享)
  3. linux usb init,复制Linux liveUSB导致init.d脚本出错 - 不可能..?
  4. java jsessionid 会话,如何使用JSESSIONID手动加载Java会话?
  5. Hash算法大全(java实现)
  6. Max Script|多边形的控制
  7. TB6612FNG电机驱动模块使用说明
  8. 开博尔android播放器,你看!你细看!开博尔Q50播放器本地和NAS文件管理方式详解...
  9. PVT(Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions)
  10. oracle查看密码期限,oracle永久密码和登陆次数无限制设置
  11. 华为交换机SNMPv2配置步骤
  12. PUM-main makefile报错 #2
  13. axure如何竖立文字_Axure pr 如何让文字显示为竖着的?
  14. 超链接 番茄札记 html,番茄学习法笔记以及初始尝试
  15. 如何输入一串带空格的字符串?
  16. SQL2000有文件挂起问题
  17. OkHttp3 发送网络请求服务器
  18. VC动态更改窗口图标
  19. HDU(2212) DFS
  20. JCBD - 4 - JCBD - CRUD操作 即:JDBC常用接口详解

热门文章

  1. 我的第一篇博文,鼓励一下自己好好学习
  2. 支持html的免费建站,20个非常不错的HTML5免费建站模板
  3. centos关闭SELinux
  4. 国产2.4GHz氛围灯带智能家居灯控应用方案芯片CI24R1
  5. Newtonsoft.Json
  6. 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
  7. 某大型超市零售经营报表(wps)
  8. 计算机会计期末考试试题题量及构成,2021初级会计考试题量及评分标准
  9. apache 302重定向
  10. 扔飞镖与编程-或许我们应该关注结果