接收tcp / ip套接字的缓冲区大小

时间:2010-01-27 09:21:54

标签: sockets tcp buffer

接收操作中应该达到的最大数据大小是多少?必须发送的数据非常大,但在某些时候我会猜到数据包碎片?

2 个答案:

答案 0 :(得分:6)

  1. 您始终可以限制缓冲区recv()将填充(参数)
  2. 的大小
  3. 您的应用程序设计不应对recv()愿意在一次调用中提供的字节数量敏感。
  4. 与MTU没什么关系。在某些TCP堆栈设计中,对recv()的一次调用不会返回多个基础数据包协议的数据报。在其他情况下,它可能与套接字的接收缓冲区一样大。

答案 1 :(得分:1)

有一些类似于最大网络数据包大小的内容:

MTU

这表示在通过网络传输数据(非环回)期间,低级缓冲区(3个iso / osi层IP)的最大大小。 在以太网网络中通常为1492。

因此,将数据传输优化到此数量的大小是值得的。

(也有所谓的Jumbo frames违反了这个规则,但必须有接受该规则的软件/硬件)

然而,socket上的简单recv()可以返回比MTU更多的字节。 因此,您需要传输具有其余数据大小的第一个数据包。

size = recv(512) // size should came in one shot 
while( count(data) == size) // the rest of actual data can came sliced, so You should receive until size
    data[offset] = recv(size)