UDP和TCP套接字一般分别用在哪里?

UDP使用范围比较窄,编程难度比TCP大很多:

如果你真的很在意延迟,受不了重传,那就用UDP,比如NTP协议。NTP消息的重传纯粹是混淆视听。

你真的不在乎可靠性,也不需要重传一些包,可以用UDP。我想不出一个例子。有人说音频或者视频流可以用UDP,但是在我看来各大视频网站都是用HTTP协议,HTTP是基于TCP的。

需要NAT穿透,所以要用UDP。

还有一些情况,一旦程序要自己重传,你是在用UDP模拟差的TCP,不如直接用TCP。

简而言之:UDP需要有一个强有力且不容置疑的理由,当有疑问时,使用TCP。

有些协议,由于历史原因和当时技术、网络条件的限制,选择基于UDP实现,其选择的理由现在很可能已经不成立。所以“用UDP做xxx协议”并不是你现在应该用UDP写网络应用的理由,除非你是在实现xxx协议。

另外,那些说TCP比UDP慢效率低的,你可以用UDP写个程序把千兆网络的带宽填满(TCP等价代码只有两行:client while (true) {send(...);} server while (true) {recv(...);}。),且不说你的程序会有多复杂,先看看goodput是不是比TCP大,CPU利用率是不是比TCP低。