就标准协议而言,TCP、UDP、SCTP协议的应用场合如下:
很难给出一个明确的界限,区分出两者的使用场景,上图中有不少协议,同时使用TCP和UDP。
基本上,需要可靠性但自己又不想维护可靠性时,用TCP。
很简单的应用、隧道技术、对时延和抖动敏感的应用,可以使用UDP。
如同前面说的,不确定的时候,用TCP。
再补充一些我知道的信息:
1. 移动网的核心网部分(如Gn、Gb、Iu、A10/A11、WAP),大都采用了隧道技术,外层都是UDP。
2. 早期的p2p、视频程序,用UDP的比较多。现在多是TCP了,直接使用HTTP协议,被限制或封堵的概率很小:)
3. 游戏类程序,使用UDP的仍然较多。
陈硕和pansz说的都差不多了哈。我再补充点。
1. TCP是流式协议,即数据包是没有边界的,需要自己识别(这个pansz已经提到)。可以把发TCP数据包的动作理解成往对端用管子灌水。水就是数据包,它们之间没有边界;UDP是面向消息的,每个包是有边界的。可以把发UDP数据包的动作理解成往对端滚玻璃球。每个玻璃球是一个数据包,它们之间有明显的边界。而且由于每个玻璃球的速度可能不一样,先滚的不一定先到,所以需要自己处理乱序。
2. UDP比TCP效率高些。道理很简单啊,TCP要检查丢没丢包等额外的工作。
3. TCP也是可以做NAT穿透的哈(俗称打洞)。
关于TCP和UDP的区别和概念上面都有人写过了。我这里写一个UDP的应用。
在多人网络游戏中,人物的移动可以用UDP来发。因为人物一直处于移动当中,会频繁发出位置信息的包。由于发的比较频繁,而且后面的位置信息会覆盖掉前面的位置信息,所以丢不丢包不重要。就可以用UDP来发。每个UDP包的数据里面加个时间戳,那么进来的包你判断下时间,如果是已经过期的包,就可以直接丢掉。这样,即使udp包过来的顺序不一样都无所谓了。
UDP和TCP的适用范围是由它们各自的特性决定的。
UDP的特性是:数据报,无连接,简单,不可靠,会丢包,会乱序(实际中遇到的主要是丢包)
TCP的特性是:流式,有连接,复杂,可靠,延迟较大、带宽占用较大(均是相对于UDP来说)
不同的应用场合会选择不同的协议。以流媒体为例,一类是对实时性要求不高的音视频点播应用(比如各大视频网站),这类应用就多用TCP/HTTP,因为用户可以忍受延时,可以进行缓冲,但不能忍受丢包导致的马赛克。
另一类是对实时性要求很高的音视频通信应用,比如视频会议、视频监控,这类应用用户是无法忍受过高的延时的,相反,偶尔丢一下包却无关大碍。而且,在这类应用中,基于UDP的组播技术也是经常用到的,因为它可以大大减轻服务器和交换机的压力。
不太同意陈硕的第一句话,在编程上,UDP比TCP简单得多,因为它没有建立连接的过程,而且是数据报方式,接收端不用像TCP那样需要自己重组应用层的协议包。陈硕说UDP比TCP复杂,估计还是考虑到用UDP来实现可靠传输,如果是这样,那就应该使用TCP。如果对可靠性要求不是那么高,给UDP加上确认重传也是比较简单的事情(乱序问题我在实际中还未遇到过,也许是出现了未被观察到)。
另外,SCTP是一个兼顾了UDP和TCP优点的协议,看它的特性是很吸引人的,不过我还没在实际中还没接触过。