2014-09-25 28 views
1

中有“UNIX网络编程”段落中的连接,他说:TCP套接字缓冲区大小也应该是MSS的偶数倍为

为了避免浪费潜在的缓冲空间,TCP套接字缓冲区大小 也应该是连接的MSS的偶数倍。某些 实现为应用程序处理此详细信息,在建立连接( TCPv2的第902页)后将套接字缓冲区大小整理为 。这是在 建立连接之前设置这两个套接字选项的另一个原因。例如,使用8,192的默认4.4BSD大小 ,并假设以太网的MSS为1460,则在建立连接 时,两个套接字 缓冲区都将四舍五入为8,760(6 x 1,460)。这不是一个关键的要求;在多个MSS之上的套接字缓冲区中的附加空间 仅仅是未使用的。

我无法想象如何“浪费潜在的缓冲空间”发生。为什么浪费
如果缓冲区大小不是MSS的偶数倍,会发生什么情况?
任何人都可以帮我解释吗?或者有人可以提供一个例子或场景?

回答

2

大多数数据包都具有最大段大小(MSS)。因此,缓冲区将倾向于以MSS的倍数累积数据。如果剩余的缓冲区空间小于MSS,当缓冲区不是MSS的整数倍时会发生这种情况,则不会有空间用于其他全尺寸数据包。在这种情况下,用于避免愚蠢窗口综合症的算法使接收机宣告0窗口,关闭数据接收直到再次有足够的空间容纳MSS,并导致额外的缓冲空间被“浪费”。

请注意,根据收件人对数据的使用模式以及发件人生成的数据,额外的缓冲区空间可能不会完全浪费。例如,收件人可能会逐渐使用数据,在这种情况下,额外的空间将导致有足够的空间容纳MSS,而不是只有MSS的确切整数倍的缓冲区。同样,如果发送方逐渐产生数据,则可能会发送更小的数据包,导致数据首先不能以MSS的倍数接收。在网络限制数据传输速率的情况下,这个问题基本上是一个次要的效率问题。

-1

根据报价,如果你要求一个大小为8192的缓冲区,分配的缓冲区实际上是8760字节。这意味着分配的内存比您的应用程序打算使用的内存多。内存被浪费了,这是因为它是为缓冲区保留的,但实际上不会用于任何事情。

对于相同数量的已用内存,您的应用程序实际上可以使用更大的8760字节缓冲区。使用8192字节的较小缓冲区实际上并不保存任何内存,因为在内部无论如何都会分配8760字节。

因此,如果您处于可用内存很少并计划建立多个连接的环境中,此信息将帮助您最佳地利用您的程序中可用的小内存。

+1

这段话并不是指记忆效率;它指的是TCP数据传输效率。 – 2014-09-25 16:13:28

+0

报价并不真实地说出你的第一句话声称。这不是我见过的最好的作品,但它同时谈论两种情况:它被“某些实现”四舍五入的情况,以及它不是的情况。 – EJP 2014-09-25 23:20:09

0

你说得对,这段话是无稽之谈。

  1. 如果大小是8760,没有多余的浪费。 8760 MSS的倍数。

  2. 最后一句似乎是在谈论其中不是四舍五入到MSS的倍数的情况。

  3. 但是,这个“超额”假定所有收到的段都是MSS大小的,其中没有保证。

  4. 它还假定应用程序在MSS大小的块中读取,这非常不寻常。

所以关于浪费空间的东西是完全不正确的。忽略它。

编辑这一段出现在W. R.史蒂文斯,比尔·芬纳,安德鲁·M.·鲁道夫,unix网络编程,第一卷,第3版,艾迪生韦斯利2004年,第7.5节,P208。公平地看待已故的WRS,应该注意的是,关于浪费空间的材料并未出现在第二版(1998)中,他最后一次写了独奏。据推测,它是由第三版的新合着者添加的。

史蒂文斯最初只是说,'TCP套接字缓冲区大小应该是连接的MSS的偶数倍',并且'当连接建立时'结束,没有说什么浪费的空间,或者为什么。显然这是为了效率在电线上。碰巧,这也通常是不正确的,因为它假定应用程序读取MSS大小的块:当它不这样做时,理由消失在窗口外面。

相关问题