" unix网络编程"中有一段说:
为避免浪费潜在的缓冲区空间,TCP套接字缓冲区大小 也应该是连接的MSS的偶数倍。一些 实现处理应用程序的这个细节,四舍五入 建立连接后的套接字缓冲区大小(p.902) TCPv2)。这是之前设置这两个套接字选项的另一个原因 建立联系。例如,使用默认的4.4BSD大小 8,192并且假设以太网的MSS为1,460,两个插座 连接时,缓冲区四舍五入为8,760(6 x 1,460) 成立。这不是一个至关重要的要求;额外的空间 在多个MSS上方的套接字缓冲区中,只是未使用。
我无法想象" 浪费潜在的缓冲空间"发生。为什么浪费? 如果缓冲区大小不是MSS的偶数倍,会发生什么? 任何人都可以帮助我解释一下吗?或者任何人都可以提供示例或场景?
答案 0 :(得分:2)
大多数数据包具有最大段大小(MSS)。因此,缓冲区倾向于以MSS的倍数累积数据。如果剩余的缓冲区空间小于MSS,这将在缓冲区不是MSS的整数倍时发生,则不会有空间用于另一个完整大小的数据包。在这种情况下,避免愚蠢窗口综合症的算法让接收者通告0窗口,关闭数据接收,直到有足够的空间再次可用于容纳MSS,并导致额外的缓冲空间被浪费" 34。
请注意,根据收件人对数据的消费模式以及发件人生成的数据,可能无法完全浪费额外的缓冲区空间。例如,接收者可以逐渐消耗数据,在这种情况下,额外的空间将导致足够的空间来容纳MSS,而缓冲仅仅是MSS的精确整数倍。类似地,如果发送方逐渐产生数据,则可以发送较小的分组,导致数据首先不以MSS的倍数接收。在网络限制数据传输速率的情况下,问题基本上是次要的效率问题。
答案 1 :(得分:0)
你是对的,这段经文是无稽之谈。
如果尺寸为8760,则不会浪费多余。 8760 是MSS的倍数。
最后一句话似乎是在谈论不是舍入到MSS的倍数的情况。
然而,这个过剩的'假设所有收到的段都是MSS大小的,其中没有保证。
它还假设应用程序以MSS大小的块读取,这是非常不寻常的。
所以关于浪费空间的东西都是完全错误的。忽略它。
编辑本段出现在WR Stevens,Bill Fenner,Andrew M. Rudolph, Unix网络编程,第I卷,第3版,Addison Wesley 2004,第7.5节, P208。为了公平对待已故和备受尊敬的WRS,应该注意的是,关于浪费空间的材料并没有出现在第二版(1998年)中,也就是他写的最后一篇 solo。可以假设它由第三版的新合作者添加。
史蒂文斯最初只说开始的部分TCP套接字缓冲区大小也应该是连接的MSS的偶数倍,并且当建立连接时结束',没有说什么浪费空间,或为什么。显然,它是为了提高效率。实际上,这通常是不正确的,因为它假设应用程序读取MSS大小的块:它不会那样做,理由消失在窗外。答案 2 :(得分:-1)
根据引用,如果你要求一个大小为8192的缓冲区,分配的缓冲区实际上是8760字节。这意味着分配的内存比应用程序打算使用的内存多。内存是浪费的,因为它是为缓冲区保留的,但实际上不会用于任何东西。
对于相同数量的已用内存,您的应用程序实际上可以使用更大的8760字节缓冲区。使用8192字节的较小缓冲区实际上并不保存任何内存,因为内部总共会分配8760个字节。
因此,如果您所处的内存很少且计划有很多连接,这些信息将帮助您充分利用您的程序可用的小内存。