sockets - UDP有多安全?

标签 sockets networking tcp udp

我正在考虑是使用 TCP 还是 UDP 来进行我正在处理的一些非常简单的通信。以下是基本细节:

  • 所有消息都放在一个 1500 字节的数据包中(因此顺序无关紧要)
  • 这些消息的收件人将受到来自许多不同来源的数据包的轰炸。 TCP 可以处理拥塞,但是从数十个或数百个源同时到达同一端口的 UDP 数据包是否会相互破坏?
  • 丢失/损坏的消息不是什么大问题。只要他们仍然是少数,并且他们被正确识别为无效,他们就可以被忽略
  • 数据包以波浪的形式到达,几秒钟内每秒几个,然后几分之一秒内到达数万个。网络应该能够处理这些峰值中的带宽

您是否发现为此使用 UDP 有任何问题,请记住顺序无关紧要,可以安全地忽略丢失/损坏的数据包,并且这些数据包峰值可能会同时到达数以万计的数据包?

最佳答案

All messages fit in a single 1500-byte packet (so ordering is irrelevant)

1500 是本地网络中通常使用的 MTU。它在 Internet 上可能更低,DNS 等协议(protocol)假设至少 512 字节可以工作。但是,即使 MTU 较低,数据包也只会被分段并在最后重新组装,因此没有一半的消息到达应用程序。

.. but would UDP packets arriving at the same port simultaneously from tens or hundreds of sources corrupt each other?

他们不会互相腐 eclipse 。如果它们到达得太快并且您的应用程序无法及时从套接字缓冲区中读取它们以致于套接字缓冲区已满,那么数据包就会丢失。

Missed/corrupted messages are not a big deal. So long as they remain a small minority, and they are correctly identified as invalid, they can just be ignored

在大多数情况下,UDP 有一个可选的校验和。如果校验和不适合,数据包将被丢弃,即不交付给应用程序。校验和确实考虑了简单的位翻转,但无法检测到每个损坏。但这对于所有校验和以及 TCP 都是一样的。

Packets arrive in waves, a few per second for a few seconds and then tens of thousands in a fraction of a second. The network should be able to handle the bandwidth in these spikes

如果网络中的带宽可以处理它,那么网络就可以处理它。但问题是您的本地机器,尤其是您的应用程序是否能够应对这种波动,即处理数据包的速度要快到网卡缓冲区和套接字缓冲区不会溢出。您可能应该增加接收缓冲区大小以更好地处理此类波。

关于sockets - UDP有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32221657/

相关文章:

python - Python-[Errno 10054]现有连接被远程主机强行关闭-发送腌制数据问题

c# - WSAECONNRESET 异常和 Socket.Receive 返回 0 的情况有什么区别?

c++ - 当没有数据可读时,读取套接字会给出 errno EAGAIN,而且如果我断开网络连接

java - 如何在 Kryonet 中注册 Enum 类?

windows - 为特定组创建组策略

tcp - 如何查看 Apache Kafka 生成的完整 TCP 数据包?

linux - 在中间节点重新组装 IP

c - 套接字发送和接收缓冲区

java - 在 Windows 中通过命令行连接到套接字并发送数据

http - 在 TCP 负载之间分割 CRLF