【发布时间】:2011-09-11 08:43:18
【问题描述】:
谁能解释 TCP 中的 TSO/LRO 硬件功能是什么?这些功能是否也负责确认机制?
【问题讨论】:
标签: networking tcp
谁能解释 TCP 中的 TSO/LRO 硬件功能是什么?这些功能是否也负责确认机制?
【问题讨论】:
标签: networking tcp
我知道这是一个老帖子,但我觉得答案并不完整。
您首先要了解的是,在网络性能提升技术方面,TSO 只是一个相当大的冰山一角。
让我们考虑基本的网络接口。您的操作系统使用 PIO(编程输入/输出,即一次一个字(通常 32 位))将整个数据包发送到 NIC(网络接口卡),因为它应该只出现在线路上,不包括帧检查序列。
这些是数据传输的速度提升。
所以第一个速度提升是使用 DMA(直接内存访问),这允许处理器在硬件复制数据包时做其他事情。但操作系统仍然需要将数据包数据复制到内存中并生成标头和校验和。
第二个提升是让硬件为数据包的数据部分生成校验和,操作系统仍会将数据复制到其内存空间并将标头放在它之前。由于操作系统正在生成标头,它也可以始终为标头生成校验和。这看起来很复杂,但机制实际上很简单。通知硬件在到达位置 XX 时开始校验和,并将校验和放置在数据包缓冲区中的位置 yy 处。
第三个提升是使用 Scatter/Gather。这基本上意味着操作系统不会将数据复制到其内存中,而是将数据部分的标头和位置传递给驱动程序,并允许驱动程序收集数据以发送它。这需要硬件校验和,如果操作系统需要对数据包进行校验和,则需要先将其复制到内存中。
第四个(也是 Linux 中原生支持的最高级别)是 TSO。使用 TSO,操作系统为硬件提供了一个标头模板,然后是一大块数据(不超过 64K)供其拆分和校验和,这意味着操作系统需要生成更少的标头,并且设置 DMA 的任何开销也被抽取.当数据包在线路上传输时,它们符合数据包的正常规则,并将与它们通过的ANY交换机或路由器兼容。
接待处是另一回事。硬件校验和在这里更多的是猜测而不是确定,所以应该发生的是硬件将数据包和校验和分别传递给操作系统,并允许操作系统决定数据包是否正常。
Scatter/Gather 对于接收来说几乎是多余的。
LRO (Large receive offload),好吧,硬件没有简单的方法知道这些数据包的含义,所以 LRO 目前只是一个软件结构,数据包被传递给操作系统,然后由操作系统决定是否连接数据并将大块传递给应用程序或传递许多较小的块。
关于网络堆栈的一些说明。
软件应该总是产生 ACK 数据包。它不会的唯一原因是如果您的 NIC 上有一个 TOE(TCP 卸载引擎)。我不知道有任何操作系统本身支持此功能,这意味着您需要对其进行破解以使其兼容。
所以有一个完整而漫不经心的回应,希望它对某人有所帮助。
【讨论】:
具有启用 TSO 的硬件的主机将 TCP 数据发送到 NIC,而不用软件对数据进行分段。 NIC 将执行 TCP 分段(读取 - 它将大数据块分成多个段)。支持 LRO 的 NIC 在将数据传递到本地软件之前接收数据包并重新组合它们。
LRO/TSO 不直接对 ack 机制负责(尽管它确实依赖于 GBN)。请注意,只要涉及的所有接口都支持该技术,LRO/TSO 就可以安全地用于路由器和网桥。
【讨论】: