首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存数据包

缓存数据包
EN

Stack Overflow用户
提问于 2010-06-09 20:24:04
回答 3查看 1.3K关注 0票数 0

不知道这是不是该问的地方,但我要说的是...

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-09 20:36:41

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

票数 2
EN

Stack Overflow用户

发布于 2010-06-18 22:03:29

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

内核不会“缓存”包,但会对它们进行缓冲。至少有一个输出缓冲区和一个输入缓冲区,其中包在其中结束,直到网络线路空闲;输入缓冲区中存储接收到的包,直到您的代码调用recv方法。

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

票数 0
EN

Stack Overflow用户

发布于 2010-06-22 05:16:50

有一个与套接字相关联的内核缓冲区,在调用recv之前,包一直存储在该套接字中。如果内核接收数据的速度快于您从套接字缓冲区中删除数据的速度,则会发生溢出,并且内核将静默地丢弃您的数据包。您可以使用对setsockopt的调用来增加该特定套接字的接收缓冲区的大小。

代码语言:javascript
复制
int rcvbuflen = 0x20000; // 128kb
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3005714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档