Caching 缓存数据包

Caching 缓存数据包,caching,udp,kernel,Caching,Udp,Kernel,我不确定这是不是该问的地方,但这是 我在linux中使用普通套接字实现了一个UDP客户机/服务器 (假设这两台主机之间的网络端没有任何东西以任何方式干扰数据包,只是按原样传递数据包) 内核是否对这些UDP数据包进行了任何类型的缓存/优化(它与我每次发送的数据包完全相同) 我正在测试客户端/服务器之间的哪些“乒乓球”数据包大小不同,我想知道我是否每次都需要用随机数据填充数据包,还是可以一直发送这个“固定内容”数据包?(每个测试的数据包大小保持不变)。除非设置了BPF(Berkeley数据包过滤器)

我不确定这是不是该问的地方,但这是

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

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

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


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

除非设置了BPF(Berkeley数据包过滤器)或等效物(即防火墙)来检查流量并可能对其进行更改,否则堆栈应该不会察觉数据报中的有效负载。您应该能够再次使用相同的数据包。

正如armardeep所说,堆栈不知道有效负载。防火墙通常不会修改数据报,它们允许数据报通过或完全阻止数据报

内核不会“缓存”包,但会缓冲它们。至少会有一个输出缓冲区,在那里包结束,直到网线空闲;还有一个输入缓冲区,在那里接收到的包被存储,直到您的代码调用recv方法


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

在调用
recv
之前,有一个与存储数据包的套接字相关的内核缓冲区。如果内核接收数据的速度比您从套接字缓冲区中删除数据的速度快,那么将发生溢出,内核将自动丢弃您的数据包。您可以使用对的调用来增加该特定套接字的接收缓冲区的大小


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

好的,谢谢,我没有想到……但是即使我有防火墙检查数据包,如果允许数据包通过,它们也不应该干扰。我主要关心内核中正在进行的某种缓存,而我对此一无所知。
int rcvbuflen = 0x20000; // 128kb
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen));