【问题标题】:Buffer size for reading UDP packets in Python在 Python 中读取 UDP 数据包的缓冲区大小
【发布时间】:2015-02-17 14:20:19
【问题描述】:

我正在尝试找出/调整网络缓冲区的大小:

import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
212992

这到底是什么? ~ 0.2 MB ..!?

但是,如果我在其他地方寻找缓冲区大小,即在命令行上:

sampsa@sampsa-xps13:~/python/sockets$ cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304

.. 我得到 4096 个字节。

让我们尝试设置缓冲区大小,然后检查它的值:

sock.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,1024)

sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)     
2304

发生了什么事?

将 SOL_SOCKET 替换为 SOL_UDP 会给出“协议不可用”

如何调整最大值。 UDP数据包的大小..甚至找出来?

【问题讨论】:

  • RCVBUF 与 UDP 数据包的最大大小没有太大关系,但主要是在应用程序读取速度不够快时,在丢弃之前缓冲了多少数据。因此它是一个套接字属性,与 UDP 无关。 UDP 数据包的最大大小为 64k。
  • 谢谢..嗯,嗯..这正是我想要说明的。我想说,如何找出/调整缓冲区的大小
  • 而且,顺便说一句,网络套接字是 FIFO 吗? first in - 当缓冲区饱和时首先丢弃?

标签: python sockets udp


【解决方案1】:

我想说,如何找出/调整缓冲区的大小

您对SO_RCVBUF 的处理方式是正确的。但请注意,根据您的设置和操作系统,您使用getsockopt 返回的值可能与使用setsockopt 设置的值不同。在 Linux socket(7) 状态下:

SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes.  The kernel doubles
this value (to allow space for bookkeeping overhead) when it is set using 
setsockopt(2), and this doubled  value  is  returned  by  getsockopt(2). 
The default value is set by the /proc/sys/net/core/rmem_default file, and
the maximum allowed value is set by the /proc/sys/net/core/rmem_max file.  
The minimum (doubled) value for this option is 256.

顺便说一句,网络套接字是 FIFO 吗? first in - 当缓冲区饱和时首先丢弃?

据我所知,如果缓冲区已满,接收将失败。它不会丢弃已接收但未处理的数据以为新数据腾出空间。

【讨论】:

  • 1024 翻倍不是 2304
  • 就像我说的,它不需要准确反映您的设置。也许它会将自己设置为某个内核特定大小的倍数。
  • @SteffenUllrich “但请注意,根据您的设置和操作系统,您使用getsockopt 返回的值可能与使用setsockopt 设置的值不同”——这种效果的文档在哪里?因为 socket(7) 的手册页具有误导性——它没有说明值“2304”。我在 Linux 3.16.0-30(64 位)上遇到了相同的行为——发现无法将缓冲区大小设置为记录的最小值 256。2304 是我使用getsockopt 获得的最低值。
  • 我不知道任何具体的文档。它可能会因操作系统而异,也可能因操作系统版本、内核参数等而异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多