【发布时间】:2021-06-01 10:51:24
【问题描述】:
我正在尝试提高发送 UDP 数据报的 Python 程序的可移植性。
在 BSD 和 macOS 上,它访问 net.inet.udp.maxdgram sysctl 以确定它可以在一个数据包中传输的最大字节数。 (在我的 macOS 11.2 系统上,该值返回 9216。)Linux 上不存在此 sysctl。
有一个套接字选项SO_SNDBUF,它表示内核分配的发送缓冲区的大小。我可以通过以下方式检查:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
max_dgram = s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
在 macOS 上,这返回相同的值 9216。但在 Linux 上,它返回 212992,这对于单个 UDP 数据包来说似乎太大了,所以我认为 SO_SNDBUF 不适合查询。
(另外,SO_SNDBUF 的文档说,“这个限制计算为双倍 ... 选项值减去用于开销的 32 个字节。”这意味着实际的最大大小接近半兆字节。)
有没有办法跨平台?或者如果不是,在 Linux 上的正确方法是什么?
【问题讨论】:
-
请注意,某些路由器/交换机也可能有数据包限制。可以在新客户端的连接上进行协商序列。想法是发送越来越大的数据包并查看何时没有收到数据包,你有你的限制(测试必须在两个方向上进行)跨度>
-
IPv4 UDP有效载荷最大为65509字节(=65535-28),但通过路由器的实际限制一般为534字节。你不应该依赖比这个更大的值。