TCP与UDP的选择--结合QQ来说明

TCP与UDP的选择
如果比较UDP包和TCP包的结构,很明显UDP包不具备TCP包复杂的可靠性与控制机制。与TCP协议相同,UDP的源端口数和目的端口数也都支持一台 主机上的多个应用。一个16位的UDP包包含了一个字节长的头部和数据的长度,校验码域使其可以进行整体校验。(许多应用只支持UDP,如:多媒体数据 流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。) 
        很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择。当强调传输性能而不是传输的完整性时,如:音频和多 媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换。把 SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料 的性能低下,但是我们相信在不远的将来,TCP可靠的点对点连接将会用于绝大多数的网络应用。
QQ通信原理--
我研究的是 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 的功能你都可以正常使用。

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

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

相关文章

Xampp修改数据库默认用户root的密码

Xampp数据库默认用户root,密码为空,修改密码的位置:xampp/passwords.txt转载于:https://www.cnblogs.com/testlife/archive/2012/02/08/2342438.html

1.6元的蓝牙芯片,你能想得到?

前不久喵了个咪在群里发了一个1.6元的SOP8蓝牙芯片的信息,引起了大家的热烈讨论,我当然也按捺不住鸡冻的心情,立马下单买了几片。淘宝连接:KT6368Ahttps://item.taobao.com/item.htm?spma1z09.2.0.0.74a52e8dTpp1my&id630430…

pyplot交互地画多个plot

下面的代码,可以无阻碍地show 5个figure,相当于开启了ipython的interactive 模式 具体参见stackoverflow: in matplotlib, is there a way to pop up a figure asynchronously? 1 #!/usr/bin/python2 import pylab as plb3 import matplotlib.pyplot as…

又是一年中秋节,好想举杯邀明月

世事一场大梦,人生几度新凉。夜来风叶已鸣廊,看取眉间鬓上。 酒贱常愁客少,月明多被云妨。中秋谁与共孤光,把盏凄然北望。 简策写虚名, 蝼蚁侵枯骨。千古光阴一霎时,且进杯中物。 二十四年过去&#xff…

UDT内部代码分析

一. 报文发送 1.CSndQueue::worker中调用CChannel::sendto发送数据报文。 2.CSndQueue::sendto中调用CChannel::sendto发送其他报文, 种类较多主要有: 1)CUDT::connect中调用CSndQueue::sendto发送建立连接请求。 2) CUDT::sendCtrl中调用CSndQueue::sendto发送控制报文。 …

ADC采样效应及相关影响解剖

在前述文章,BUCK电路模拟补偿器的数字化过程 ,我们讨论了模拟补偿器的数字化,事实上,数字化过程的第一个重要的环节就是ADC对反馈量的采样,本文就重点探讨一下由于ADC采样频率带来的一些问题,进而讨论一下相…

2012.2.9日晚亚马逊的一个错误链接截图

1现在时间 2 问题链接 http://www.amazon.cn/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%A2%B0/b/refsa_menu_sef7?ieUTF8&node42787071 3 点击后结果 http://www.amazon.cn/gp/product/B0073RWUQA/refs9_hps_bw_g200_ir05?pf_rd_mA1AJ19PSB66TGU&pf_rd_scenter-5&pf_rd_r0…

Kotlin 的 Array 转 List

Kotlin 的 Array 转 List array.toList() as List<T> 1Kotlin 的 Array 转 ArrayList array.toList() as ArrayList<String>转载于:https://www.cnblogs.com/weizhxa/p/10068944.html

[转]关于sizeof()的一些思考

关键字&#xff1a;sizeof&#xff0c;字节对齐&#xff0c;多继承&#xff0c;虚拟继承&#xff0c;成员函数指针 前向声明&#xff1a; sizeof&#xff0c;一个其貌不扬的家伙&#xff0c;引无数菜鸟竟折腰&#xff0c;小虾我当初也没少犯迷糊&#xff0c;秉着“辛苦我一个…

