有人能解释一下TCP中TSO/LRO硬件功能是什么吗?

8

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


从来没有听说过这些硬件功能。你能解释一下吗? - valdo
同样在维基百科上:TSOLRO - Steve-o
2个回答

17

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

首先你需要明白的是,TSO 只是提高网络性能的技术大冰山中的一个小角色。

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

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

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

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

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

第四个(也是 Linux 中本地支持的最高级别的提速)是 TSO。使用 TSO,操作系统提供一个头模板,然后提供一大块数据(不超过 64K),让硬件将其拆分并生成校验和,这意味着操作系统需要生成较少的头信息,并且设置 DMA 的任何开销也将被消除。当数据包进入电线时,它们遵守数据包的常规规则,并与通过的任何交换机或路由器兼容。

在接收数据方面,情况会有所不同。硬件校验和更多是猜测而非确定性的,因此应该发生的是硬件将数据包和校验和分别传递给操作系统并允许操作系统决定数据包是否正常。

对于接收来说,散布/聚集(Scatter/Gather)几乎是多余的。

大数据块接收卸载(LRO)呢?好吧,在硬件上没有简单的方法可以知道这些数据包的含义,因此LRO目前仅是软件构造,数据包被传递到操作系统,然后操作系统决定是将数据连接成一个大块传递给应用程序还是传递多个较小的块。

关于网络堆栈的一些注释:

软件始终应该生成ACK数据包。唯一不生成ACK数据包的原因是如果您的NIC上有TOE(TCP卸载引擎)。我不知道有哪个操作系统本地支持这一点,这意味着您需要对其进行修改以使其兼容。

以上是完整且啰嗦的回复,希望能对某些人有所帮助。


4
如果您改进格式,可以极大地帮助提高本回答的可读性! - Austin Henley
感谢您的解释,我会将此添加为注释: "TSO会导致网络卡将较大的数据块分成TCP段。" "LRO将传入的网络数据包重新组装成较大的缓冲区,并将结果更大但数量较少的数据包传输到主机或VM的网络堆栈中。" 引自: https://docs.fortinet.com/vm/vmware-esxi/fortigate/6.2/vmware-esxi-cookbook/6.2.0/654026/tso-and-lro - Atheel Massalha

6
有启用TSO功能的主机会将TCP数据发送到NIC,而不需要在软件中对数据进行分段。NIC将执行TCP分段(即将大块数据分成片段)。支持LRO的NIC收到数据包后会在将数据传递给本地软件之前重新组装它们。
需要注意的是,尽管LRO/TSO依赖于GBN,但它们不直接负责ACK机制。请注意,只要涉及的所有接口都支持该技术,LRO/TSO就可以安全地用于路由器和桥接设备。

  1. 如果LRO/TSO不负责ack机制,它们如何分段/重组数据包?
  2. 为什么所有涉及的接口都必须支持LRO/TSO技术?
- Amir Yosha
  1. 大接收卸载通过将来自单个流的多个传入数据包聚合到较大的缓冲区中,然后将它们传递给更高层次的网络堆栈。它仅仅是聚合它们,没有任何验证数据是否正确发送的方式。有算法可以在另一个层次上解决这个问题。
  2. 如果我要告诉你1509GB的数据,那么你应该至少意识到并准备一个1509GB的缓冲区,这就是LRO/TSO的简单规则。
- Henry Aloni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接