Linux: 检查传入的 UDP 数据报
Linux: checking of incoming UDP datagrams
我正在使用连接到 10G 以太网 link 的 special-purpose 硬件。我有一些关于传入数据报处理的问题,如下:
- 如果 NIC 发现不正确的 link-level 以太网 CRC 会怎样?一些搜索表明可能无法可靠地报告错误(例如 here)。我能否期望从更新的内核(2.6 - 3.10?)中获得更好的统计数据
- 内核在决定是否将数据包 return 发送到
recv
之前实际上检查了什么?我猜对于 IPv4,IPv4 header 校验和一定是正确的,但是可选的 UDP header 校验和呢?
recv
是否可以 return 0 用于 UDP/SOCK_DGRAM
?
- 对于 non-blocking
SOCK_DGRAM
套接字,当数据可用时 recv
总是 return 整个数据包吗?我猜它必须,但从文档中看并不明显。
谢谢。
我的知识在这里可能已经过时了,但从历史上看,有 FCS 错误的数据包根本没有被传送 和 不计入接口统计数据。以太网层错误计数 是 通常由 ethtool -S <interface>
报告。问题一直是接口统计数据保持在 driver 级别以上,并且网络 driver 内部没有标准 API 来报告这些统计数据。 (此外,当然,在过去的 10Mb 半双工时代,冲突经常发生,以太网层统计数据对于您自己的适配器的行为并不是非常有用。)
如果 IP header 校验和错误,或者 UDP 校验和错误 当 提供校验和时,您不应收到数据包(即 non-zero)。
是的。如果您提供零长度缓冲区,您将收到下一个传入数据报,但整个内容将被截断,导致 return 值为零。此外,UDP 允许 zero-length 数据报:因此,如果您收到没有内容的数据报,则 return 值也将为零。除了这两种情况,我不相信您会得到 return 零值。
是的,你应该得到整个数据报 provided 你的缓冲区中有 space。否则,不。如果您没有提供足够的 space 来容纳整个数据报,则不适合的部分将被丢弃( 即 您的下一个 recv
将获得后续包,不是截断包的结尾)。
我正在使用连接到 10G 以太网 link 的 special-purpose 硬件。我有一些关于传入数据报处理的问题,如下:
- 如果 NIC 发现不正确的 link-level 以太网 CRC 会怎样?一些搜索表明可能无法可靠地报告错误(例如 here)。我能否期望从更新的内核(2.6 - 3.10?)中获得更好的统计数据
- 内核在决定是否将数据包 return 发送到
recv
之前实际上检查了什么?我猜对于 IPv4,IPv4 header 校验和一定是正确的,但是可选的 UDP header 校验和呢? recv
是否可以 return 0 用于 UDP/SOCK_DGRAM
?- 对于 non-blocking
SOCK_DGRAM
套接字,当数据可用时recv
总是 return 整个数据包吗?我猜它必须,但从文档中看并不明显。
谢谢。
我的知识在这里可能已经过时了,但从历史上看,有 FCS 错误的数据包根本没有被传送 和 不计入接口统计数据。以太网层错误计数 是 通常由
ethtool -S <interface>
报告。问题一直是接口统计数据保持在 driver 级别以上,并且网络 driver 内部没有标准 API 来报告这些统计数据。 (此外,当然,在过去的 10Mb 半双工时代,冲突经常发生,以太网层统计数据对于您自己的适配器的行为并不是非常有用。)如果 IP header 校验和错误,或者 UDP 校验和错误 当 提供校验和时,您不应收到数据包(即 non-zero)。
是的。如果您提供零长度缓冲区,您将收到下一个传入数据报,但整个内容将被截断,导致 return 值为零。此外,UDP 允许 zero-length 数据报:因此,如果您收到没有内容的数据报,则 return 值也将为零。除了这两种情况,我不相信您会得到 return 零值。
是的,你应该得到整个数据报 provided 你的缓冲区中有 space。否则,不。如果您没有提供足够的 space 来容纳整个数据报,则不适合的部分将被丢弃( 即 您的下一个
recv
将获得后续包,不是截断包的结尾)。