深入理解网络传输协议——差错控制

2024-06-20 04:04

本文主要是介绍深入理解网络传输协议——差错控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 差错控制

差错控制(error control)包括对损坏、丢失以及重复的数据报进行检测的机制。差错控制还包括在检测到错误之后的纠错机制。因特网的网络层不提供真正意义上的差错控制机制。

从表面上看网络层好像是不需要差错控制的,因为每个数据报在到达终点之前都要穿过多个网络,而控制这些网络(局域网或广域网)行为的数据链路层已经使用了差错控制机制。换言之,既然在数据链路层已经实施了逐跳的差错控制,为什么网络层还需要差错控制呢?

虽然逐跳的差错控制在一定程度上能够起到保护数据报的作用,但是它的保护还不够彻底。下图描绘了在数据报途经的某些地方出现的一些差错没有能够检测出来。在路由器处理数据报时出现的差错,数据链路层是无法检测出来的。
在这里插入图片描述

网络层的设计者们希望让这一层的操作既简单又迅速。他们认为如果确实需要更为严格的差错检测,也可以交给调用了网络层服务的上层协议来完成。网络层之所以忽略差错检测的另一个理由与分片有关。由于数据很可能在某些路由器上被分片,因而使部分网络层的数据可能会被改变。如果我们要使用差错控制,就必须在每个路由器上检测是否有分片。这会使得网络层上的差错检测变得非常低效。

不过,网络层的设计者还是在数据报上增加了一个检验和字段,它可以控制在首部中出现的任何损坏,而不是针对整个数据报的。这个检验和可以在两跳之间或从一端到另一端之间防止出现在数据报首部中的任何变动或损坏。

例如,它可以防止因目的地址被损坏而将数据报交付到了一个错误的终点。但是,因为在每个路由器上这个首部都可能会有一些变化,所以在源点时需要计算这个检验和,而到了每个路由器上还需要重新计算一遍。我们还要提到的是,虽然因特网的网络层没有直接提供差错控制,但是因特网使用了另一个协议,ICMP。如果数据报被丢弃或者是首部中含有一些不可知的信息,那么ICMP就会提供某种程度的差错控制。

2. 流量控制

流量控制(flow control)用于调整源点发送的数据量以免接收方超载。如果源计算机的上层应用产生数据的速度比目的计算机上层应用吸收数据的速度快,则接收方就会被这些数据淹没。为了控制数据的流量,接收方需要向发送方发送某些反馈,以通知发送方自己被数据淹没了。

但是因特网的网络层并不直接提供任何流量控制。只要数据报准备好了,发送方就会将它们发送出去,而不会去管接收方是否准备好。

注意:在目前版本的因特网中,网络层不提供任何流量控制。

有以下几个理由可以被用来解释为什么在设计网络层时会缺少流量控制。首先,因为在这一层没有差错控制,接收方网络层的工作非常简单,以致很少会出现超载现象。其次,使用网络层服务的上层协议也可以部署一些缓存,只要网络层的数据准备好了就把它们接收下来,这样处理数据的速度就不一定要和接收数据的速度一样快了。第三,绝大多数使用网络层服务的上层协议都会提供流量控制,因此,如果再加一层流量控制会使网络层变得太复杂,并且会降低整个系统的效率。

3. 拥塞控制

网络层协议的另一个话题是拥塞控制(congestion control)。网络层的拥塞指的是这样一种状态,有过多的数据报出现在了因特网的某一个区域内。如果网络中的源计算机发送数据报的数量超过了网络或者路由器的容量,则有可能发生拥塞现象。在这种情况下,某些路由器可能会丢弃一些数据报。但是,数据报丢弃得越多,情况就可能变得越糟糕,原因在于上层的差错控制机制,发送方可能会重新发送这些被丢弃的分组的副本。如果拥塞持续下去,在某一时刻这种状况将会达到极点,此时系统崩溃,没有任何数据报能被交付。

3.1 无连接网络中的拥塞控制

在无连接网络中有多种方法可以控制拥塞的形成。其中一种方案称为信令。反向信令就是在运动方向与拥塞方向相反的数据报中设置一个比特,以通知发送方拥塞正在形成,发送方应当放慢发送分组的速度。在这种情况下,这个比特可以被设置在对一个分组的响应或者确认分组中。如果网络层没有使用反馈(确认),但是上层使用了反馈,那么就可以使用前向信令方式。它是在运动方向与拥塞方向一致的分组中设置一个比特,用于向该分组的接收方发出拥塞警告。然后,接收方就可以通知上层协议,再由上层协议来想办法通知源点。在因特网的网络层中既没有使用前向信令,也没有使用反向信令。

无连接网络的拥塞控制还可以通过一个扼流分组(choke packet)来实现,它是在遇到拥塞时由路由器向发送方发送的一个特殊的分组。事实上这正是因特网的网络层所实施的拥塞控制机制。因特网的网络层使用了一个辅助协议,称为ICMP。当一个路由器拥塞了,它就会向源点发送一个ICMP分组使其放慢速度。

另一种改善拥塞的方法是将分组按其在整个报文中的重要程度划分等级。例如,可以利用分组首部中的一个字段来定义这个数据报的地位是比较重要的,还是不重要的。当一个路由器拥塞并且需要丢弃一些分组时,标记为不重要的分组将被丢弃。例如,如果有一个报文的内容是一张图片,它可能会被分割为多个分组,那么表示图片边边角角的那些分组的重要性就比不过图片中心位置的分组。如果路由器拥塞了,就会丢弃不重要的分组,同时也不会严重影响整个图片的质量。

3.2 面向连接网络中的拥塞控制

有时候面向连接网络中的拥塞控制要比无连接网络中的拥塞控制更简单。一个最简单的方法就是当某区域发生拥塞后就建立一条额外的虚电路。然而,这样做可能会给某些路由器带来更多的问题。一种更好的解决方法是在建链阶段就进行提前协商。发送方和接收方可以在建立虚电路之时对通信量的级别达成一致意见。这个通信量级别可以由允许建立该虚电路的路由器来指定。换言之,路由器先要检查现有的通信量,并与自己的最大通信相比较,然后才允许建立新的虚电路。

3.3 服务质量

随着因特网允许像多媒体通信(特别是音频和视频的实时通信)这样的新应用程序加入进来,通信的服务质量(quality of service,QoS)也变得越来越重要。因特网正全力以赴地提供更好的服务质量以支持此类应用。但是,为了使网络层保持原封不动,对此类应用的支持大多是在上层实现的。由于在使用多媒体通信时会更显得QoS很重要。

网络层的一个非常重要的话题就是路由选择(routing),也就是路由器如何建立自己的路由表,以便在无连接网络中帮助数据报的转发,或者在面向连接网络的建链阶段,帮助建立一条虚电路。这个任务是由路由选择协议完成的,它帮助主机和路由器建立自己的路由表,并维护和更新这些路由表。这是一些独立的协议,它们有时会使用网络层的服务,而有时则使用某些运输层协议的服务,以助网络层一臂之力。路由选择协议可以划分为两大类:单播的和多播的。

3.4 安全性

另一个与网络层的通信有关的话题是安全性。在最初设计因特网时并没有考虑到安全性问题,因为它只是被高等院校中的少数用户用来进行研究活动的,其他人根本无法访问因特网。网络层在设计时不提供对安全性的支持。但是时至今日,安全性已经成了人们重点关注的问题。为了在无连接的网络层提供安全性,需要用另外一些虚拟层来把无连接的服务转变为面向连接的服务。

这篇关于深入理解网络传输协议——差错控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077042

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines