为什么我们需要在Transport和Data Link层中使用滑动窗口机制? TCP有自己的滑动窗口机制来管理流量和错误。此外,数据链路层具有类似的机制。这不是多余的吗?
答案 0 :(得分:1)
TCP和UDP的错误控制是覆盖每个数据包的单个校验和。如果失败,则必须丢弃整个数据包,然后,当接收在超时后未能确认收到数据时,必须重新发送数据。即使在网络路径上的两个路由器之间的一个数据链路上引入了数据损坏,也必须从原始发送方重新发送数据,并使整个行程再次跨越多个网络跃点。这是非常昂贵的,因此当错误率非常低并且重传的成本在许多成功传输的分组上分摊时,这种数据完整性检查是合适的。此外,简单的校验和不是那么强大,它会遗漏一些错误。
某些类型的网络链路可能会出现错误率过高而IP传输协议无法有效处理,因此它们应提供自己的错误检测层(甚至是前向纠错)以便知识产权对他们有效。最初,众所周知,(模拟)调制解调器已经引入了这种完整性保护(例如V.42),因为它们的速度越来越高。我对现在流行的各种物理链接的细节知之甚少,但我认为DOCSIS,ADSL,wifi和/或3G /中的一个或多个是个好消息。 4G / LTE采用了这种技术。我还要注意,我认为所有这一切都发生在物理层(第1层),而不是在数据链路层(第2层),尽管可能存在争议,因为OSI层模型永远不适合于真实的网络世界。
这种错误控制并不一定意味着物理层(或数据链接层,如果您愿意)具有任何类型的滑动窗口。它可能在一些为最不可靠的物理链路设计的更复杂的方案中,但所有最简单的错误检查方式都没有:例如,PPP和以太网FCS。使用FCS,就像使用UDP校验和一样,只会丢弃损坏的数据包,并且协议没有内存或窗口可以从中重新发送失败的帧,并且它不会向发送方确认成功接收的帧(这是在任何类型的滑动窗口协议中都需要推进窗口。)
尽管如此,传输层错误控制机制仍然是必不可少的,因为它是end to end。只有在该层才能捕获除传输介质引入的错误之外的错误。 IP传输协议的校验和将捕获路由器内部发生的损坏,由不能或不能捕获错误的物理介质引入的错误,或主机设备或设备驱动程序中的错误。
这是用于错误控制的。关于流量控制可以说一些相同的内容:虽然可以存在一些复杂的方案来处理各种物理链路,否则这些物理链路对IP来说是有问题的,大多数是简单的方案,不涉及任何类型的滑动窗口。例如,当通过RS-232串行链路进行通信时,流控制是一个简单的二进制控制线:当它被断言时,另一端发送数据,当它被解除断言时,另一端暂停。它不记得以前在窗口中传输的任何数据,也不会收到确认。
最后一条评论:UDP是一种不可靠的传输协议。使用UDP时,应用程序负责管理超时和重新传输。各个应用程序处理它的程度有很多变化。有些相当糟糕。由于(前向)纠错至少由一些最臭名昭着的不可靠的物理链路层提供,所以至少情况是可容忍的,尽管UDP不可靠,但“通常”起作用。关于一些非TCP,非UDP传输协议也可以这样说。