UDP的安全性如何?

4
我正在考虑在我正在处理的一些非常简单的通信中使用TCP还是UDP。以下是基本细节:
- 所有消息都适合于单个1500字节数据包(因此排序无关紧要) - 这些消息的接收方将受到来自许多不同来源的数据包的轰炸。 TCP将处理拥塞,但是如果来自数十个或数百个源的UDP数据包同时到达相同的端口,它们会相互干扰吗? - 丢失/损坏的消息并不是很重要。 只要它们保持为少数派,并且它们被正确地识别为无效,它们就可以被忽略。 - 数据包以波浪形式到达,每秒几个数据包,持续几秒钟,然后在一小部分时间内出现成千上万个数据包。网络应该能够处理这些峰值带宽。
考虑到顺序不重要,丢失/损坏的数据包可以安全地忽略,这些数据包可能同时到达成千上万个,您是否认为使用UDP会有问题?

我不是专家,但听起来你需要使用UDP。UDP的开销较小(意味着包大小较小),非常适合快速传输;虽然可能会出现数据包丢失的情况,但听起来这不会成为问题。 - cholewa1992
2个回答

2
所有消息都适合于单个1500字节的数据包中(因此顺序无关紧要)。
1500是本地网络通常使用的MTU。它在互联网和DNS等协议中可以更低,但即使MTU更低,数据包也仅会被分段并在最后重新组装,因此不会出现半个消息到达应用程序的情况。
但如果同时从数十个或数百个来源接收到UDP数据包,则它们不会相互破坏。
如果数据包到达得太快,您的应用程序无法及时从套接字缓冲区中读取它们以填满套接字缓冲区,则该数据包将被简单地丢失。
错过/损坏的消息并不是大问题。只要它们保持小部分,并且被正确识别为无效,它们就可以被忽略。
UDP有一个可选的校验和,在大多数情况下会被使用。如果校验和不匹配,则数据包会被丢弃,即不会传递到应用程序。校验和可以检测简单的位翻转,但无法检测每个损坏。但这与所有校验和以及TCP相同。
数据包以波浪形式到达,每秒钟几个数据包持续几秒钟,然后在一瞬间出现数万个数据包。网络应该能够处理这些尖峰期的带宽。 如果网络的带宽可以处理这种情况,那么网络就能够处理它。但问题是你的本地计算机和特别是你的应用程序是否能够处理这样的波动,即能够处理如此快速的数据包,以至于网络卡的缓冲区和套接字缓冲区不会溢出。你应该增加接收缓冲区大小来更好地处理这些波动。

1
所有消息都适合于单个1500字节数据包中(因此排序无关紧要)。
不合逻辑。UDP数据报的通常接受负载限制为534字节,而所有消息都适合一个数据报并不意味着顺序无关紧要,除非消息的顺序无关紧要,您没有说明。
同时从数十个或数百个源到达同一端口的UDP数据包会相互损坏吗?
不会。
错过/损坏的消息并不是什么大问题。只要它们保持小部分,并且被正确识别为无效,它们就可以被忽略。
如果您不禁用UDP校验和检查,它们将被丢弃,而不是被忽略。
数据包以波形到达,每秒几个数据包,持续几秒钟,然后在瞬间出现数万个数据包。网络应该能够处理这些高峰期的带宽。
不会。UDP数据包随时可能会被丢弃,特别是在这种情况下。但是由于您已经声明错过的消息不是什么大问题,所以这不是什么大问题。

考虑到无需保证顺序,可安全忽略丢失/损坏的数据包,并且这些数据包可能同时到达数万个,您认为使用UDP是否存在问题?

如果您所述条件正确,那么使用UDP是没有问题的。


消息的顺序无关紧要,任何单个消息都适合于一个1500字节的数据包。UDP接受的有效载荷包括所有可以塞入UDP中的额外头部,其中几乎没有我打算使用的。消息有效载荷的大小为1472字节以下。此外,被丢弃和被忽略之间似乎没有实际区别,除了校验和检查和丢弃可以允许硬件和操作系统进行优化,而将校验和计算和忽略移动到应用程序层将会导致轻微的性能下降。此外,被丢弃的数据包必须是极少数。 - TheEnvironmentalist
头部不是有效载荷的一部分。"极少数"是一个自相矛盾的说法,而"必须"似乎与"不是什么大问题"相矛盾。UDP会在任何它认为足够的原因下丢弃数据包,包括但不限于路由器队列溢出、接收缓冲区溢出等。 - user207421
好的,我的意思是只要80%以上的数据包传输成功且丢包分布相对随机,那么丢包并不成问题。很明显,报头不是有效载荷的一部分,但我的意思是更多的报头意味着可能的有效载荷更小。对于造成的困惑,我表示抱歉。 - TheEnvironmentalist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接