20-TCP vs.UDP
61.12 TCP vs.UDP
鉴于TCP可提供可靠的数据传输而UDP无法保证这一点,一个明显的问题出现了:“那为何还要用UDP呢?”这个问题的答案在[Stevens et al., 2004]的第22章中已经有所涉及。这里,我们总结了一些引导我们选择UDP而不是TCP的原因。
- UDP服务器能从多个客户端接收数据报(并可以向它们发送回复),而不必为每个客户端创建和终止连接(即,使用 UDP 传送单条消息的开销比使用TCP要小)。
- 对于简单的请求——响应式通信,UDP 的速度比 TCP 要快。因为 UDP 不需要建立和终止连接。[Stevens, 1996]附录A中记录了在最好的情况下使用TCP需要的时间是:
-
在这个公式中,RTT 表示往返时间(发送一个请求并接收响应所需要的时间),而 SPT表示服务器端处理请求所用的时间。(在广域网中,SPT 的值可能会比 RTT 小。)对于 UDP来说,最好情况下单个请求响应通信所用的时间为:
同TCP相比少了一个RTT时间。由于主机之间的RTT时间受长距离(比如跨洲际)或许多中间路由器的影响,这个数值一般可达到数个十分之一秒。这个时间上的差距使得UDP成为某些请求——响应式通信中更有吸引力的方案。DNS就是一个应用UDP的绝好例子——采用UDP使得域名查找操作只需要在服务器间双向各发送一个数据报就可以了。
- UDP套接字上可以进行广播和组播处理。广播允许发送端发送的数据报能在接入到该网络中的所有主机的相同端口上接收到。组播也类似,只是组播只允许数据报发送到指定的一组主机上。更多细节请参阅[Stevens et al., 2004]中的第21章和第22章。
- 某些特定类型的应用(例如,视频流和音频流)不需要 TCP 提供的可靠性也能工作在可接受的程度内。换句话说,当报文在传输过程中丢弃,TCP 尝试重传所造成的延时可能是无法接受的。(在视频流中出现延时可能比简单的丢包更严重。)因而,这样的应用更倾向于使用 UDP,并在应用程序中采用特定的恢复策略来应对偶尔会出现的丢包现象。
使用 UDP 但又需要可靠性保证的应用程序必须自行实现可靠性保障功能。通常,这至少需要序列号、确认机制、丢包重传以及重复报文检测。[Stevens et al., 2004]中给出了一个实现好的例子。但是,如果还需要更高级的功能如流量控制和拥塞控制的话,那么最好还是直接使用 TCP。在 UDP 之上实现所有这些功能是非常复杂的,就算真的实现得很好,结果也很可能达不到TCP的性能。