我正在尝试改进发送UDP数据报的Python程序的可移植性
在BSD和macOS上,它访问net.inet.udp.maxdgram
sysctl以确定在一个数据包中可以传输的最大字节数。(在我的macOS 11.2系统上,该值返回9216。)此sysctl在Linux上不存在
有一个套接字选项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上做这件事的正确方法是什么
因此,SNDBUF很大,因为udp可以被碎片化
似乎9216是2^13(最后片段偏移量)+1024(安全有效负载大小)
Linux 212992是/proc/sys/net/core/wmem_max,因为您可以在一个套接字上同时向几个或多个目的地发送数据包,但对于SOCK_流,它增加了2^13倍
如果客户端IP堆栈支持ICMP,则使用https://stackoverflow.com/a/26524829/2101808PMTU发现。或者在应用层通过发送带有DF标志的数据包来实现
相关问题 更多 >
编程相关推荐