代码之家  ›  专栏  ›  技术社区  ›  4va1anch3

收发环和sk_buff之间的关系是什么?

  •  4
  • 4va1anch3  · 技术社区  · 7 年前

    我知道每个NIC在RAM中都有其接收/发送环,用于操作系统接收/发送数据包。环中的一项(数据包描述符)包括数据包的物理地址、数据包的长度等。我想知道这个描述符是否指向sk_buff?如果数据包是GSO数据包,会发生什么?环中的一个描述符=一个数据包=一个sk\U buff,这是真的吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   user8549610 user8549610    7 年前

    不完全是这样。 sk_buff 是一种软件结构,大致上是一种数据结构,包含 描述 一些网络数据块和 data sk_buff 数据缓冲区

    如果数据包是GSO数据包,会发生什么?

    这个问题很难回答,因为这样的卸载可以在软件中实现(例如,通过网络堆栈),也可以在硬件中实现。

    在前一种情况下,没有任何关于NIC SW描述符的讨论-上层应用程序提供连续的数据块,网络堆栈从中生成较小的数据包,因此 sk_buff

    在后一种情况下(硬件卸载),网络驱动程序提供了大量数据(通过移交单个 sk_buff -s或 sk_buff 网络驱动程序反过来向NIC发布适当的描述符-它可能是一个指向大块数据的描述符,或者一些描述符指向同一连续数据缓冲区的较小部分-这没有多大关系,因为卸载魔法将在硬件中发生-整个数据块将被切片,数据包头将相应地预先处理,从而产生许多较小的网络数据包放在网上。

    环中的一个描述符=一个数据包=一个sk\U buff,这是真的吗?

    严格来说, . 视情况而定。您的网络驱动程序可能会被要求传输一个 sk_buff 描述一个数据缓冲区。但是,在某些情况下,您的驱动程序可能会决定发布多个描述符,这些描述符指向相同的数据块,但偏移量不同,即提交将分部分完成,并且NIC的环中将有多个描述符与单个 sk_buff sk_buff -一个数据包可以表示为一小部分 部分 每个都用单独的 sk_buff 链条 next prev fields 在里面 sk_buff

        2
  •  1
  •   vesche    7 年前

    Linux内核使用sk_buff数据结构来描述每个 小包裹当数据包到达NIC时,它调用DMA引擎 通过存储在中的空sk_buff将数据包放入内核内存 一种称为rx\U环的环形缓冲区。如果发生以下情况,则丢弃传入数据包: 数据包数据保留在相同的内核内存中,避免了任何额外的 内存副本。

    http://www.ece.virginia.edu/cheetah/documents/papers/TCPlinux.pdf

    最后一句话似乎表明传入的数据包数据保存在sk_buff结构的内核内存中,没有冗余。所以我想说你的问题的答案是肯定的,这个描述符会指向sk_buff。是的,每个数据包都放在rx\U环中它自己的sk\U buff中。

        3
  •  0
  •   oakad    7 年前

    sk_buff 与物理网络接口无关(至少不是直接的)。 sk_buff 列表存储套接字访问软件和内核协议处理程序看到的数据(操作这些列表以添加/删除头和/或更改数据,例如在使用加密时)。

    sk_buff 将内容列出到物理网络适配器能够理解的内容中。特别是,网络硬件可能真的很笨(比如在串行线路上联网时),在这种情况下,驱动程序基本上会读取 sk_buff 逐字节列出并通过线路发送。