让我们假设有一个为典型的服务器-客户端程序创建的Unix域套接字。客户端通过套接字发送10GB的缓冲区,同时服务器将其占用。
OS(Linux / BSD)是将10GB缓冲区分成许多数据包并发送/使用它们,还是一次发送?
如果无法一次性发送10GB的域套接字缓冲区,那么单个数据包的实际大小限制是多少?
限制条件:
有许多因素将决定可以在Unix套接字上发送的数据包的最大大小:
该wmem_max
套接字发送缓冲区的最大尺寸的内核设置,其确定发送的最大大小缓冲器可以使用被设置setsockopt (SO_SNDBUF)
。可以读取当前设置/proc/sys/net/core/wmem_max
,也可以使用进行设置sysctl net.core.wmem_max=VALUE
(添加设置/etc/sysctl.conf
以使更改在重新引导后保持不变)。请注意,此设置适用于所有套接字和套接字协议,而不仅适用于Unix套接字。
如果将多个数据包发送到Unix套接字(使用SOCK_DATAGRAM),则可以无阻塞发送的最大数据量取决于套接字发送缓冲区的大小(请参见上文) 和 Unix上未读数据包的最大数目套接字(内核参数net.unix.max_dgram_qlen
)。
最后,数据包(SOCK_DATAGRAM)需要连续的内存根据[Linux可以发送的AF_UNIX数据报消息的最大大小是多少?)。内核中有多少连续内存取决于许多因素(例如,系统上的I / O负载等)。
因此,为了最大程度地提高应用程序的性能,您需要大的套接字缓冲区大小(以最小化由于套接字写系统调用而导致的用户/内核空间上下文切换)和大的Unix套接字队列(以尽可能地使生产者和使用者分离)
)。但是,套接字发送缓冲区大小和队列长度的乘积不能太大,以免导致内核用尽连续的内存区域(导致写失败)。
实际数字将取决于您的系统配置和使用情况。您将需要通过测试来确定限制…从wmem_max
256Kb和max_dgram_qlen
32
开始说,然后继续增加一倍,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 +。我想我可以在需要时