RCF的优势--分布式应用

RCF(远程调用框架)是一个可以移植的C进程间通信框架&#xff0c;使用C语言特性&#xff0c;提供了一个简单高效的编写分布式C软件的途径。RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORBA,DCOM,.NETRemoting,WCF,WS-*,等所支持的面向对象方式不一样&#xff0c…

深漂结束

早上起来看了勇士和凯尔特人的比赛&#xff0c;勇士还不能适应凯尔特人的防守&#xff0c;除了防守之外&#xff0c;凯尔特人这场比赛的三分球着实太高了。说到篮球&#xff0c;突然想起一个刚离开深圳去惠州工作的朋友。上周二中午&#xff0c;吃饭的时候我打开手机&#xff0…

RS 学习笔记 3-1

3-1 fence climb onto/jump off salad towel napkin ladder 转载于:https://blog.51cto.com/mingii/776041

JS的八大数据类型

js中的数据类型&#xff0c;包括基本数据类型&#xff08;Number,String,Boolean, Undefined,Null&#xff09;和 复杂&#xff08;引用&#xff09;数据类型&#xff08;Object,Array,Function&#xff09; 基本数据类型 基本数据类型指的是简单的数据段 &#xff08;Number,S…

嵌入式软件是这样debug的

【单步调试】【多线程调试】调试过多线程的都懂的。【断点调试】【递归调试】调试过递归代码的都有这种耳鸣目眩的感觉。【老旧代码调试】对于早期已经缝缝补补的庞大软件代码进行调试&#xff0c;还不如推倒重来。【生产中代码调试】【用户等待调试结果】【掩耳盗铃式调试】【…

可以直接在C++里面写类似RSL的shader了

可以直接在C里面写类似RSL的shader了 今天我搞定了一个新技术 可以直接在C里面写类似RSL的shader了 我简要介绍一下这个新技术&#xff0c;我还在考虑是否要在我们的项目中应用 这个技术的优势是可以借助现有的C编译器&#xff0c;将shader直接编译成机器码执行&#xff0c;这样…

UDT中select异常

转载&#xff1a;http://blog.csdn.net/seebit/article/details/6050428 select, selectEx的参数采用了stl的容器&#xff0c;在DLL方式下&#xff0c;会发生异常。 select传入的容器内的对象在DLL内部发生释放操作时&#xff0c;会抛出异常&#xff0c;因为主程序和DLL申请的内…

iOS中有两种支持机制:Notification和KVO(Key-Value Observing)

KVO是iOS中的一个核心概念&#xff0c;简单理解就是&#xff1a;关注Model某个数据&#xff08;Key&#xff09;的对象可以注册为监听器&#xff0c;一旦Model某个Key的Value发生变化&#xff0c;就会广播给所有的监听器&#xff08;http://blog.chinabyte.com/a/1557371.html&…

Apache与Tomcat有什么关系和区别

常在用apache和tomcat等这些服务器&#xff0c;可是总感觉还是不清楚他们之间有什么关系&#xff0c;在用tomcat的时候总出现apache&#xff0c;总感到迷惑&#xff0c;到底谁是主谁是次&#xff0c;因此特意在网上查询了一些这方面的资料&#xff0c;总结了一下&#xff1a; …

“电脑人才”是怎么炼成的

好长一阵子没有写什么了&#xff0c;其实自己一直想一些电脑方面的书籍&#xff0c;希望给那些想要学习&#xff0c;而没有人指点的朋友们做个参考&#xff0c;或者给那些低学历的朋友做指导&#xff0c;总之希望把不要像我走了那么多弯路。可惜的是要生存&#xff0c;要工作&a…

UDT源代码下载链接

对UDT有兴趣的可以下载UDT对应的源码进行研究&#xff0c;下面给出了一个开源中国的连接&#xff1a; UDT最新源码下载地址&#xff1a;http://sourceforge.net/projects/udt/files/latest/download?sourcedirectory.