QQ 中的 广播与单播
今天简单地学习了一下 广播和多播(组播) 的知识。关于 单播和多播 的概念,可以用 QQ 中的一些例子来解释。
单播,就像 两个人聊QQ 一样,信息的接收和传递只在两个节点之间进行。
多播(组播)。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。
那么在QQ中,可以认为是 在QQ群中发送消息,将消息发送给群组里面所有的成员。而取代了 一个个地 向群组里的每一个成员 发送相同的消息。
QQ 中 TCP 与 UDP 的区别
TCP 和 UDP 简单的区别:
- 1.基于连接与无连接;
- 2.对系统资源的要求(TCP较多,UDP少);
- 3.UDP程序结构较简单;
- 4.流模式与数据报模式 ;
- 5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
- 6.使用 UDP 传送数据 会快于 使用 TCP 传送数据。(UDP 没有三次握手,窗口机制等等TCP具有的机制)
QQ即时视频
QQ视频 是 QQ 开发的一种 即时通讯功能,通过摄像头完成 “面对面” 的交流。
那么,比如有两位:翔翔(是我的朋友) 和 他的女朋友(唉) 正在通过视频秀恩爱。
首先,翔翔 先发送视频请求,在一段时间之后,他的女朋友确认了,于是乎,他们开始了 “面对面的聊天”。
- 这里用到了 TCP 的相关内容:在收发数据前,必须和对方建立可靠的连接。它是 面向连接 的传输层协议。
于是乎,翔翔和他的女朋友愉快的开始了聊天。突然,翔翔发现 突然黑屏了一下。
这里突然黑屏,是 数据报丢失的结果,那么 这个时候 传输层协议 如果使用的是 TCP 或者 UDP,会是怎么样的场景?
使用TCP
翔翔:哎呀,怎么突然黑屏了,这下怎么办呀,我得等好久。
10min 过去了。(有些夸张,真实情况可能就2-3s,但是如果累积起来的话,就会出现很明显的延迟)
翔翔:终于恢复了,诶,老婆,我刚刚这里黑屏了。
然而,翔翔的女朋友好像在自顾自的说话,“喂喂?你在听吗” 之后挂掉了。
这个时候,翔翔收到了来自女朋友的QQ消息:你这么不在乎我,我们分手吧。
翔翔:5555
使用UDP
翔翔:哎呀,怎么突然黑屏了,这下怎么办呀,我得等好久。
然而,过了没多久,通信又恢复了。
翔翔:不好意思呀老婆,不知道为什么我刚刚这边视频卡住了,你能再说一遍吗?
于是,他们继续愉快的秀了下去。
- 读到这里,可以很明显的看到 UDP 和 TCP 的区别了。TCP 对数据的安全性可谓是做到了极致,但这并不是 即时视频所希望看到的:在 黑屏 也就是数据报丢失了之后,TCP 选择了重新发送,但是 当数据报重新到达的时候,造成了延迟。1s 2s 的区别可能不是很大,但是如果是 不断黑屏 慢慢积累起来的话,就会到人难以忍受的地步了。
- 而 UDP 就不是那么在意数据报的安全性了:丢了就丢了呗,我继续发送。这样的话,虽然丢失了一部分的数据,在例子中,翔翔没有听到那个时候女朋友说了什么,但是没有关系,可以继续愉快的聊下去。
- 因此,在即时数据的通信中,TCP数据的可靠性 反而成了缺点,而UDP这种“无赖式”的发送方法(发了就发了,丢了我不管) 深得开发者的喜爱。
QQ 上传文件
好了,翔翔成功的通过了视频聊天,把他的女朋友约了出来,去吃饭看电影,然后去逛街,压马路,去爬山。翔翔留下了 青春中 最美好的回忆,一起留下的,还有那些诉说着他们感情的照片。
但是,非常可惜的是,翔翔的手机 是 苹果6 16G的,拍了这么多张照片,导致内存已满。无奈的他想到了除了换手机之外,更好的方法:上传到空间相册里面去。
那么此时使用 UDP 和 TCP 的情况会是怎么样的呢?
使用 UDP
翔翔:哎呀,挺快的嘛,500+张照片这么快就传完了。让我看看。
翔翔:???怎么少了这么多张ヾ(。`Д´。) 不行,我一张都不能少!重来!
使用 TCP
翔翔:好慢啊···
1h 过去了
翔翔:终于传好了,让我看看。···恩我很满意,都传上来了,看到一张都没有少我很开心,这么长时间的等待是值得的!
- 上传文件,要确保的是,保证数据的完整性。时间 现在 相比较而言 看起来 并不是那么的重要(毕竟这可是翔翔宝贵的回忆啊,不能丢)。好了,现在 TCP 的 reliable 派上用场了,于是开发者此时选择了 TCP 作为传输层的协议,确保翔翔的照片 一张不落的 上传到空间相册中。而 不管数据丢失的 UDP 同学,就被冷落了。
小结
所以,我们能够从上面的 QQ即时视频 和 上传文件 看到 TCP 和 UDP 的区别:TCP 很可靠,它通过三次握手建立联系,在发送数据的时候在发送端复制一份保存,如果出现数据丢失,会进行重传,非常的可靠。但是 也正是因为它 实现可靠性 的机制太多,导致了速度相对 UDP 较慢一点。而 UDP 速度比起 TCP 来说是更快了,但是它只负责传输数据,并不保证数据能够安全无误的到达,丢了也不管。所以,在开发APP的时候,开发者会根据不同的需求(速度快,或者要求重传 等等) 对 UDP 和 TCP 进行选择。
2016/8/6 七夕前夕(唉)