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

3x3只眼 2010-10-24 05:40:08
据我从教材上看来,网络层的校验只针对网络层的头部,而传输层的校验针对传输层数据包,这两者是分别校验不同的部分,因此还可以理解。
于是,既然数据链路层提供了校验,那为什么网络层和传输层还需要校验呢?链路层的帧不就已经包含了网络层的帧,而网络层的帧不就已经包含传输层的数据包了吗?那应该只需要通过对链路层帧的校验就可以检测所有这三个层的所有错误了啊?
而且,如果像这样每一层都需要校验的话,岂不是应用层程序也需要进行校验?可是现在写程序的人恐怕没几个会对socket的数据还进行crc校验吧?
求事实,求真相!
...全文
2004 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwd_125 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanghehong 的回复:]
再补充一点,不同层次的校验覆盖的范围也不一样。
链路层的校验只能保证 一条链路的两个节点之间 这部分的完整正确性。
传输层的校验可以保证 从一个节点,经过千山万水,很多条链路,到达最终节点的完整性。


还有,即使从一个节点,到最后目标节点是完整的,对应用来说,也可能是不够充分的,比如下图所示:

应用进程 --》 TCP协议栈 ---)网络 ----》 TCP 协议栈 ---》 目……
[/Quote]

这个解释比较好
3x3只眼 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yanghehong 的回复:]
再补充一点,不同层次的校验覆盖的范围也不一样。
链路层的校验只能保证 一条链路的两个节点之间 这部分的完整正确性。
传输层的校验可以保证 从一个节点,经过千山万水,很多条链路,到达最终节点的完整性。


还有,即使从一个节点,到最后目标节点是完整的,对应用来说,也可能是不够充分的,比如下图所示:

应用进程 --》 TCP协议栈 ---)网络 ----》 TCP 协议栈 ---》 目……
[/Quote]

虽然开始有点明白你的观点,但是仍有点疑虑。。。不过暂且这样认为吧,多次校验是为了冗余校验更加安全。。。感谢回答,散分走人~_~
yanghehong 2010-11-03
  • 打赏
  • 举报
回复 1
再补充一点,不同层次的校验覆盖的范围也不一样。
链路层的校验只能保证 一条链路的两个节点之间 这部分的完整正确性。
传输层的校验可以保证 从一个节点,经过千山万水,很多条链路,到达最终节点的完整性。


还有,即使从一个节点,到最后目标节点是完整的,对应用来说,也可能是不够充分的,比如下图所示:

应用进程 --》 TCP协议栈 ---)网络 ----》 TCP 协议栈 ---》 目标应用进程。

应用进程与TCP协议栈之间也可能出现错误。这个,TCP的校验显然就没办法覆盖到。

还有TCP层没有把数据发送出去的情况等等。这也是为什么,对可靠性要求高的应用,在TCP传输可靠性的基础上,还要自己实现一小协议来保证可靠性。


- 千里孤行
yanghehong 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cppfile 的回复:]

挺奇怪的,yanghehong在这个帖子里面的回复怎么和以前的不一样呢?

http://topic.csdn.net/u/20090309/16/5AA71065-994B-4C7D-BA55-5D8F5E8E4FCC.html

我也在找楼主这个问题的答案
[/Quote]

怎么不一样呢?
TCP/IP层 在 GPRS层之上。所以TCP的校验就可以保证你传输的完整正确性了。


CppFile 2010-11-03
  • 打赏
  • 举报
回复
挺奇怪的,yanghehong在这个帖子里面的回复怎么和以前的不一样呢?

http://topic.csdn.net/u/20090309/16/5AA71065-994B-4C7D-BA55-5D8F5E8E4FCC.html

我也在找楼主这个问题的答案
3x3只眼 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yanghehong 的回复:]
引用楼主 nerv3x3 的回复:
据我从教材上看来,网络层的校验只针对网络层的头部,而传输层的校验针对传输层数据包,这两者是分别校验不同的部分,因此还可以理解。
于是,既然数据链路层提供了校验,那为什么网络层和传输层还需要校验呢?链路层的帧不就已经包含了网络层的帧,而网络层的帧不就已经包含传输层的数据包了吗?那应该只需要通过对链路层帧的校验就可以检测所有这三个层的所有错误了啊?
而且,如果……
[/Quote]

还是有点疑问:无论是网络层的分片,还是传输层的分组,都应该有类似于序号的机制确认每一个分片或分组都会收到,既然如此那为什么还需要整体的校验?如果说只是多此一举以防万一还可以理解。
yanghehong 2010-10-24
  • 打赏
  • 举报
回复 1
[Quote=引用楼主 nerv3x3 的回复:]
据我从教材上看来,网络层的校验只针对网络层的头部,而传输层的校验针对传输层数据包,这两者是分别校验不同的部分,因此还可以理解。
于是,既然数据链路层提供了校验,那为什么网络层和传输层还需要校验呢?链路层的帧不就已经包含了网络层的帧,而网络层的帧不就已经包含传输层的数据包了吗?那应该只需要通过对链路层帧的校验就可以检测所有这三个层的所有错误了啊?
而且,如果像这样每一层都需要校验的话,岂不是应用……
[/Quote]

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

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


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


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

- 千里孤行


4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