当前位置: 首页 > 面试题库 >

通过域套接字传输的单个数据包的大小的实际限制是什么?

施旭东
2023-03-14
问题内容

让我们假设有一个为典型的服务器-客户端程序创建的Unix域套接字。客户端通过套接字发送10GB的缓冲区,同时服务器将其占用。

OS(Linux / BSD)是将10GB缓冲区分成许多数据包并发送/使用它们,还是一次发送?

如果无法一次性发送10GB的域套接字缓冲区,那么单个数据包的实际大小限制是多少?

限制条件:

  • 该程序将在Linux 2.6.32+和FreeBSD 9+上运行
  • 要发送的缓冲区的大小最大为3个字节,最大为10GB。

问题答案:

有许多因素将决定可以在Unix套接字上发送的数据包的最大大小:

  1. wmem_max套接字发送缓冲区的最大尺寸的内核设置,其确定发送的最大大小缓冲器可以使用被设置setsockopt (SO_SNDBUF)。可以读取当前设置/proc/sys/net/core/wmem_max,也可以使用进行设置sysctl net.core.wmem_max=VALUE(添加设置/etc/sysctl.conf以使更改在重新引导后保持不变)。请注意,此设置适用于所有套接字和套接字协议,而不仅适用于Unix套接字。

  2. 如果将多个数据包发送到Unix套接字(使用SOCK_DATAGRAM),则可以无阻塞发送的最大数据量取决于套接字发送缓冲区的大小(请参见上文) Unix上未读数据包的最大数目套接字(内核参数net.unix.max_dgram_qlen)。

  3. 最后,数据包(SOCK_DATAGRAM)需要连续的内存根据[Linux可以发送的AF_UNIX数据报消息的最大大小是多少?)。内核中有多少连续内存取决于许多因素(例如,系统上的I / O负载等)。

因此,为了最大程度地提高应用程序的性能,您需要大的套接字缓冲区大小(以最小化由于套接字写系统调用而导致的用户/内核空间上下文切换)和大的Unix套接字队列(以尽可能地使生产者和使用者分离)
)。但是,套接字发送缓冲区大小和队列长度的乘积不能太大,以免导致内核用尽连续的内存区域(导致写失败)。

实际数字将取决于您的系统配置和使用情况。您将需要通过测试来确定限制…从wmem_max256Kb和max_dgram_qlen32
开始说,然后继续增加一倍,wmem_max直到您注意到事情开始破裂。您将需要进行调整max_dgram_qlen以在一定程度上平衡生产者和消费者的活动(尽管如果生产者比消费者快得多或慢得多,则队列大小不会有太大影响)。

请注意,您的生产者将必须wmem_max通过调用来专门设置套接字发送缓冲区的大小为字节,setsockopt (SO_SNDBUF)并且必须将数据拆分为wmem_max字节块(而使用者将不得不重新组装它们)。

最佳猜测:实际限制将在wmem_max〜8Mb和unix_dgram_qlen〜32附近。



 类似资料:
  • 我有一个NodeJS服务器,它使用socket.io套接字从max/msp(带有Max-api模块)接收数据。消息包括文件目录名(其中包括特定歌曲的条、音符和歌词的图像)、歌曲的节奏(2,4,6或8,在Node client中乘以100,并在setInterval函数中动态添加到tempo变量中,以使幻灯片中的图像动画化),最后是控制浏览器中幻灯片动画的开始和停止消息。 我的问题是,当我试图从屏幕

  • 我正在使用在我的客户端应用程序中执行以及 最大数据包大小限制也存在于中,即?但是我可以使用中的发送大于最大数据包大小的数据块 这是怎么运作的?这是因为是基于流的,负责在较低层创建数据包吗?有什么方法可以增加UDP中的最大数据包大小吗? 当我在客户端读取时,我从服务器端发送的UDP数据包的一些字节是否可能丢失?如果是,那么有没有办法只检测UDP客户端的损失?

  • 问题内容: 我正在将SocketServer模块用于TCP服务器。我在此函数遇到一些问题,因为传入的数据包总是具有不同的大小,所以如果我指定(我尝试使用更大的值,并且更小),则它在2或3个请求后卡住,因为数据包长度会变小(我认为),然后服务器卡住直到超时。 如果客户端通过同一源端口发送多个请求,但服务器卡住,则非常感谢您的帮助,谢谢! 问题答案: 网络 总是 不可预测的。TCP使许多这种随机行为为

  • 问题内容: 当我使用套接字编程传输大文件时,收到的文件不完整,即它是一个mp3文件,当我播放时听起来很奇怪。代码是: 服务器端: 客户端: 在客户端,我只是为了简化而使用(我可以从服务器端发送文件的长度)。 如果客户端和服务器是同一台机器,则此代码可以完美地工作,但是如果它们位于不同的机器上,则文件会失真。 问题答案: 在Java中复制流的规范方法: 适用于大于零的任何缓冲区大小。应避免避免将缓冲

  • 问题内容: 有一种通用的方法,可以使用位掩码将多个值存储在一个变量中。例如,如果用户对某项具有读,写和执行特权,则可以通过说出该特权并将其转换为一个数字,然后将它们加在一起得到7。 我在几种Web应用程序中使用了这种技术,通常将变量存储到一个字段中,并根据不同值的数量为它提供MEDIUMINT或其他类型。 我感兴趣的是,这样存储的值数量是否有实际限制?例如,如果数字超过64,则不能再使用(64位)

  • 问题内容: 我只想限制用户可以上传的文件的大小。 我以为maxlength = 20000 = 20k,但这似乎根本不起作用。 我在Rails上运行,而不是在PHP上运行,但是我认为在HTML / CSS客户端进行此操作要简单得多,或者使用jQuery作为最后的手段。这是如此基本,尽管必须缺少一些我不知道或不知道的HTML标记。 希望支持IE7 +,Chrome,FF3.6 +。我想我可以在需要时