2014-06-12 112 views
-1

要通过TCP接收数据,我需要设置一个默认大小的缓冲区,如果我收到的数据包的大小大于此缓冲区,所以我需要循环读取所有发送的字节。例如,如果我收到4096个字节,并且我的阅读器缓冲区设置为1024,那么我需要循环4次以获取整个数据包?阅读TCP数据包缓冲区

每个循环,我在整个连接中订购了下一个1024字节,或者操作系统的所有4096存储在内存中,我只是在做一个副本?

一些关于如何在低级别工作的好文章?

回答

1

您的问题与应用层下面的图层有很大关系,但我会尽力回答它。

您的网络接口卡(NIC)正在执行收集数据包并等待您的操作系统读取它们的所有必要任务。最终,当你做一个流读取时,你从你的操作系统已经保留的内存中拉出,并不断存储传入的信息副本。

要回答你的问题,是的。你肯定在做一个副本。一份拷贝,这些位被读入你的网卡内的一个缓冲区,你的操作系统把它们放在某个地方,当你进行流读取时,你拷贝它们。

我不确定一篇好文章与大学级网络中的一般课程一样多。我会推荐一本关于这个主题的书,但是我没有太多关于不同网络教科书的经验来提出一个关于另一个的建议。

编辑:我觉得你想知道在执行流读取时运行的确切代码。我不知道你是否指定了一种语言,但是这里有一个指向C#流源的链接:Microsoft Stream.cs source code

2

TCP实现的接收缓冲区几乎肯定大于4KB。因此,发件人不会在发送第二个1KB之前等待您收到第一个1KB。接收小缓冲区只会导致对TCP层的额外调用。

然而,使用小缓冲区发送可能会导致发送“短数据包”,并且由于延迟的ACK和Nagling而导致效率低下。对于典型的以太网和Internet网络上的TCP,2KB是一个最小的理想发送缓冲区(因为它比普通的MTU大),但建议使用8KB或更多。