【问题标题】:caching data packets缓存数据包
【发布时间】:2010-06-22 05:16:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: caching udp kernel


    【解决方案1】:

    除非设置了 BPF(伯克利包过滤器)或等效的(即防火墙)来检查流量并可能改变它,否则堆栈应该很高兴地不知道数据报中的有效负载。您应该能够再次使用相同的数据包。

    【讨论】:

    • 好的,谢谢,没想到……但即使我有防火墙检查数据包,如果允许数据包通过,它们也不应该干扰。我主要关心内核中发生的某种缓存,而我并不知道。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 2011-04-18
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多