数据链路层和传输层提供的可靠传输问题
我们知道数据链路层和传输层都提供可靠传输服务,传输层是一定要提供的,比如TCP就是可靠传输协议,保证了端到端的可靠传输,确保每一个报文段都能按序送达对方,如果下层传输丢失,也能及时通过ARQ协议来重传,那么为什么会丢失呢,可能是因为网络层的路由器负载过高,导致后来的数据报被丢弃,那么传输层就需要重传了,因为有定时器的存在,一段时间没收到确认就重传,还有一种丢失的可能就是数据链路层检测数据帧传输出错,被丢弃了,因为我们知道数据链路层是提供节点到节点之间的可靠交付,那么这时候传输层的报文就没有正确传输到对方,也会重传。
所以传输层是保证传输无误的最高层次,任何下层导致的传输错误,传输层都要重传来处理,来达到让对方能正确接收数据的目的,传输层就是保证端到端的可靠传输,就是应用之间的通信可靠。
那么数据链路层提供的是什么呢,数据链路层也规定了可以提供可靠传输,但具体实不实现得按具体情况来分析,只是给出了这个框架说你可以这么去做,但具体实现得具体分析。
我们假设它是提供可靠传输的,而且是点对点的可靠传输,也就是两个网络节点,节点之间只有通信链路,没有其他节点。那么问题来了,它是为谁提供可靠传输的?是传输层吗,不对,传输层的报文都封装在IP数据报里,IP数据报又封装在数据链路层的数据帧里,那么链路层提供的可靠服务是为物理层来服务的,因为最终数据还是要经过物理层来传输,而物理层的传输过程中是可能出错的,比如噪声的影响导致比特传输错误,传输到对面的节点还原链路层数据帧,发现出错,这时候链路层的可靠传输就体现出来了,数据帧会通过一些手段对数据进行校验,来发现数据帧是否错误,如果错误,可以检错重发,向前纠错,反馈校验,检错丢弃等手段来保证两个节点之间传输的数据帧向上层提供的数据是无差错的。
这样就从底层的传输又加了一层保险,数据链路层的差错控制是一定要的,不然上层不知道是否传输错误,但数据链路层的可靠传输不只是差错控制,还可以通过可靠交付,比如传输层的滑动窗口协议等都是适用于链路层的,但并不是所有数据链路层的协议都需要设计成可靠交付的,支持可靠交付的链路层协议里多应用于高出错率的链路中,对于低出错率,例如光纤、双绞线链路等,采用可靠交付似乎没有必要,因此,通常有线链路的数据链路层协议,不提供可靠交付服务,但是差错控制是要有的。
说到这里,就有个大概的了解了,数据链路层是为物理层提供可靠服务的,因为物理层可能导致比特传输差错,数据链路层保证向上层提供的数据是无差错的;传输层是为网络层提供可靠传输服务的,因为数据报在核心网传输过程中,可能会在路由器那里因负载过高导致丢弃,然后传输层重传,来保证可靠传输,这样传输层能保证向上层(也就是应用层)提供的数据是无误且按序交付的。
如有问题,还请指正!