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