【发布时间】:2012-09-27 15:55:35
【问题描述】:
为什么涉及的所有接口(路由器和网桥)都必须支持 LRO/TSO 技术?
【问题讨论】:
-
我不知道这是必需的。您能否提供有关此类要求的参考?
标签: tcp
为什么涉及的所有接口(路由器和网桥)都必须支持 LRO/TSO 技术?
【问题讨论】:
标签: tcp
路由器没有。桥梁可以。
外部路由器、集线器、交换机或任何其他外部连接到网络的东西都不会看到 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 的驱动程序中有不安全的代码,那么这可能会导致分段错误,从而导致整个系统停机。
【讨论】: