【问题标题】:Linux: checking of incoming UDP datagramsLinux:检查传入的 UDP 数据报
【发布时间】:2018-07-20 16:10:19
【问题描述】:

我正在使用连接在 10G 以太网链路上的专用硬件。我对传入数据报的处理有一些疑问,如下:

  1. 如果 NIC 发现不正确的链路级以太网 CRC,会发生什么情况?一些搜索显示错误可能无法可靠地报告(例如here)。我可以期望从更新的内核(2.6 - 3.10)中获得更好的统计数据吗?
  2. 在决定是否将数据包返回到recv 之前,内核实际检查了什么?我猜对于 IPv4,IPv4 标头校验和必须是正确的,但是可选的 UDP 标头校验和呢?
  3. recv 能否为 UDP/SOCK_DGRAM 返回 0?
  4. 对于非阻塞SOCK_DGRAM 套接字,当数据可用时recv 是否总是返回整个数据包?我想它必须,但从文档中并不明显。

谢谢。

【问题讨论】:

  • 现代 EMAC 能够在硬件中执行 IP、TCP 和 UDP 校验和(生成和)验证,并将其从内核中卸载。当检测到任何校验和错误时,典型的 EMAC 可以配置为丢弃整个帧。 NETIF_F_RXCSUM 可用于启用此硬件功能。 BTW 内核版本 2.6 - 3.10 不再被视为“最近的”

标签: sockets linux-kernel udp linux-device-driver


【解决方案1】:
  1. 我的知识在这里可能已经过时了,但从历史上看,带有 FCS 错误的数据包根本没有被传递并且不计入接口统计信息。以太网层错误计数通常由ethtool -S <interface> 报告。问题一直是接口统计信息保持在驱动程序级别之上,并且内部没有标准的 API 供网络驱动程序报告这些统计信息。 (当然,在过去的 10Mb 半双工时代,冲突发生得相当频繁,以太网层的统计数据对于您自己的适配器的行为并不能提供非常丰富的信息。)

  2. 如果数据包的 IP 标头校验和错误,或者 UDP 校验和错误提供校验和(即非零),您不应该接收数据包。

  3. 是的。如果您提供零长度缓冲区,您将收到下一个传入的数据报,但整个内容将被截断,导致返回值为零。此外,UDP 允许长度为零的数据报:因此,如果您收到没有内容的数据报,则返回值也将为零。除了这两种情况,我不相信你会得到零的返回值。

  4. 是的,你应该得到整个数据报如果你的缓冲区有空间。否则,没有。如果您没有提供足够的空间来容纳整个数据报,则不适合的部分将被丢弃(您的下一个recv 将获得后续数据包,而不是截断数据包的结尾)。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多