第二,不需要建立连接,一对一沟通,而且需要广播的应用。 UDP 的不面向连接的功能,可以承载广播或多播的协议。DHCP 就是一种广播的形式。
对于多播,我们之前提到的 IP 地址中的 D 类地址,也就是组播地址。使用这个地址,可以将包组播给一批机器。当一台机器上的某个进程想监听某个组播地址时,需要发送 IGMP 包,所在网络的路由器收到这个包,知道有个机器有个进程在监听这个组播地址。当路由器收到这个组播地址的数据包时,就会将包转发给这台机器,这样就实现了跨路由器的组播。
第三,需要处理速度快、延时低、可以容忍少数丢包,但是要求即便网络阻塞,也毫不退缩,一往无前的时候。
UDP 简单、处理速度快,不像 TCP 那样操那么多的心。并且,TCP 在网络不好出现丢包的时候,它的拥塞策略会主动的降低发送速度,这就相当于本来环境就差,还自断臂膀,用户本来就卡,这下更卡了。
当前很多应用都是要求低时延的,他们可不想用 TCP 如此复杂的机制,而是想根据自己的场景,实现自己的可靠和连接保证。例如,如果应用觉得,有的包丢了就丢了,没必要重传了,而有的比较重要的包丢了,则应用自己重传,不依赖 TCP。
由于 UDP 十分简单,基本啥都没做,也就给了应用“城会玩”的机会。就像在和平年代,每个人应该有独立的思考和行为,应该可靠且礼让。但是如果在战争年代,往往不太需要过于独立的思考,而需要士兵简单服从命令即可。
基于 UDP 的“城会玩”的五个例子 城会玩 一:网页或 APP 的访问网页和手机 APP 都是基于 HTTP 协议的,而HTTP 协议是基于 TCP 的,建立连接都需要多次交互,对于时延比较大的移动互联网来讲,建立一次连接需要的时间会比较长,而且移动互联网还是在移动中,TCP 可能还会断了重连,这也是很耗时的。
除此之外,目前的 HTTP 协议,往往采取多个数据通道共享一个连接的情况这样本来为了加快传输速度,但是 TCP 的严格顺序策略使得哪怕共享通道,前一个不来,后一个和前一个即便没关系,也要等着,时延也会加大。
而 QUIC(Quik UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。
QUIC 在应用层会自己实现快速连接建立、减少重传时延,自适应拥塞控制,是应用层“城会玩”的代表。
“城会玩” 二:流媒体的协议直播协议多使用 RTMP,这个协议就是基于 UDP 的。TCP 的严格顺序传输要保证前一个收到了,下一个才能确认。对于直播来讲,这显然是不合适的,因为老的视频帧丢了就丢了,就算再传过来用户也不在意,他们要看新的了,如果一直没来,用户就会一直显示卡顿,新的也看不了。所以,对于直播,实时性比较重要,宁可丢包,也不要卡顿的。
另外,对于丢包,其实对于食品播放来讲,有的包可以丢,有的包不能丢,因为视频的连续帧里面,有的包重要,有的包不重要,如果必须要丢包,隔几个帧丢一个,其实看视频的人不会感知,但是如果连续丢帧,用户就会有感知了。因此,在网络不好的情况下,应用希望选择性的丢帧。
还有就是,当网络不好的时候,TCP 会主动降低发送速度。这对本来就卡的看视频来讲是要命的,本来应该马上重传,而不是主动让步。因此,很多直播应用,都基于 UDP 实现了自己的视频传输协议。
“城会玩” 三:实时游戏游戏有一个特点,就是实时性比较高。快一秒你干掉别人,慢一秒就被别人爆头,所以很多职业玩家会买非常专业的鼠标和键盘,争分夺秒。
因而,实时游戏中客户端和服务端要建立长连接,来保证实时传输,但是游戏玩家很多,服务器却不多,由于维护 TCP 连接需要在内核维护一些数据结构,因而一台机器能够支撑的 TCP 连接数量是有限的。而 UDP 由于是没有连接的,在异步 IO 机制引入之前,常常是应对海量客户端连接的策略。
另外还是 TCP 的强顺序问题,对战的游戏,对网络的要求很简单,玩家通过客户端发送给服务器鼠标和键盘行走的位置,服务器会处理每个用户发送过来的所有厂家,处理完再返回给客户端,客户端解析响应,渲染最新的场景展示给玩家。