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



我在内核源代码树中找到了解析IP(v4)数据包的代码。该函数ip_rcv可以高度确定地检测数据包是否正确,如其中一条评论所述:

  1. 长度至少为ip标头的大小
  2. 第4版
  3. 校验和正确。[稍后进行速度优化,跳过环回校验和]
  4. 没有伪造的长度

只需丢弃格式不正确的数据包。这个函数似乎得到了一堆应该类似于IP数据包的字节,但如果某个恶意行为者会在线路上偷偷增加一个字节呢?如果处理不正确,ip_rcv从现在起接收的所有字节块将从1字节开始,并且不能再重建正确的IP分组。我认为内核会做一些比尝试所有不同的字节偏移量更聪明的事情,以开始解析IP数据包。具体是什么,我找不到。有人能解释一下吗?

我还没有花时间查看内核代码,但大多数协议栈的工作方式是在上一个堆栈位置之后立即解析数据,而不是搜索数据。

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

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

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

2) IP堆栈被赋予一个指针,指向紧接在以太网帧报头之后的数据的开头,然后IP堆栈在该位置开始解析。

最新更新