Loading... 转载:[数据链路层和传输层可靠传输的超级困惑](https://blog.csdn.net/ch717828/article/details/47021865) [数据链路层和运输层的流量控制及差错控制](https://blog.csdn.net/u013657981/article/details/46481295?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control) ## 1、问题 > 传输层协议UDP,书上说不必事先建立连接,是无连接的不可靠的协议,只是尽最大努力交付,但UDP仅是传输层协议,下面还有数据链路层协议啊,该层中有超时重传,差错重传的ARQ协议,这样,原始的数据帧就能可靠通信了,上层数据也是通过下层数据表现的,不同样也能保证可靠通信吗?为什么说UDP是不可靠的? > 如果有数据链路层的差错重传和超时重传,还要TCP的的重传机制干嘛? > 数据链路层和传输层的TCP都有滑动窗口,这不重复了吗? ## 2、解答 ### 2.1 大家还要考虑3层的问题即IP协议层。TCP/IP不光是解决相同网络(2层以内)的互联还要解决异构网络的互联.比如一个以太网络的数据帧能传输的数据包的大小能和X.25或者其他的传输网络的数据帧一样大吗?这样,出在**第3、4层的网络协议必将有个进行拆包组包的过程**,或者一些对应用**流量控制**的机制。如果没有机制保障这种传输的可靠性,那数据链路层就是一直传下去对应用来说也是垃圾数据。因为在传输的过程中,特别到了不同网络接口转换处,协议转换时不能保障IP包在拆包组包时的准确不丢失(为什么路由器数据传输率一般是安装xx包/s算的而第二层设备可以使用xxx/bps) 比方运输沙子一样.可以这样比喻搬运工只是解决了他的本质任务在他的搬运范围不丢一粒沙子。但是我没办法控制他搬运到某个**中转站不丢沙子**,因为在中转站不是搬运工能控制的范围(即数据链路层,点到点的传输)。而中转站靠什么来控制他的时间和效率以及不丢失沙子呢?那就要**对中转站施加控制机制保障**他在重新包装后不丢沙子以及按照我的要求时间到达不行重新要求搬运工重搬(传输层协议)。UDP就是中转站因为忙或者其他原因可以随便丢失某包沙子,然而运输工是没办法丢失一粒沙子的了。 为了解释清楚还有一个实际的例子就是:比如一个用户的一个数据大小是1MB在传输过程中(从中国某公司到英国某公司)。如果使用TCP协议他会把1MB的数据拆成N份,编号为0-(N-1)。根据IP协议在网络中发送可能一部分`从北京的出口-to-美国-to--瑞典--to--英国某公司`,另外有一部分从`广州--to-美国--荷兰--英国`。如果数据都顺利到达了英国某公司,TCP协议必将这些顺序有可能在不同类型网络中传输过后以及序号打乱的IP包按0-(N-1)的序列编排,再组织进行TCP层的校验,完成1MB数据的传输。**数据链路层只是解决一段一段路程之间的可靠传输,它不能保障在北京或这在广州因为路由器忙或者其他原因导致其中的一个或者某个数据包丢失**;**同时也不能保证所有的数据包到达后的重新编排组合问题**;**也不能保证如果其中某些数据包丢失以后如何通知发送方重新发送等一系列问题**。UDP协议是这样如果丢失了一个数据包这1MB的数据就作废。也不会通知发生方重新发送这就是有时E-mail不能收到其中可能的原因。 专业一点的讲就楼上某位高手说的:**数据链路层是解决: 点到点的传输问题;传输层是解决:端到端的传输问题** ### 2.2 数据链路层的差错控制和运输层的可靠传输有什么区别 #### 【1】从“干什么”的角度来讲 - 数据链路层负责**结点**之间链路的事情。把有比特查错的物理信道变成**无比特差错**的数据链路。 - 运输层负责**应用进程**之间端到端的事情。就两项任务:差错管理+业务复用。 #### 【2】从“服务”的角度来讲 - **数据链路层**将**网络层**来的数据可靠地传输到相邻结点的目标机**网络层**。 - **传输层**为**应用进程**提供可靠的,无误的数据传输,屏蔽下面网络核心的细节。 #### 【3】从“怎么干”的角度来讲 - 数据链路层主要靠三大法宝: 封装成帧; 透明传输:帧中可以有控制字; 差错检测:CRC循环冗余检验; - 运输层(实际上就是TCP协议)主要靠: 面向连接的服务。 停止等待、后退N帧、滑动窗口。 #### 【4】从“干到什么程度”的角度来讲 - 数据链路层可以做到:**无比特错误** - “*无差错接收*”:“凡是接收端数据链路层接受的帧均无差错”; - 不保证**可靠传输**:只考虑“帧错误”,不考虑“帧丢失”,“帧重复”和“帧失序”。 - 现在的数据链路层协议:对通信质量良好的有线信道:不采用确认重传,对通信质量不好的无线信道:确认重传 - PPP协议没有确认重传机制。 - TCP协议是可靠传输的最后一道屏障,必须真正做到**可靠传输**。 “可靠传输”:帧错误、帧丢失、帧重复、帧失序。 IP是“尽最大努力交付”,不可靠传输,所以TCP要采用确认重传机制,就是停止等待、后退N帧和滑动窗口。 Last modification:January 19th, 2021 at 01:03 pm © 允许规范转载
One comment
非常详细,牛的博主!