读取TCP数据包缓冲区

时间:2014-06-12 22:56:06

标签: sockets tcp buffer

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

每个循环,我在整个连接中排序接下来的1024个字节,或者操作系统将所有4096存储在内存中,而我只是在复制?

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

回答你的问题,是的。你肯定在做副本。副本的副本,这些位被读入NIC中的缓冲区,您的操作系统将它们放在某处,并在您进行流读取时复制它们。

我不太确定一篇好文章和大学级网络的一般课程一样多。我建议写一本关于这个主题的书,但是我对不同的网络教科书没有多少经验可以为一个人提出建议。

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