此文记录udp、tcp使用的杂乱知识,基本是各处摘录,会随时更新,如有侵权,我会立即删除。
1,
实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致0.5秒以后才到,那么整个音视频就延迟了0.5秒。
考虑一下接收方看视频,如果使用 TCP 导致视频的中间延迟了0.5秒,只要我不按「快进」键,那么后续的视频全都会比发送方延迟0.5秒。这种延迟是累加的,随着持续丢帧,延迟会越来越大,达到数秒,甚至分钟级,这会严重影响实时音视频的用户体验。
因此「实时音视频聊天」功能通常都会使用 UDP 实现。
2,
网络真的非常非常可靠,以至于你完全不需要考虑 UDP 丢包问题的情况。
典型的例子应该是专门为有线局域网设计的协议。
3,
另外一个问题是 TCP 是纯粹的流式数据,所以制定传输协议的时候,接受方需要自行判定一个包的开始和结束,因为你完全可能接受到半个包或者两个包。——如果数据报的起止判定对你具体的程序会成为大问题,也可以考虑 UDP。
曾经读gtalk开源项目libjingle的源码时看到文件传输功能是用的udp协议
你一定会问,什么?文件传输这种可靠性要求如此高的场景怎么可能用udp这么不可靠的协议呢?
这里就用到udp一个得天独厚的优势了,打洞!
gtalk的文件传输会尝试用户p2p直连,这样可以省去服务器开销
但用户都是处于各自内网的情况下无法建立起tcp连接,只能用udp打洞的方式通信
所以libjingle中用udp实现了假冒tcp的可靠协议,有兴趣的同学可以去看下PseudoTcp类的实现
发送文件方用PseudoTcp创建http server,接收方用PseudoTcp封装的http client去下载
你一定会问,什么?文件传输这种可靠性要求如此高的场景怎么可能用udp这么不可靠的协议呢?
这里就用到udp一个得天独厚的优势了,打洞!
gtalk的文件传输会尝试用户p2p直连,这样可以省去服务器开销
但用户都是处于各自内网的情况下无法建立起tcp连接,只能用udp打洞的方式通信
所以libjingle中用udp实现了假冒tcp的可靠协议,有兴趣的同学可以去看下PseudoTcp类的实现
发送文件方用PseudoTcp创建http server,接收方用PseudoTcp封装的http client去下载