缓存数据包

时间:2010-06-09 12:24:04

标签: caching udp kernel

不确定这是否是合适的地方,但是这里......

我在linux中使用普通套接字实现了UDP客户端/服务器。

(假设这两台主机之间没有任何东西以任何方式干扰数据包,只是按原样传递它)

内核是否对这些UDP数据包进行任何缓存/优化(这是我每次发送的完全相同的数据包)

我正在做一些测试,在客户端/服务器之间“ping”不同大小的数据包,并想知道我是否需要每次用随机数据填充数据包,或者我可以只发送这个“固定内容”数据包时间? (每个测试的数据包大小保持不变)。

3 个答案:

答案 0 :(得分:2)

除非已设置BPF(伯克利数据包过滤器)或等效设备(即防火墙)来检查流量并可能对其进行更改,否则堆栈应该幸福地不知道数据报中的有效负载。您应该能够再次使用相同的数据包。

答案 1 :(得分:0)

正如armardeep所说,堆栈没有意识到有效载荷。防火墙通常不会修改数据报,它们会让它们完全阻止它们。

内核不会'缓存'包但会缓冲它们。至少有一个输出缓冲区,其中包直到网络线空闲为止,以及一个输入缓冲区,其中存储接收到的包直到代码调用recv方法。

实际上,管道中可能还有一些缓冲区,但从应用程序的角度来看,内核的行为就像它只有这两个缓冲区一样。顺便说一句,两者都会溢出。

答案 2 :(得分:0)

在调用recv之前,存在与存储数据包的套接字关联的内核缓冲区。如果内核接收数据的速度比从套接字缓冲区中删除数据的速度快,则会发生溢出,内核将以静默方式丢弃数据包。您可以通过调用setsockopt来增加该特定套接字的接收缓冲区的大小。

int rcvbuflen = 0x20000; // 128kb
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen));

您可以使用getsockopt检查缓冲区的当前大小。