1,
实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致0.5秒以后才到,那么整个音视频就延迟了0.5秒。
考虑一下接收方看视频,如果使用 TCP 导致视频的中间延迟了0.5秒,只要我不按「快进」键,那么后续的视频全都会比发送方延迟0.5秒。这种延迟是累加的,随着持续丢帧,延迟会越来越大,达到数秒,甚至分钟级,这会严重影响实时音视频的用户体验。
因此「实时音视频聊天」功能通常都会使用 UDP 实现。
2,
网络真的非常非常可靠,以至于你完全不需要考虑 UDP 丢包问题的情况。
典型的例子应该是专门为有线局域网设计的协议。
3,
另外一个问题是 TCP 是纯粹的流式数据,所以制定传输协议的时候,接受方需要自行判定一个包的开始和结束,因为你完全可能接受到半个包或者两个包。——如果数据报的起止判定对你具体的程序会成为大问题,也可以考虑 UDP。
注:在互联网技术中,UDP常用在缓存读取,保存;用在监控或终端上报。
注:在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
注:
至于其他的情况, “ when in doubt, use tcp ”