谁能解释一下TCP中的TSO / LRO硬件功能是什么?

时间:2011-09-11 08:43:19

标签: networking tcp

有人可以解释TCP中的TSO / LRO硬件功能是什么,以及这些功能是否也对确认机制负责?

2 个答案:

答案 0 :(得分:15)

我知道这是一个旧帖子,但我觉得答案并不完整。

首先要了解的是,在网络性能提升技术方面,TSO是一个相当大的冰山一角。

让我们考虑一下基本的网络接口。您的操作系统使用PIO(编程输入/输出,即一次一个字(通常为32位))将整个数据包发送到NIC(网络接口卡),因为它应该出现在线路上,但不包括帧检查序列。

这些是数据传输的速度提升。

因此,第一个速度提升是使用DMA(直接内存访问),这允许处理器在硬件复制数据包时执行其他操作。但操作系统仍然需要将数据包数据复制到内存中并生成标头和校验和。

第二个提升是让硬件为数据包的数据部分生成校验和,OS仍然会将数据复制到其内存空间并将标头放在它之前。由于操作系统正在生成标头,因此它也可以始终生成标头的校验和。这似乎很复杂,但机制实际上非常简单。硬件被告知在到达位置XX时开始校验和,并将校验和放在数据包缓冲区的yy位置。

第三个提升是使用Scatter / Gather。这基本上意味着操作系统不会将数据复制到其内存中,它会将标头和数据部分的位置传递给驱动程序,并允许驱动程序收集数据以发送它。这需要硬件校验和,如果操作系统需要对数据包进行校验和,则需要先将其复制到内存中。

第四个(也是Linux中本机支持的最高级别)是TSO。使用TSO,操作系统为硬件提供了一个标头模板,然后是大块数据(不超过64K),因为它需要分割和校验和,这意味着操作系统需要生成更少的标头,并且设置DMA的任何开销也会被抽取。当数据包通过线路传输时,它们符合正常的数据包规则,并且与它们通过的 ANY 交换机或路由器兼容。

接待是另一回事。硬件校验和更多的是猜测而不是确定性,所以应该发生的是硬件将数据包和校验和分别传递给操作系统,并允许操作系统判断数据包是否正常。

Scatter / Gather对于接收来说几乎是多余的。

LRO(大型接收卸载),好吧,硬件没有简单的方法来了解这些数据包的意思,所以LRO目前只是一个软件构造,数据包传递给操作系统,操作系统然后决定是否连接数据并将大块传递给应用程序或传递许多较小的块。

关于网络堆栈的一些注意事项。

软件应始终生成ACK数据包。它不会是你的NIC上有TOE(TCP卸载引擎)的唯一原因。我不知道任何原生支持这种操作系统的操作系统,这意味着你需要破解它以使其兼容。

所以有一个完整而漫无边际的回应,希望它有助于某人。

答案 1 :(得分:6)

具有TSO功能的硬件的主机将TCP数据发送到NIC,而不用软件对数据进行分段。 NIC将执行TCP分段(读取 - 它将大数据块分成段)。支持LRO的NIC接收数据包并在将数据传递到本地软件之前重新组装它们。

LRO / TSO不直接对ack机制负责(尽管它依赖于GBN)。请注意,只要涉及的所有接口都支持该技术,LRO / TSO就可以安全地用在路由器和网桥上。