数据链路层和传输层

14
数据链路层为什么需要错误控制,而传输层已经提供了错误控制?这两种错误控制有什么区别?
6个回答

7

传输层数据可以被分解为许多数据链路层的帧/包。

因此,即使没有任何数据链路错误,传输层流/包也可能会损坏。 编辑:这是因为传输层路径通常由许多数据链路层跳(例如)组成:

Host1 <----> switch1 <----> switch2 <----> Host2

如果在switch1switch2之间丢失了一个数据包,那么在switch2Host2之间的连接上不会记录任何错误,但相应的传输层流将被损坏。
另一方面,一旦遇到数据链路错误,就可以在不浪费资源的情况下中断/重启传输层传输。

你能详细说明一下如何实现吗? 如果每个数据包都没有出错,整个消息怎么可能会出现错误? - matanc1
@Shookie,请查看编辑后的答案,其中有一个可能的场景来说明这一点。 - wroniasty
谢谢!但是你给出的例子与丢失数据包有关。我以为你是在暗示所有数据包都能到达目的地,但仍可能在经过数据链路层后变得损坏。 - matanc1
我的意思是 - 即使没有观察到数据链路错误,传输层数据也可能会损坏。因此,两个层面上的错误控制都是有用的。 - wroniasty

4
这是因为数据链路层专门处理比特级错误校正。它接收接收计算机已经拥有的数据包,并确定传输过程中是否出现错误以及数据是否完整或损坏。然而,还需要额外的控制措施来确保系统知道所有数据包是否到达,这称为端到端错误控制,由传输层负责。传输层并不关心有效载荷中的数据是好还是坏,这是数据链路层的工作。传输层只关心是否按照预期接收到每个数据包,以及它们是否按照正确顺序到达。传输层检测在数据链路层到达之前发生在传输端的数据包缺失或损坏。更多细节请参考:

http://books.google.ca/books?id=9c1FpB8qZ8UC&pg=PA216&lpg=PA216&dq=why+error+detection+and+correction+both+in+transport+and+link+layer+?&source=bl&ots=RI7-DU8RO0&sig=0U5Z9AmKkx3m3TA71WfIe1uTeW0&hl=en&sa=X&ei=LbqPUsahOtDEqQHyvIHQCw&ved=0CDUQ6AEwAQ#v=onepage&q=why%20error%20detection%20and%20correction%20both%20in%20transport%20and%20link%20layer%20%3F&f=false


1

这实际上取决于协议而不是层,但假设您指的是TCP...

TCP的错误检测很少,更多地设计为完整性检查,而不是任何可靠的错误检测。您在实践中看不到这一点的原因是数据链路层(如以太网、PPP、FrameRelay等)具有更强大的错误检测算法,因此TCP协议几乎没有传输错误需要检测。

如果您使用具有强大错误检测功能的不同传输层协议,则在较低级别上就不需要严格执行它。在尽可能低的堆栈中丢弃错误会带来好处,主要与性能和资源使用相关。

请注意,由于RAM故障等原因,错误可能会出现在传输层以上,因此如果数据真的非常重要,则应在应用程序中包含错误检查。


0

0
首先,端到端的数据包重传是一项昂贵的任务,可能需要很长时间。在每个链路上进行这些检查可以减少被重传的数据包所需的“长度”。考虑这样一种情况:在端到端路径上存在一个容易出错的链路。由于该链路不可靠,它可能会导致许多数据包丢失。如果没有任何链路层可靠性,那么只能通过传输层协议来处理重传。因此,畸形的数据包必须到达其目的地,发送NACK(或等效物),然后才能进行重传。另一方面,如果链路层具有内置的可靠性,则仅在不可靠的链路上立即重传数据包。
其次,链路层可靠性仅依赖于位检查,而传输层可靠性还利用了排序和确认。考虑这样一种情况:由于MTU太小,传递到网络层的段需要被分段。链路层可靠性仅检查每个单独片段的完整性。如果一个片段丢失了,链路层可能不会发出警报。另一方面,传输层会发出警报,因为它期望所有分段的数据包。

最后,链路层不仅在其有效载荷中承载TCP和其他传输层协议。因此,为那些没有内置可靠性的协议构建可靠性是合适的,以防止畸形的有效载荷上升到堆栈。


-1
在误差率较高的嘈杂信道中,例如无线网络,纠错是在数据链路层完成的。
在误差率较低的强健网络中,例如局域网,纠错是在传输层完成的,以最小化重传成本。

很少的数据链路协议进行任何错误纠正。大多数进行错误检测,如果有错误则丢弃任何帧,但它们不会纠正错误。 - Ron Maupin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接