确定最大UDP数据报大小的跨平台方法

2024-05-21 23:18:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试改进发送UDP数据报的Python程序的可移植性

在BSD和macOS上,它访问net.inet.udp.maxdgramsysctl以确定在一个数据包中可以传输的最大字节数。(在我的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上做这件事的正确方法是什么


Tags: 数据方法程序net字节solinux选项
1条回答
网友
1楼 · 发布于 2024-05-21 23:18:30

因此,SNDBUF很大,因为udp可以被碎片化

enter image description here

似乎9216是2^13(最后片段偏移量)+1024(安全有效负载大小)

Linux 212992是/proc/sys/net/core/wmem_max,因为您可以在一个套接字上同时向几个或多个目的地发送数据包,但对于SOCK_流,它增加了2^13倍

如果客户端IP堆栈支持ICMP,则使用https://stackoverflow.com/a/26524829/2101808PMTU发现。或者在应用层通过发送带有DF标志的数据包来实现

相关问题 更多 >