关于tcp/ip模型,既是链路层提供了crc校验,为什么还要在网络层帧和传输层数据包中再次提供校验

关于tcp/ip模型,既然链路层提供了crc校验,为什么还要在网络层帧和传输层数据包中再次提供校验?
据我从教材上看来,网络层的校验只针对网络层的头部,而传输层的校验针对传输层数据包,这两者是分别校验不同的部分,因此还可以理解。
于是,既然数据链路层提供了校验,那为什么网络层和传输层还需要校验呢?链路层的帧不就已经包含了网络层的帧,而网络层的帧不就已经包含传输层的数据包了吗?那应该只需要通过对链路层帧的校验就可以检测所有这三个层的所有错误了啊?
而且,如果像这样每一层都需要校验的话,岂不是应用层程序也需要进行校验?可是现在写程序的人恐怕没几个会对socket的数据还进行crc校验吧?
求事实,求真相!

------解决方案--------------------
引用:
据我从教材上看来,网络层的校验只针对网络层的头部,而传输层的校验针对传输层数据包,这两者是分别校验不同的部分,因此还可以理解。
于是,既然数据链路层提供了校验,那为什么网络层和传输层还需要校验呢?链路层的帧不就已经包含了网络层的帧,而网络层的帧不就已经包含传输层的数据包了吗?那应该只需要通过对链路层帧的校验就可以检测所有这三个层的所有错误了啊?
而且,如果像这样每一层都需要校验的话,岂不是应用……


如果说上层的一个包,在下层也对应一个包,那也许可以不用。
可是不是这样。上层一个包,可能会分割成下层多个包来传(比如 用只用一个包传大于下层的最大包长度的时候),后面再重组。

所以,回到你这里,下层校验没问题,对上层来说,可能不是整个包没问题,只是包的一部分没问题,所以上层也要自己的校验。


也不一定每一层都要校验,要看现有的校验是不是足够,是不是已有的校验是针对你的完整传输单位做的。


应用程序也有校验的,比如传输文件,除了网络若干层已有的校验最后,应用层 最后校验文件是不是传输完整。

- 千里孤行