Linux:检查传入的UDP数据报

时间:2018-07-20 16:10:20

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

  4. 是的,应该提供的整个数据报在缓冲区中有空间。否则,不会。如果您没有提供足够的空间来容纳整个数据报,那么不适合的部分将被丢弃( ie 您的下一个recv将获得后续数据包,而不是删掉一个)。