gpt4 book ai didi

Python:通过 UDP 发送大对象

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:22 24 4
gpt4 key购买 nike

我是套接字编程的新手,最近选择了 Python。我有几个问题似乎无法找到明确的答案。

我正在研究通过 UDP 发送数据,并编写了一个简单的 python 脚本来实现这一点。可以很好地发送小对象(准确地说是小的腌制对象),但是我应该如何处理太大而无法放入一个 UDP 数据包中的对象?

我想到了首先以字节为单位确定对象的大小。如果对象小到足以放入 UDP 数据包,则什么都不做,但如果对象太大,则对象将被均匀地(如果可能)分割成许多较小的 block ,以便它可以放入多个UDP 数据包并发送到客户端。一旦客户端接收到数据 block ,客户端会将多个UDP数据包重新组装成原始状态。

在尝试实现上述内容时,我立即碰壁了。

根据我所做的研究,似乎没有任何“有效”的方法来获取对象的字节大小。这意味着我无法确定对象是否太大而无法放入 UDP 数据包。

如果我坚持向客户端发送一个大对象会怎样?它会自动分片并在客户端重新组装还是会被客户端丢弃?

通过 UDP 处理大对象的正确方法是什么?请记住,大对象可以是大小为 1GB 的文件或大小为 25MB 的字节对象。

提前致谢。

旁注:

  • 我明白 UDP 数据包可能并不总是按顺序到达,并且因此我已经为它实现了对策为发送到客户端的 UDP 数据包标记序列号。

  • 我明白不能保证客户端会收到所有 UDP 数据包。我暂时不担心丢包。

  • 我确实知道 TCP 是我正在尝试做的事情的合适人选,但我的重点是了解 UDP 以及如何处理目前无法确认来自客户端的数据包的情况。

  • 我知道 pickle 的使用是不安全的。稍后会研究它。

最佳答案

UDP 数据包可以大到大约 64k。所以如果你想发送一个比这个大的文件,你可以将自己分成 64k 的数据包。那是理论上的最大值。我的建议是使用 500 字节的较小块的片段。

如果您使用 64k 数据包,IP 负责数据包的分段和重组。 500 字节的较小数据包不太可能被分段,因为 mtu 通常约为 1500 字节。如果您使用较大的分段数据包,如果其中一个分段丢失,IP 将丢弃它们。

你是对的,使用 TCP 可能更适合用于类似这样的事情,甚至是像 TFTP 这样的现有协议(protocol)。它像您一样实现了每个数据包的确认机制和序列号。

关于Python:通过 UDP 发送大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com