UDP 和 TCP 的 socket 分别一般用在什么地方?

论坛 期权论坛 期权     
匿名用户1024   2022-2-12 18:37   11457   5
分享到 :
0 人收藏

5 个回复

正序浏览
6#
有关回应  16级独孤 | 2022-2-12 18:37:57 发帖IP地址来自
我很多年前刚从学校毕业的时候,和几个人做过一个电子教学系统,是基于UDP的。

我们的系统使用场景是这样,在一个电子教室里(lan, 那时internet还在拨号时代,根本承受不了我们的系统),老师在上课的时候,将自己的桌面实时广播给所有学生,学生好像看视频那样,在自己的电脑上看老师广播的内容。轮到学生做实验的时候,学生的桌面又被广播给老师,老师可以选择查看某个学生的操作。

我们当时选择UDP的原因很简单,老师和学生用的都是普通台式机(奔腾+win98的样子),用tcp的话,老师的机器很可能承受不了四五十个并发连接,而UDP是无连接的。另外,由于是实时广播桌面,偶尔丢一个两个包并不严重,并不需要tcp的可靠性。
5#
有关回应  16级独孤 | 2022-2-12 18:37:56 发帖IP地址来自
最怕就是对端udp重用了一下端口, 造成的串包(对端不想和我通信了,把socket 关了,然后新建了一个socket又把这个端口占了,然后我又还傻呵呵的和这个socket通信,以为还是原来那个兄弟,有时候这种状态要解出费劲死了。。)

其实我认为最关键的就是:


通信其实真的是个有状态的事情。
传输却是个无状态的事情(努力收发吧)。

当使用udp做通信的时候,应用层在做通信,而内核认为自己在做传输。基层的理解小于了上层,上层要费姥姥劲儿才能把这个谬误给纠正过来。

当你理解了上面说的这些的时候,你就可以明白,为什么TCP的关闭是如此的复杂;你每少理解了其中一个要素,几乎都会在udp通信中把亏给吃回来,所以我的建议是:

TCP做通信(尤其是点对点的,双向通信的)
UDP做传输(push 流, 不可靠地push状态更新, push app tips, 订阅/发布者模式...,) 什么是传输?最简单的理解就是单向通信,单向推送,。。。无状态如滔滔大江一去不复返,不用记得某滴水上次流到哪里了,也不用管水最终流向何方(我有进入傻子模式见笑了)。

拿udp上面做tcp通信的时候,或者说你认为你比设计tcp的那些前辈能设计出更符合你业务场景的通信协议时,请先保证:你真正理解了tcp的设计,到底是在为了解决哪一些问题(很抱歉,这个问题的答案,很少有教科书能够逐点并结合用户态编程实际来进行阐述。).
4#
有关回应  16级独孤 | 2022-2-12 18:37:55 发帖IP地址来自
陈硕说的基本是对的,我补充一下他所说的可以用 UDP 的情况。

1,
实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致0.5秒以后才到,那么整个音视频就延迟了0.5秒。

考虑一下接收方看视频,如果使用 TCP 导致视频的中间延迟了0.5秒,只要我不按「快进」键,那么后续的视频全都会比发送方延迟0.5秒。这种延迟是累加的,随着持续丢帧,延迟会越来越大,达到数秒,甚至分钟级,这会严重影响实时音视频的用户体验。

因此「实时音视频聊天」功能通常都会使用 UDP 实现。

2,
网络真的非常非常可靠,以至于你完全不需要考虑 UDP 丢包问题的情况。
典型的例子应该是专门为有线局域网设计的协议。

3,
另外一个问题是 TCP 是纯粹的流式数据,所以制定传输协议的时候,接受方需要自行判定一个包的开始和结束,因为你完全可能接受到半个包或者两个包。——如果数据报的起止判定对你具体的程序会成为大问题,也可以考虑 UDP。


至于其他的情况, “ when in doubt, use tcp ”
3#
有关回应  16级独孤 | 2022-2-12 18:37:54 发帖IP地址来自
有些时候UDP比TCP更有优势。


1,网速的提升给UDP稳定性提供可靠网络保障CDN服务商Akamai(NASDAQ: AKAM)报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。

2,对比测试结果UDP性能优于TCP为了提升浏览速度,Google基于TCP提出了SPDY协议以及HTTP/2。Google在Chrome上实验基于UDP的QUIC协议,传输速率减少到100ms以内。


Google采用QUIC后连接速率能有效提升75%。
Google搜索采用QUIC后页面加载性能提升3%。
YouTube采用QUIC后重新缓冲次数减少了30%。

3, TCP设计过于冗余,速度难以进一步提升TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于TCP内置在系统协议栈中,极难对其进行改进。

4,UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP
4.1 网页浏览使用UDP协议有三个优点 :
  • 能够对握手过程进行精简,减少网络通信往返次数;
  • 能够对TLS加解密过程进行优化;
  • 收发快速,无阻塞。
4.2 流媒体采用TCP,一旦发生丢包,TCP会将后续包缓存起来,等前面的包重传并接收到后再继续发送,延迟会越来越大。基于UDP的协议如WebRTC是极佳的选择。
2010年google 通过收购 Global IP Solutions,获得了WebRTC(网页实时通信,Web Real-Time Communication)技术,用于提升网页视频速率。

4.3 实时游戏对实时要求较为严格的情况下,采用自定义的可靠UDP协议,比如Enet、RakNet(用户有sony online game、minecraft)等,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。
采用UDP的经典游戏如FPS游戏Quake、CS,著名的游戏引擎Unity3D采用的也是RakNet。

4.4 物联网2014年google旗下的Nest建立Thread Group,推出了物联网通信协议Thread,完善物联网通信。

采用UDP有3个关键点:
  • 网络带宽需求较小,而实时性要求高;
  • 大部分应用无需维持连接;
  • 需要低功耗。

全球将近50%的人都在使用互联网,人们不断的追求更快、更好的服务,一切都在变化,在越来越多的领域,UDP会抢占TCP的主导地位。

https://blog.wilddog.com/?p=668
2#
有关回应  16级独孤 | 2022-2-12 18:37:53 发帖IP地址来自
UDP 的使用范围很窄,而且编程比 TCP 难多了:
  • 你真的很在乎延迟,不能忍受重传,那么就用UDP,例如 NTP 协议。重传NTP消息纯属添乱。
  • 你真的不在乎可靠性,丢一些包也不需要重传,那么就可以用 UDP。例子我想不出来。有人说音频或视频流可以用UDP,不过据我看来各大视频网站都用HTTP协议,而HTTP是基于TCP的。
  • 你需要NAT穿透,那么不得不用UDP。
  • 其他情况,一旦程序要自己做重传,你都是在用UDP模拟出蹩脚的TCP,还不如直接用TCP呢。
总之:使用 UDP 需要有强大到不容置疑的理由,when in doubt, use TCP.

一些协议,出于历史原因,受当时技术和网络条件限制,选择了基于UDP实现,其选择的理由现在很可能已经不再成立了。因此“xxx协议用UDP”不是你现在写网络应用程序也该用UDP的理由,除非你本身就是在实现xxx协议。

另外,那些说TCP比UDP慢、效率低的,你拿UDP写个程序,把千兆网带宽打满(TCP等价的代码只有两行:客户端 while (true) { send(...); } 服务端 while (true) { recv(...); }。),且不说你的程序会有多复杂,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:136515
帖子:27303
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP