TCP与videostream上的UDP
我刚从networking编程考试中回到家,他们问我们的一个问题是“如果你要stream式传输video,你会使用TCP还是UDP?给存储video和现场videostream解释一下” 。 对于这个问题,他们只是简单地期望对存储的video和UDP的实时video的TCP简短的回答,但我在回家的路上想过这个,是否更好地使用UDPstream媒体直播video? 我的意思是,如果你有足够的带宽,并且说你正在进行足球比赛或演唱会,你真的需要使用UDP吗?
比方说,当你正在播放这个音乐会或者使用TCP的任何东西的时候,你会开始丢失数据包(在你和发送者之间的某个networking中发生了一些不好的事情),并且整整一分钟你都没有收到数据包。 videostream将暂停,并在一分钟之后,数据包开始再次通过(IP为您find一条新的路线)。 接下来会发生的事情就是,TCP会在你丢失的那一刻重新传输,并继续向你发送实时stream。 作为一个假设,带宽高于stream上的比特率,并且ping不是太高,所以在很短的时间内,你丢失的那一分钟将作为你的stream的缓冲区,这样,如果丢包再次发生,你将不会注意到。
现在,我可以想到一些设备,这不是一个好主意,比如video会议,因为在video聊天过程中的延迟是非常可怕的,所以你总是需要在videostream的尽头。在足球比赛或者音乐会期间,如果你是在stream后面的一分钟,那么它有什么关系? 此外,您可以保证获得所有数据,最好保存以备以后查看。
所以这使我想到了我的问题。 有什么缺点,我不知道使用TCP实时stream媒体? 还是应该是真的,如果你有带宽的话,你应该去TCP,因为它对networking(stream量控制)来说是“更好的”?
使用TCP进行实况video的缺点:
- 通常情况下,实时videostream设备的devise不考虑TCPstream媒体。 如果使用TCP,则操作系统必须为每个客户端缓冲未确认的段。 这是不可取的,特别是在现场活动的情况下; 据推测,由于事件的奇特性,您的同时在线客户名单很长。 预先录制的video通常没有太多的问题,因为观众错开了重播活动; 因此TCP更适合于重放video点播。
- IP多播显着降低了大型用户对video带宽的需求; TCP阻止使用IP多播,但UDP非常适合IP多播。
- 实时video通常是从摄像机logging的恒定带宽stream; 预先录制的videostream从磁盘上脱落。 当源数据stream处于一个恒定的带宽时,TCP的丢包回退dynamic性使服务直播video变得困难(就像现场直播一样)。 如果从相机缓冲到磁盘,请确保有足够的缓冲区来处理不可预知的networking事件和可变的TCP发送/退避速率。 请注意,如果TCP失去太多的数据包,连接就会死亡。 因此,UDP给你更多的控制这个应用程序,因为UDP不关心networking传输层丢弃。
仅供参考,请勿在描述networking时使用“软件包”一词。 networking发送“数据包”。
但是在足球比赛或者音乐会期间,如果你是在stream后面的一分钟,那么这又有什么关系呢?
对一些足球迷来说,相当多。 已经有人指出,由于编码(或其他)的原因,在数字videostream中出现几秒钟的延迟会非常烦人,因为在世界杯比赛这样的高调赛事中,你可以听到球员们的欢呼和呻吟隔壁(谁正在看一个未解决的模拟程序),然后才能看到造成他们的游戏移动。
我认为对于那些关心体育运动的人来说(这些人是数字电视付费用户中最大的一群,至less在德国是这样),在现场videostream中落后一分钟是完全不可接受的(就像在他们看来, d切换到你的竞争对手,这不会发生)。
通常一个videostream有一定的容错性。 所以,如果有些软件包丢失(例如,由于某些路由器过载,例如),那么它仍然能够显示内容,但质量下降。
如果您的直播stream正在使用TCP / IP,则在它可以继续处理较新的数据之前,它将被迫等待那些丢弃的包。
这是非常糟糕的:
- 旧的数据被重新传输(这可能是一个已经显示,因此毫无价值的框架) 和
- 新数据无法到达,直到旧数据重新传输
如果您的目标是尽可能显示最新信息(对于实时stream,您通常希望即时更新,即使您的框架看起来更糟糕),那么TCP将会对您不利。
对于logging的stream,情况稍有不同:您可能会缓冲更多(可能是几分钟!),宁愿重新传输数据,而不是由于丢失包而产生一些文物。 在这种情况下,TCP是一个很好的匹配(当然,这仍然可以用UDP来实现,但是TCP没有直播stream的情况那么多)。
有一些适用于UDP传输的用例,以及其他适用于TCP传输的用例。
用例还规定了video的编码设置。 广播足球比赛的重点在于质量,而video会议的焦点在于延迟。
当使用多点传送video给你的客户,然后使用UDP。
组播需求是广播服务器和用户之间昂贵的networking硬件。 在实践中,这意味着如果您的公司拥有networking基础设施,则可以使用UDP和多播进行实况videostream。 即使这样,服务质量也被实现来标记video数据包并对其进行优先级sorting,从而不发生数据包丢失。
多播将简化广播软件,因为networking硬件将处理分发给客户。 客户订阅多播信道,networking将重新configuration将数据包路由到新的用户。 默认情况下,所有客户都可以使用所有渠道,并且可以优化路由。
这个工作stream程使授权过程变得困难重重。 networking硬件不区分订阅用户和其他用户。 授权解决scheme是在encryptionvideo内容并在订阅有效时在播放器软件中启用解密。
单播(TCP)工作stream程允许服务器检查客户端的凭据,只允许有效的订阅。 即使只允许一定数量的同时连接。
多播不是通过互联网启用的。
必须使用通过互联网传送video。 当使用UDP时,开发者最终会重新实现数据包重传,例如。 Bittorrent p2p直播协议。
“如果使用TCP,操作系统必须缓冲每个客户端的未确认段,这是不可取的,特别是在现场事件的情况下”。
这个缓冲区必须以某种forms存在。 播放器侧的抖动缓冲区也是如此。 它被称为“套接字缓冲区”,服务器软件可以知道何时该缓冲区已满并丢弃适合直播stream的video帧。 因为服务器软件可以实现适当的丢帧逻辑,所以最好使用单播/ TCP方法。 在UDP情况下随机丢失的数据包只会造成不好的用户体验。 就像在这个video中一样: http : //tinypic.com/r/2qn89xz/9
“IP多播显着降低了大型用户的video带宽需求”
这对于专用networking来说是真实的,多播不是通过互联网启用的。
“请注意,如果TCP失去了太多的数据包,连接就会消失;因此,由于UDP不关心networking传输层的丢失,所以UDP为这个应用提供了更多的控制。
UDP也不关心丢弃整个帧或帧组,所以它不能对用户体验进行更多的控制。
“通常情况下,videostream有点容错”
编码的video不是容错的。 当通过不可靠的传输传输时,前向纠错被添加到video容器。 很好的例子是在卫星video广播中使用的MPEG-TS容器,其携带若干audio,video,EPG等stream。 这是必要的,因为卫星链路不是双工通信,这意味着接收机不能请求丢失数据包的重传。
当你有双工通信可用时,重传数据总是更好的只有丢包的客户端,然后包括发送到所有客户端的stream中的前向错误纠正的开销。
在任何情况下丢失的数据包是不可接受的。 在带宽受阻的特殊情况下,丢帧可以。
丢失数据包的结果是这样的工件:
一些解码器可能会在关键位置丢失数据包。
这取决于。 你stream媒体的内容有多重要? 如果关键使用TCP。 这可能会导致带宽,video质量(您可能必须使用较低质量来处理延迟)和延迟问题。 但如果你需要保证的内容到达那里,使用它。
否则UDP应该没问题,如果stream是不重要的,将是首选,因为UDP往往有较less的开销。
我build议你看看新的P2P现场协议Bittorent Live 。
至于stream媒体,最好使用UDP,首先是因为它降低了服务器上的负载,但主要是因为你可以使用多播发送数据包,比发送给每个连接的客户端要简单。
在互联网上提供现场活动的最大问题之一是“规模”,而TCP的规模并不好。 例如,当您正在进行一场实况足球比赛时,与观看电影的电影播放相反,观看人数可能会多达1000倍。 在这种情况下,使用TCP是CDN(内容交付networking)的死刑。
TCP不能很好地扩展的原因有两个:
-
TCP的最大折衷之一是发送者和接收者之间可达到的吞吐量的可变性。 当通过互联网stream式传输video时,video数据包必须经过互联网上的多个路由器,每个路由器都连接不同的速度连接。 TCPalgorithm从TCP窗口closures开始,然后增长,直到检测到丢包为止,数据包丢失被认为是拥塞的标志,TCP通过大幅减less窗口大小来响应,从而避免拥塞。 从而立即降低有效吞吐量。 现在设想一个使用6-7路由器跳到客户端的TCP传输的networking(非常正常的情况),如果任何中间路由器丢失了任何分组,则该链路的TCP将降低传输速率。 事实上,路由器之间的stream量遵循一种沙漏形状, 总是在一个中间路由器之间上下通话。 尽力而为的效能通过比尽力而为的UDP低很多。
-
正如你可能已经知道TCP是一个基于确认的协议。 举例来说,一个发件人是50ms(即延时btw两点)。 这意味着将数据包发送到接收器和接收器以发送确认的时间将是100ms; 因此与基于UDP的传输相比,可能的最大吞吐量已经减半。
-
TCP不支持组播或新的组播AMT的标准。 这意味着CDN没有机会通过复制数据包来减lessnetworkingstream量 – 当许多客户端正在观看相同的内容时。 对于CDN(Akamai或Level3)而言,这本身就是一个足够大的原因,不能与TCP一起用于直播stream。
对于videostream传输带宽可能是系统的制约因素。 使用组播可以大大减less上行带宽的使用量。 使用UDP,您可以轻松地将数据包组播到所有连接的terminal。 你也可以使用一个可靠的多播协议,一个叫做语用通用多播(Pragmatic General Multicast,简称PGM),我对它一无所知,我想这个协议在它的使用上并不普遍。
所有'使用UDP'的答案假设一个开放的networking和'尽可能多的东西'的方法。 适合旧式封闭式花园专用audio/videonetworking,这是一种消失的types。
在现实世界中,你的传输将通过防火墙(这将放弃多播,有时udp),networking与其他更重要的($$$)应用程序共享,所以你想惩罚与缩放窗口的滥用者。
除了所有其他的原因,UDP可以使用多播。 支持1000个TCP用户传输相同的数据会浪费带宽。 但是,使用TCP还有另外一个重要的原因。
TCP可以更容易地通过防火墙和NAT。 根据您的NAT和运营商,您可能甚至不能接收UDPstream由于UDP打孔的问题。
在阅读TCP UDP的辩论时,我注意到了一个逻辑上的缺陷。 导致一分钟延迟的TCP数据包丢失被转换成一分钟的缓冲区不能被关联到UDP,而在遇到相同的丢失的同时丢失一整分钟。 比较公平的比较如下。
TCP经历了数据包丢失。 当TCP重新发送数据包时,video停止,试图在math上完美的数据包stream。 video被延迟了一分钟,并在丢失数据包到达目的地后,停止播放。 我们都等待,但我们知道我们不会错过一个像素。
UDP遇到丢包。 在videostream的一秒钟,屏幕的一个angular落变得有点模糊。 没有人注意到,节目继续,没有find丢失的数据包。
任何stream从UDP中获得最多的好处。 造成TCP一分钟延迟的数据包丢失不会导致UDP一分钟延迟。 考虑到大多数系统使用多个分辨率的数据stream,这使得在数据包饿死的时候事情变得很糟糕,使得使用UDP更加合理。
UDPstreamFTW。
如果带宽远高于比特率,我会build议TCP用于单播直播videostream。
情况1:连续的数据包在几秒钟内丢失。 =>无论传输层是什么(TCP或UDP),实时video都将在客户端停止。 networking恢复时: – 如果使用TCP,则客户端video播放器可以select在丢失第一个数据包(时间平移)时重新启动stream,或者丢弃所有延迟数据包,并且在没有时间转换的情况下重新启动videostream。 – 如果使用UDP,客户端没有select,video重新启动没有任何时间转换。 => TCP相等或更好。
情况2:一些数据包是随机的,经常在networking上丢失。 – 如果使用TCP,这些数据包将被立即重新传输,并具有正确的抖动缓冲区,这将不会影响videostream质量/延迟。 – 如果使用UDP,video质量将会很差。 => TCP要好得多
这是事情,这是更多的内容问题,而不是时间问题。 TCP协议要求一个未被传送的数据包必须被检查,validation和重新传送。 UDP不使用这个要求。 所以,如果你发送了一个包含数百万个使用UDP的数据包的文件,就像一个video一样,如果一些数据包在发送时丢失了,他们很可能不会被发送。