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



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

我知道这是一个老问题,但我觉得答案是不完整的。

你首先要明白的是,当涉及到网络性能提升技术时,TSO只是冰山一角。

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

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

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

第二个增强是让硬件为数据包的数据部分生成校验和,操作系统仍然会将数据复制到其内存空间中,并将头放在其前面。当操作系统生成报头时,它也可能总是生成报头的校验和。这看起来很复杂,但其机制实际上很简单。硬件被告知在到达位置XX时开始校验和,并将校验和放置在数据包缓冲区中的位置yy。

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

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

接待是一个不同的故事。硬件校验和在这里更多的是猜测而不是确定的,所以应该发生的是硬件将数据包和校验和分别传递给操作系统,并允许操作系统决定数据包是否正确。

对于接收来说,Scatter/Gather是相当多余的。

LRO (Large receive offload),嗯,硬件没有简单的方法知道这些数据包的意思,所以LRO目前只是一个软件结构,数据包被传递给操作系统,操作系统然后决定是否连接数据并将大块传递给应用程序或传递许多小块。

关于网络栈的几点说明

软件应该总是产生ACK报文。唯一的原因是如果你的网卡上有一个TOE (TCP卸载引擎)。我不知道有哪个操作系统本身支持这个,这意味着你需要破解它以使其兼容。

所以有一个完整的和散漫的回应,希望它能帮助到一些人。

硬件启用tso功能的主机向网卡发送TCP数据,而不需要在软件中对数据进行分段。NIC将执行TCP分段(读-它将把大数据块分成段)。支持LRO的网卡接收数据包,并在将数据传递给本地软件之前对其进行重组。

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

最新更新