为什么有了可靠地TCP还需要不可靠的UDP

近来有些面试中被问到了这个问题,那么就在此总结一下吧,希望对大家有用。


首先,先说一下TCP和UDP的区别。

1.TCP是面向连接的协议,有确认重传机制,流量控制机制等;而UDP是非面向连接的协议,尽力而为的传送数据,重传由上层协议来控制,也可以使用connect()来控制。

2.从头部结构来说,TCP因为有选项部分,所以有首部长度字段;而UDP没有选项部分,所以不需要首部长度字段。

3.TCP的checksum部分是必需的;UDP的选项部分是可选的,不填充的话默认为全零。

4.TCP避免分段,因为有重传机制本来就浪费了一些带宽,一旦出现分段,那么重传会大量增加,将会浪费大量带宽并且会严重降低传输效率;而UDP则不关心分不分段,且因为UDP的头部小(只有8字节,而TCP头部最小也得20字节),故可以携带更多的数据。

5.TCP是基于数据流传输的,所以应用程序产生的全体数据与真正发送的单个IP数据报没有什么联系;而UDP是面向数据报的传输层协议,进程的每个操作产生都正好产生一个UDP数据报,并组装成一个IP数据报发送。

以上就大概是TCP和UDP在协议层面的区别了。

接下来,再从应用程序的层次说一下TCP和UDP。

1.先说一下TCP的优缺点吧。优点呢,TCP是可靠的连接,由于有基本的重传确认机制,可以保证把一个数据块完完整整的从A传到B;缺点也是因优点而生,因为有三次握手,所以会传输更多的包,浪费一些带宽;因为需要可靠地连接进行通信,则需要双方都必须持续在线,所以在通信过程中server需要维持非常大的并发连接,浪费了系统资源,甚至会出现宕机;再者就是因为有重传确认,则会浪费一部分的带宽,且在不好的网络中,会因为不断地连接断开连接,严重降低了传输效率。

2.相对于TCP来说,UDP是非面向连接的不可靠的协议,其优点也因为缺点而生。首先,因为没有三次握手,所以会起步比较快,延时小;另外,由于不需要双方持续在线,所以server不用维护巨量的并发连接,节省了系统资源;三,因为没有重传确认,虽然到达的数据可能会有所缺失,但在不影响使用的情况下,能更高效的利用网络带宽。


基于前面的说法,总结一下本文的问题答案。TCP适合实时性要求不高,但要求内容要完整传输的应用。相比而言,UDP由于无连接、无重传确认,所以传输效率高、延时小,适合实时性要求高的应用,如游戏服务器,音频,视频等;另外,由于不用维持大的并发量,所以适合巨量服务的server,加上合适的时间控制,可以用来设计更大的并发服务器;再者就是,UDP可以更高效的利用网络带宽。

说了这么多,举个现实的例子吧。国人几乎都是用的QQ,在建立连接阶段,使用的是面向连接的TCP协议,通过三次握手来完成;然后,在文字数据传输阶段,使用的是UDP协议,但需要中间服务器转发(估计是使用了connect()的UDP,QQ离线发送/接收数据的基础);然后,音视频数据的发送一定是使用的UDP,因为一般的客户可以容忍稍微模糊(略有缺失的数据块)的声音或视频,但估计不会接受一会断开一会连接(因为TCP容易断线)的音视频;而文件传输则使用了P2P的协议,当前大多P2P使用的UTP协议也是基于UDP的,因为使用TCP的话会浪费大量的带宽。


以上为鄙人愚见,希望对大家有用。有不足的地方,还望提出来,大家商讨补充。

你可能感兴趣的:(TCP/IP)