TCP-LRO/TSO技术

TCP-LRO/TSO技术,tcp,Tcp,为什么所有涉及的接口(路由器和网桥)都必须支持LRO/TSO技术?路由器不支持。桥可以 外部路由器、集线器、交换机或任何其他外部连接到网络的设备将看不到TSO的影响,只有带有TSO的设备内部的接口会受到任何影响-这是一种软件 路由器是一种外部设备,通过以太网电缆、光纤电缆、无线通信等连接到网络。这些通信介质遵守国际标准,如803.2以太网标准或803.11无线标准。它们是硬件设备,硬件设备对如何通信有非常严格的规则 桥接器是一种内部软件构造,特定于您的操作系统 以803.2(以太网)和linux

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

路由器不支持。桥可以

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

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

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

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

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

<强>让我们先考虑一个标准接口直接指向硬件NIC:

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

<强>现在让我们考虑一下软件桥后面的几个NIC: < /强>

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

总之:

最坏的情况是,网桥将重复尝试在断开的接口上发送相同的数据块,整个网桥将锁定,直到应用程序决定放弃。在最佳情况下,非TSO NIC将看起来只是死机


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

我不知道这是必需的。你能提供这种要求的参考资料吗?