【问题标题】:TCP - LRO/TSO techniquesTCP - LRO/TSO 技术
【发布时间】:2012-09-27 15:55:35
【问题描述】:

为什么涉及的所有接口(路由器和网桥)都必须支持 LRO/TSO 技术?

【问题讨论】:

  • 我不知道这是必需的。您能否提供有关此类要求的参考?

标签: tcp


【解决方案1】:

路由器没有。桥梁可以。

外部路由器、集线器、交换机或任何其他外部连接到网络的东西都不会看到 TSO 的影响,只有带有 TSO 的设备内部的接口才会受到影响 - 这是一个软件问题。

路由器是通过以太网电缆、光纤电缆、无线通信等连接到网络的外部设备。这些通信介质遵守国际标准,例如以太网的 803.2 或无线的 803.11 - 它们是硬件设备,和硬件设备对它们的通信方式有非常严格的规定。

桥接器是一种内部软件结构,特定于您的操作系统。

我们以 803.2(以太网)和 linux 主机为例。

应用程序要求创建一个套接字,然后将一个大数据块推送到该套接字中。 linux内核决定了这个数据应该在哪个接口上传输。内核接下来将询问此接口的驱动程序以确定其功能,如果该接口支持 TSO,内核将向该接口传递一个带有单个“模板”标头和大量数据(价值超过 1 个数据包)的 sk_buff司机。

让我们首先考虑直接连接硬件 NIC 的标准接口:

有些接口有假的 TSO(它们在驱动程序中对数据包进行分段),有些有真正的 TSO(模板标头和数据以最小的更改传递给硬件)。此时,驱动程序或 NIC 硬件会将这一大段数据转换为多个符合标准的 803.2 以太网帧,外部设备(如路由器、集线器、交换机、调制解调器或其他主机)正是这些符合标准的帧会在电线上看到。

现在让我们考虑软件桥后面的几个 NIC:

虽然内核在低级别知道每个 NIC,但网络堆栈只知道桥接器,因此只有所有底层 NIC 所具有的功能才应该传递给桥接器。如果将 sk_buff 传递给网桥,则网桥中的所有接口都将收到相同的 sk_buff。我们假设内核再次将我们的大 TSO sk_buff 传递给了网桥,如果任何底层接口不支持 TSO,那么数据包很可能会被相关硬件 NIC 丢弃。

总结:

最坏的情况是网桥会反复重试在损坏的接口上发送相同的数据块,整个网桥将锁定,直到应用程序决定放弃。最好的情况是,非 TSO NIC 将简单地显示为已死。

也就是说,如果 NIC 的驱动程序中有不安全的代码,那么这可能会导致分段错误,从而导致整个系统停机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2011-08-11
    • 2014-08-15
    • 2012-04-14
    • 2019-08-28
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多