TCP - LRO / TSO技术

时间:2011-09-12 07:47:24

标签: tcp

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

1 个答案:

答案 0 :(得分:2)

路由器没有。桥梁做。

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

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

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

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

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

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

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

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

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

总结:

最糟糕的情况是网桥将反复重试在损坏的接口上发送相同的数据块,整个网桥将锁定,直到应用程序决定放弃。最好的情况是,非TSO网卡似乎已经死了。

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