QQ2007beta4 版本的通信原理
很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。当强调传输性能而不是传输的完整性时,如:音频和多 媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换。把 SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料 的性能低下,但是我们相信在不远的将来,TCP可靠的点对点连接将会用于绝大多数的网络应用。
我研究的是 QQ2007beta4 版本的通信原理,相信之后的版本暂时也不会有改动。。
1 、登陆。不管 UDP 还是 TCP ,最终登陆成功之后, QQ 都会有一个 TCP 连接来保持在线状态。这个 TCP 连接的远程端口一般是 80 ,采用 UDP 方式登陆的时候,端口是 8000 。因此,假如你所在的网络开放了 80 端口( 80 端口是最常用端口。。就是通常访问 Web 的端口,禁掉它的话,你的网络对你来说价值已经不大了),但没有屏蔽腾讯的服务器 IP ,恭喜你,你是可以登陆成功 QQ 的。
2 、聊天消息通信。采用 UDP 协议,通过服务器中转方式。因此,现在的 IP 侦探在你仅仅跟对方发送聊天消息的时候是无法获取到 IP 的。大家都知道, UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用 了上层协议来保证可靠传输:如果客户端使用 UDP 协议发出消息后,服务器收到该包,需要使用 UDP 协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到 “ 消息发送失败 ” 但对方又收到了这个消息 的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
3 、文件 / 自定义表情传送。大家都知道, QQ 可以传送文件,可以发送自定义表情。先说官方表情。官方表情实际发送的是命令字,而没有发送表情。客户端收到命令字后,会自动解释为对应的表情。因此, QQ2007 正式版的客户端发出的新版表情,在 2007beta4 及以前的版本无法找到相对应的表情,就无法解释,看到的就会是空白信息,但查聊天记录就会有 [ 表情 ] 字样。自定义表情的传送是以文件传输方式进行的。下面说文件传输方式: 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 的文件传送就通过服务器中转的方式,顺利进行。(注:服务器文件中转使用 443 端口)
“ 穿透内网 ” 的原理就是这样的。至于其中的程序细节,暂时还没研究到。。谁有空就研究研究吧,呵呵
4 、小结。结合 1 跟 2 ,可以知道,如果一个局域网只开放 80 端口, QQ 是可以登陆成功的,也可以进行聊天。但传送文件也是不可以的,除非你们都在同一个内网。如果局域网还同时开放 443 端口,那么,恭喜你, QQ 的功能你都可以正常使用。
转载于:https://blog.51cto.com/ohyeahbbs/821810
QQ2007beta4 版本的通信原理相关推荐
- HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
摘要:本节主要来讲解Android10.0 HwBinder驱动的流程 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...
- HwServiceManager篇-Android10.0 HwBinder通信原理(五)
摘要:本节主要来讲解Android10.0 HwServiceManager的通信原理 阅读本文大约需要花费34分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,And ...
- HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
摘要:本节主要来讲解Android10.0 Native层的HIDL服务创建和Native层的Client验证 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Androi ...
- HwBinder入门篇-Android10.0 HwBinder通信原理(一)
摘要:本节主要来讲解Android10.0 HwBinder的通信原理概要 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平 ...
- Android10.0 Binder通信原理(五)-Binder驱动分析
摘要:本节主要来讲解Android10.0 Binder的驱动层分析 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计 ...
- Android10.0 Binder通信原理(四)-Native-C\C++实例分析
摘要:本节主要来讲解Android10.0 Binder的Native层实例流程 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...
- Android10.0 Binder通信原理(三)-ServiceManager篇
摘要:本节主要来讲解Android10.0 Binder中守护进程ServiceManager是如何启动.注册.获取服务 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于A ...
- Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
摘要:本节主要来讲解Android10.0 Binder.HwBinder.VndBinder的关联与各自作用 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Androi ...
- Spark详解(四):Spark组件以及消息通信原理
1. Spark核心基本概念 Application(应用程序):指用户编写的Spark应用程序,包含驱动程序(Driver)和分布在集群中多个节点之上的Executor代码,在执行过程中由一个或多个 ...
最新文章
- 使用JavaScript在下拉列表中获取选定的值
- C# 字符串 数据类型 判断 与特定规则验证
- Matlab:成功解决 Inner matrix dimension must agree
- 博弈论(Game Theory) - 04 - 纳什均衡
- 用pandas填充时间序列缺失值
- 什么是Kubernetes的CRI - 容器运行时接口
- 建议提交的时候默认保存到剪贴板
- k8s mysql pv_k8s+mysql+pv+pvc+NFS实现mysql容器编排
- 深度学习2.0-39.RNN训练难题-梯度弥散与梯度爆炸
- 手机端html本地存储,HTML5 web storage本地存储
- 爱问et连接mysql,大厂爱问的MySQL事物问题,看这一篇就够了!
- 【读书笔记-数据挖掘概念与技术】数据预处理
- 极速office(excel)根据身份证号如何提取年龄
- 快速清理C盘的四个方法
- Excel表格怎么随机打乱顺序
- 气体涡轮流量计和涡街流量计的区别
- mysql根据出生日期计算年龄并查询
- 苹果 WWDC21 发布会全汇总,iOS 15更个性化,全家桶协作更有生产力
- 劳务派遣员工转正制度是什么
- linux 防火墙黑名单
热门文章
- linux_CentOS重启网络命令
- 为Linux编译atheros ar1111(设备ID:168c:0037,AW-NB100H – AR5B225 Atheros half size)网卡驱动...
- 【论文翻译】FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection
- 树莓派系列-6-Qt控制树莓派GPIO(3B V1.2)
- sparkstreaming监听hdfs目录_Spark Streaming消费Kafka数据的两种方案
- SpringCloudAlibaba+Redis+MQ+MySQL+飞滴“网约车”项目!(含APP端)
- html 如何设置艺术字体
- python的有效变量名_python里用变量命名改善代码质量
- Spark 开发入门
- 计算机专业英语作业池,计算机专业英语作业(1)..docx