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 数据包?的主要内容,如果未能解决你的问题,请参考以下文章