Python:如何处理大于最大 UDP 安全数据包大小的 UDP 数据包?

Posted

技术标签:

【中文标题】Python:如何处理大于最大 UDP 安全数据包大小的 UDP 数据包?【英文标题】:Python: How to handle UDP packets larger than the max UDP safe packet size? 【发布时间】:2020-06-23 05:46:48 【问题描述】:

我在接收大于最大安全 UDP 大小的 UDP 数据包时遇到问题。我将 python 与 asyncio 一起使用,我在其中创建了一个 UdpReceiver 类,该类实现了用于实现数据报 (UDP) 协议 (asyncio.DatagramProtocol) 的基类。数据通过以下方式接收:

def datagram_received(self, raw_data: bytes, addr: Tuple[str, int]) -> None

但是,如果发送的数据超过最大安全 UDP 有效负载,它会被分成不同的包。有谁知道是否有可能克服网络上的最大安全 UDP 有效负载?我不需要收到每条消息,所以我不需要接收所有正在发送的包裹。如果没有,如何缓冲数据以组合单个消息中的所有片段?

最大有效负载大小:最大安全 UDP 有效负载为 508 字节,而数据包大小为 576,IP 标头最大为 60 字节,UDP 标头最大为 8 字节。

异步:https://docs.python.org/3/library/asyncio-protocol.html

【问题讨论】:

您不必重新组装碎片。如果所有片段都到达,IP 层就会这样做。但是限制就是限制。不清楚你在问什么。 @user207421 仅在书籍中) @eri 仅在书籍、RFC 和 Internet 主机中。你的观点? 您是否有主机托管或其他提供商?试试你自己。分段 udp 在本地网络中有效,但在 Internet 中无效。 这与我写的到底有什么不一致? 【参考方案1】:

路由器通常会削减或丢弃大于 MTU 的 UDP 片段。

发送具有最大大小和dont fragment 标志的数据包。在服务器上,您收到了已切割的片段。将收到的大小发送给客户端并将其用作最大负载。

使用 UDP 的安全方法是在其上创建协议。添加带有大小、序列号的标头...阅读 RTP (rfc3550)

我尝试发送 1500 个字节。在本地网络 UDP 重新组装。在 Internet 上,所有片段都不会在另一端收到。

【讨论】:

路由器会fragment UDP datagrams大于MTU,而分片的重点是让片段更小 比 MTU。 不是全部,也许你相信碎片化,但现实并不是那么好 我不明白你的评论。不都是什么?我不应该相信什么?什么现实?请说清楚。并请证明您对路由器切割数据报的非凡主张是正确的。他们没有。他们不能。他们将它们碎片化。 华夫饼就够了。请提供明显违反 UDP RFC 的不进行分段的路由器和切割数据报的路由器的品牌和型号。

以上是关于Python:如何处理大于最大 UDP 安全数据包大小的 UDP 数据包?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 如何处理上游响应的数据

dask 如何处理大于内存的数据集

如何处理python爬虫ip被封

处理包/模块中的错误时如何处理Python异常

Windows 如何处理无符号 64 位整数?

python如何处理具有相同名称的模块和包?