- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当使用 WinSock 或 POSIX TCP 套接字(在 C/C++ 中,因此没有额外的 Java/Python/等包装)时,在用户中建立更大的缓冲区(例如最多 4KB)是否有任何效率优势/劣势space 然后尽可能少地调用发送以发送该缓冲区 vs 直接使用数据位(比如 1-1000 字节)进行多个较小的调用,其他事实是对于非阻塞/异步套接字,单个缓冲区可能是对我来说更容易管理。
我知道不建议使用 recv 小缓冲区,但我找不到要发送的内容。
例如公共(public)平台上的每个发送调用都会进入内核模式吗?在正常情况下,1 字节的发送实际上会导致 1 字节的数据包被传输吗?
最佳答案
正如 Richard Stevens 在 TCP Illustrated Vol I 中所解释的那样,TCP 将发送缓冲区划分为接近最佳的段,以适应到其他 TCP 对等方路径上的最大数据包大小。这意味着它永远不会尝试发送将被 ip 沿路由分段到目的地的段(当数据包在某个 ip 路由器上分段时,它会发回一个 IP 分段 ICMP 数据包,TCP 将考虑它以减少此连接的 MSS)。也就是说,不需要比沿路径的链路级接口(interface)的最大数据包大小更大的缓冲区。有一个,比方说,两倍或三倍的时间,可以确保 TCP 在收到远程对等点的确认后不会立即停止发送,因为它的缓冲区没有填充数据。
认为正常的接口(interface)类型是以太网,它的最大数据包大小为 1500 字节,所以通常 TCP 不会发送大于此大小的数据段。而且它通常每个连接都有一个 8Kb 的内部缓冲区,因此在内核空间添加缓冲区大小没有什么意义(如果这是在内核空间有一个缓冲区的唯一原因).
当然,还有其他因素迫使您在用户空间中使用缓冲区(例如,您想要存储数据以发送到某处的对等进程,因为只有 8Kb 数据在内核空间中进行缓冲,并且您将需要更多空间才能执行其他一些进程)例如:ircd(Internet 中继聊天守护程序)在断开连接之前使用高达 100Kb 的写入缓冲区,因为另一方没有接收到/确认该数据。如果您只对连接写入(2),一旦内核缓冲区已满,您将被置于等待状态,也许这不是您想要的。
在用户空间有缓冲区的原因是因为 TCP 也进行流量控制,所以当它不能发送数据时,它必须放在某个地方来应对。您必须决定是否需要您的进程将数据保存到一个限制,或者您可以阻止发送数据,直到接收方能够再次接收。内核空间中的缓冲区大小是有限的,通常是用户/开发人员无法控制的。用户空间中的缓冲区大小仅受允许的资源限制。
在 TCP 连接中接收/发送小块数据是不推荐的,因为 TCP 握手和 header 强加的开销增加了。假设一个 telnet 连接,其中对于发送的每个字符,添加一个 TCP header 和其他 IP header (TCP 最少 20 字节,IP 最少 20 字节,以太网帧 14 字节和 4 字节以太网 CRC) 最多 60 个字节 + 仅传输一个字符。通常每个 tcp 段都是单独确认的,因此发送一个段并获得确认需要一个完整的往返时间(只是为了能够释放缓冲区资源并假定此字符已传输)
那么,最后,限制是什么?这取决于您的应用程序。如果您可以处理可用的内核资源并且不需要更多缓冲区,则可以在用户空间中没有缓冲区的情况下通过。如果您需要更多,您将需要实现缓冲区并能够在可用时将缓冲区数据提供给内核缓冲区。
关于linux - TCP 套接字发送缓冲区大小效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28785437/
第一个 .on 函数比第二个更有效吗? $( "div.container" ).on( "click", "p", function(){ }); $( "body" ).on( "click",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有这样的查询: $('#tabContainer li'); JetBrains WebStorm IDE 将其突出显示为低效查询。它建议我改用这个: $('#tabContainer').find
我刚刚在 coursera ( https://www.coursera.org/saas/) 上听了一个讲座,教授说 Ruby 中的一切都是对象,每个方法调用都是在对象上调用发送方法,将一些参数传递
这可能是用户“不喜欢”的另一个问题,因为它更多的是与建议相关而不是与问题相关。 我有一个在保存和工作簿打开时触发的代码。 它在 f(白天与夜晚,日期与实际日期)中选择正确的工作表。 周一到周三我的情况
这只是我的好奇心,但是更有效的是递归还是循环? 给定两个功能(使用通用lisp): (defun factorial_recursion (x) (if (> x 0) (*
这可能是一个愚蠢的问题,但是while循环的效率与for循环的效率相比如何?我一直被教导,如果可以使用for循环,那我应该这样做。但是,实际上之间的区别是什么: $i = 0; while($i <
我有一个Elasticsearch索引,其中包含几百万条记录。 (基于时间戳的日志记录) 我需要首先显示最新记录(即,按时间戳降序排列的记录) 在时间戳上排序desc是否比使用时间戳的函数计分功能更有
使用Point2D而不是double x和y值时,效率有很大差异吗? 我正在开发一个程序,该程序有许多圆圈在屏幕上移动。他们各自从一个点出发,并越来越接近目的地(最后,他们停下来)。 使用 .getC
我正在编写一个游戏,并且有一个名为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。 我有一个定义为包含游戏中所有对象的列表。 List objects; 当
我是 Backbone 的初学者,想知道两者中哪一个更有效以及预期的做事方式。 A 型:创建一个新集合,接受先前操作的结果并从新集合中提取 key result = new Backbone.Coll
最近,关于使用 LIKE 和通配符搜索 MS SQL 数据库的最有效方法存在争论。我们正在使用 %abc%、%abc 和 abc% 进行比较。有人说过,术语末尾应该始终有通配符 (abc%)。因此,根
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想知道,这样做会更有效率吗: setVisible(false) // if the component is invisible 或者像这样: if(isVisible()){
我有一个静态方法可以打开到 SQL Server 的连接、写入日志消息并关闭连接。我在整个代码中多次调用此方法(平均每 2 秒一次)。 问题是 - 它有效率吗?我想也许积累一些日志并用一个连接插入它们
这个问题在这里已经有了答案: Best practice to avoid memory or performance issues related to binding a large numbe
我为我的 CS 课(高中四年级)制作了一个石头剪刀布游戏,我的老师给我的 shell 文件指出我必须将 do while 循环放入运行者中,但我不明白为什么?我的代码可以工作,但她说最好把它写在运行者
我正在编写一个需要通用列表的 Java 应用程序。该列表需要能够经常动态地调整大小,对此的明显答案是通用的Linkedlist。不幸的是,它还需要像通过调用索引添加/删除值一样频繁地获取/设置值。 A
我的 Mysql 语句遇到了真正的问题,我需要将几个表连接在一起,查询它们并按另一个表中值的平均值进行排序。这就是我所拥有的... SELECT ROUND(avg(re.rating
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is there a difference between i==0 and 0==i? 以下编码风格有什么
我是一名优秀的程序员,十分优秀!