有没有人能解释一下TCP中TSO / LRO硬件功能是什么,以及这些功能是否也负责确认机制?
有没有人能解释一下TCP中TSO / LRO硬件功能是什么,以及这些功能是否也负责确认机制?
我知道这是一个旧的帖子,但我觉得答案并不完整。
首先你需要明白的是,TSO 只是提高网络性能的技术大冰山中的一个小角色。
让我们来考虑一下基本的网络接口。操作系统使用 PIO(编程输入/输出,即一次一个字(通常为32位))将整个数据包发送到 NIC(网络接口卡),以便其在电线上出现,但不包括帧检查序列。
这些是传输数据速度提升的方法。
因此,第一个速度提升点是使用 DMA(直接内存访问),这允许处理器在硬件复制数据包时继续执行其他任务。但是,操作系统仍然必须将数据包数据复制到内存中并生成头和校验和。
第二个提速是让硬件为数据包的数据部分生成校验和,操作系统仍然会将数据复制到其内存空间中并放置头信息。由于操作系统正在生成头信息,因此它也可以始终为头信息生成校验和。这似乎很复杂,但机制实际上非常简单。硬件被告知在达到位置 XX 时开始进行校验和,并在数据包缓冲区的位置 yy 上放置校验和。
第三个提速是使用 Scatter/Gather。这基本上意味着操作系统不会将数据复制到其内存中,而是将头信息和数据部分的位置传递给驱动程序,并允许驱动程序收集要发送的数据。这需要硬件校验和,如果操作系统需要对数据包进行校验和,则需要先将其复制到内存中。
第四个(也是 Linux 中本地支持的最高级别的提速)是 TSO。使用 TSO,操作系统提供一个头模板,然后提供一大块数据(不超过 64K),让硬件将其拆分并生成校验和,这意味着操作系统需要生成较少的头信息,并且设置 DMA 的任何开销也将被消除。当数据包进入电线时,它们遵守数据包的常规规则,并与通过的任何交换机或路由器兼容。
在接收数据方面,情况会有所不同。硬件校验和更多是猜测而非确定性的,因此应该发生的是硬件将数据包和校验和分别传递给操作系统并允许操作系统决定数据包是否正常。
对于接收来说,散布/聚集(Scatter/Gather)几乎是多余的。
大数据块接收卸载(LRO)呢?好吧,在硬件上没有简单的方法可以知道这些数据包的含义,因此LRO目前仅是软件构造,数据包被传递到操作系统,然后操作系统决定是将数据连接成一个大块传递给应用程序还是传递多个较小的块。
关于网络堆栈的一些注释:
软件始终应该生成ACK数据包。唯一不生成ACK数据包的原因是如果您的NIC上有TOE(TCP卸载引擎)。我不知道有哪个操作系统本地支持这一点,这意味着您需要对其进行修改以使其兼容。
以上是完整且啰嗦的回复,希望能对某些人有所帮助。