Linux内核如何找到解析IP数据包的正确偏移量?

时间:2016-05-07 22:32:45

标签: linux-kernel ip

我发现哪些代码解析kernel source tree中的IP(v4)数据包。此函数ip_rcv可以高度确定地检测数据包是否正确,如其中一条评论中所述:

  1. 长度至少为ip header的大小
  2. 版本4
  3. 正确的校验和。 [以后的速度优化,跳过环回校验和]
  4. 没有虚假的长度
  5. 简单地删除了格式错误的数据包。这个函数似乎得到了一堆应该类似于IP数据包的字节,但是如果某个恶意行为者会在线上偷一个额外的字节呢?如果处理不当,ip_rcv从现在开始接收的所有字节块将从1字节开始关闭,并且不再能够重建正确的IP数据包。我假设内核比尝试开始解析IP数据包的所有不同字节偏移更聪明。到底是什么,我无法找到。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

我没有花时间查看内核代码,但大多数协议栈都是通过在前一个堆栈位置之后立即解析数据而不是通过搜索数据来实现的。

在以太网的情况下,以太网帧头的大小通常为14个字节。它可以变化,但标题本身在必要时指示etherType字段中的不同长度。在此示例中,NIC(网络接口卡)将接收以太网帧。如果帧的目的地是该NIC,则从NIC驱动程序传递到IP堆栈的数据将是包含此14字节头的以太网帧,紧接着是IP头(如果是版本4 IP,则第一个半字节将为4)例如标题。)

同样,我没有查看网络堆栈代码,但这里有两种常见情况:

1)IP堆栈被告知这是一个以太网帧,只需解析以太网帧头的长度,下一个字节必须是IP头,否则数据不是IP帧。

2)IP堆栈被指向紧跟在以太网帧头之后的数据的开头,然后IP堆栈开始在该位置解析。