为啥Internet协议: IP, ICMP, IGMP, UDP, TCP 收到有检验和错误的分组都仅作丢弃处理

当分组的checksum与接收方的计算结果不一致的时候,有三种处理方案:一是立即通知发送方重传;二是直接丢弃分组,等待发送方定时器超时后重传;三是尝试纠错,比如数据链路层中的CRC。但是,因为不一致的一般是有两种情况导致的:1)checksum部分出错,2)分组中其他字段出错。所以,接收方是无法是哪里出错,尤其是如果分组中出错的字段就是发送方的地址(比如IP分组中源地址字段错了),那么根本无法将重传请求回馈给发送方。所以处理方法就是直接丢弃分组等待超时重传。还有,为什么CRC只用在数据链路层呢?因为CRC需要的额外比特位还是比较多的,加上因为数据链路层已经有了检测能力高的CRC,传输的准确率已经得到保证,所以上层协议就没有必要再使用CRC了。
■网友
首先要思考的是,如果要恢复,你能怎么恢复?重新发一个包给发送者让他重发?那样是否和 ACK 的功能有重复?你可以再想一下,如果我们有这种要求目的主机重发包的协议机制,这会不会算一种攻击?你可以扩展一下,看一下 DNS 放大攻击和 ICMP 放大攻击。如果我用一个几十 B 的小包去让主机重发一个几百 B 的大数据包,会发生什么?
■网友
如果我没记错,这是RFC要求。
■网友
以IP为例,IP是connection-less and unreliable,它不需要保证通信质量,所以按照功能来说,它只传递即可,并且它也仅仅检查IP头而非整个packet。具体通信质量可以由上层协议来保证,比如TCP。对于上层协议来说,确实可以通过一定手段来修复错包,但是修复能力有限。没有具体研究过FEC等修复算法,但是印象中修复率不高而且计算量比较大。看应用场合,如果wifi可能需要,但ethernet就不太需要了。抛开修复算法,TCP这种reliable的协议可以通过timeout和ACK来保证数据完整性,并且有完整的flow control和congestion control,效率和效果应该都会比修复要高。个人理解,不一定正确,仅供参考。
■网友
实际原因参考 计算机网络 原因是有线网络传输数据时,数据完整的概率已经超过99.99%;检验算法的效率更加重要(ipv6中已经不再在ip层携带检验数据了,因为上层协议总是会进行检验),而要支持修复数据,检验码的数据量随着实际数据的长度而变大,会带来更大的开销。这两点使得修复数据带来的损耗远不如直接重传的收益好。其实如果你熟悉无线协议的话,你会发现无线协议中就支持数据修复,因为各种干扰使得错包大大增加,错误修复的收益远大于其带来的开销。


    推荐阅读