有些硬件可以计算校验和,硬件计算校验和可以计算L4层的头和数据,常见的是TCP和UDP,为什么计算L4校验和不计算L3校验和呢?因为IP层只校验IP的头部,数据量最多只有四十个字节,不需要为这点工作量专门在硬件中做文章,L4就不一样了,L4中的数据量较大,用硬件计算校验和可以提高速度。
硬件计算校验和的时候在L2层,此时如果发现数据帧已经损坏,此时,设备驱动程序是可以直接丢弃该数据帧的,但是有些设备会把dev->ip_summed 设置成CHECKSUM_NONE(表示dev->csum 中的校验和无效),然后继续向上层传输,当上层接收到该数据包,经过计算校验和发现该包已经损坏,则丢弃数据包。为什么不直接在L2层就把数据包丢弃呢?其实这么做是可以的,只不过有些遇阻代庖的味道在里面,本来不是L2层能看的东西(L4层的数据),不仅看了,而且看了之后还要扔了,这就有些不太好了。所以有些实现就让L4层来丢弃这种损坏的数据包。