草庐IT

1.3 三种交换方式:电路交换、分组交换、报文交换

「已注销」 2023-04-20 原文

三种交换方式:电路交换、分组交换、报文交换


  • 我们首先来看电路交换,在电话问世后不久,人们就发现要让所有的电话机都两两相连接,是不现实的。

  • 例如,两部电话只需要用一对电线就能够互相连接起来,但若有5部电话要两两相连,则需要10对电线,当电话机的数量很大时,这种连接方法需要的电线数量就太大了。

  • 例如,如果有 n 部电话机需要两两相连,那么一共需 要 多 少 对 电 线 要多少对电线 线呢?

    • 答 案 是 : n ( n − 1 ) 2 答案是:\frac{n(n-1)}{2} 2n(n1)

  • 于是人们认识到,要使得每一部电话能够很方便的和另一部电话进行通信,就应当使用一个中间设备,将这些电话连接起来,这个中间设备就是电话交换机。每一部电话都连接到电话交换机上,可以把电话交换机,简单的看成是一个,有多个开关的开关器,可以将需要通信的任意两部电话的电话线路,按需接通,从而大大减少了连接的电话线数量。
  • 当电话机的数量增多时,就需要使用,很多彼此连接起来的电话交换机,来完成全网的交换任务,用这样的方法,就构成了覆盖全世界的电信网。电话交换机接通电话线的方式,称为电路交换
  • 从通信资源的分配角度来看,交换就是按照某种方式,动态的分配传输线路的资源,我们来看下面这个电路交换的示意图。


  • 为了简单起见,图中没有区分市话交换机和长途电话交换机。

  • 应当注意的是,用户线归电话用户专用,而电话交换机之间拥有的大量化路的中继线则是许多用户共享的。

  • 电路交换有以下三个步骤:

    1. 第一步是建立连接:也就是分配通信资源。

      • 例如,在使用电路交换打电话之前,必须先拨号请求建立连接。当被叫用户,听到电话交换机送来的拨号音并摘机后,从主叫端到被叫端就建立了一条连接,也就是一条专用的物理通路。这条连接保证了双方通话时所需的通信资源,而这些资源在双方通信时不会被其它用户占用。
    2. 第二步是通话:也就是主叫和被叫双方互相通电话。在整个通话期间,第一步建立连接所分配的通信资源始终被占用。

    3. 第三步是释放连接:也就是通话完毕挂机后,电话交换机释放刚才使用的这条专用的物理通路,换句话说,是把刚才占用的所有通信资源归还给电信网。

  • 请大家思考一下,如果使用电路交换来传送计算机数据是否可行?

    • 应该说,尽管采用电路交换可以实现计算机之间的数据传送,但是线路的传输效率往往很低。这是因为计算机数据是突发式的出现在传输线路上的,试想一下这种情况。当用户正在输入和编辑一份带传输的文件时,用户所占用的通信资源暂时未被利用,该通信资源也不能被其他用户利用,宝贵的通信线路资源白白被浪费了。因此,计算机网络通常采用分组交换,而不是电路交换。

  • 假设图中的拓扑是因特网的一部分,在因特网中,最重要的分组交换机就是路由器。它负责将各种网络互联起来,并对接收到的分组进行转发,也就是进行分组交换。

  • 我们来看这样一个例子:假设主机 H6的用户要给主机H2的用户发送一条消息,通常我们把表示该消息的整块数据称为一个“报文”。

  • 在发送报文之前,先把较长的报文划分成为一个个更小的等长数据段。

  • 在每一个数据段前面,加上一些由必要的控制信息组成的首部后,就构成了一个分组,也可简称为“包”,相应地,首部也可称为“包头”。

  • 请大家思考一下,添加首部的作用是什么?这不是额外加大了待传输的数据量吗?

    • 实际上,首部其着非常关键的作用。相信大家至少能想到,首部中肯定包含了分组的目的地址,否则分组传输路径中的各分组交换机也就是各路由器,就不知道如何转发分组了。
    • 分组交换机收到一个分组后,先将分组暂时存储下来,再检查其首部,按照首部中的目的地址进行查表转发,找到合适的转发接口,通过该接口将分组转发给下一个分组交换机。

  • 在本例中,主机 H6 将所构造出的各分组依次发送出去,各分组经过图中各分组交换机的存储转发,最终到达主机 H2。

  • 主机 H2 收到这些分组后去掉他们的首部,将各数据段组合还原出原始报文。

  • 需要说明的是,为了初学者容易理解,在本例中我们只演示出了分组传输过程中的两种情况:

    • 一种是各分组从源站到达目的站可以走不同的路径(也就是不同的路由);
    • 另一种是分组乱序,也就是分组到达目的站的顺序不一定与分组在源站的发送顺序相同;
  • 对于可能出现的分组丢失、误码、重复等问题并没有演示,这些内容将在今后的课程中详细介绍。

  • 在上述的分组交换过程中,发送方所要完成的任务是构造分组和发送分组,路由器(也就是分组交换机)所要完成的任务是缓存分组和转发分组,简称为“存储转发”,接收方所要完成的任务是接收分组和还原报文。
  • 与分组交换类似,报文交换中的交换节点也采用存储转发方式。但报文交换对报文的大小没有限制,这就要求交换节点需要有较大的缓存空间。
  • 需要注意的是,报文交换主要用于早期的电报通信网,现在较少使用,通常被较先进的分组交换方式所取代。因此,我们不再详细介绍报文交换了。

  • 接下来我们对电路交换,报文交换,分组交换这三种交换方式进行一下对比。

  • 假设 A B C D 是分组传输路径上所要经过的四个节点交换机,纵坐标为时间。

    1. 电路交换

      • 对于电路交换,通信之前首先要建立连接;
      • 连接建立好之后,就可以使用已建立好的连接进行数据传送;
      • 数据传送结束后,需要释放连接,以归还之前建立连接所占用的通信线路资源;
      • 当使用电路交换时,一旦建立连接,中间的各节点交换机就是直通形式的,比特流可以直达终点;
    2. 报文交换

      • 对于报文交换,可以随时发送报文,而不需要事先建立连接;
      • 整个报文先传送到相邻节点交换机,全部存储下来后进行查表转发,转发到下一个节点交换机。
      • 当使用报文交换时,整个报文需要在各节点交换机上进行存储转发,由于不限制报文的大小,因此需要各节点交换机,都具有较大的缓存空间。
    3. 分组交换

      • 对于分组交换,可以随时发送分组,而不需要事先建立连接。
      • 构成原始报文的一个个分组,依次在各节点交换机上存储转发。
      • 各节点交换机在发送分组的同时,缓存接收到的分组。
      • 当使用分组交换时,构成原始报文的一个个分组,在各节点交换机上进行存储转发,相比报文交换,减少了转发时延,还可以避免过长的报文长时间占用链路,同时也有利于进行差错控制。

  • 最后我们总结一下,这三种交换方式各自的优缺点。

  • 电路交换的优点如下:

    • 第一,通信时延小;

      • 这是因为通信线路为通信双方用户专用,数据直达,因此通信时延(时间延迟)非常小。当连续传输大量数据时,这一优点非常明显。
    • 第二,有序传输;

      • 这是因为通信双方之间只有一条专用的通信线路,数据只在这一条线路上传输,因此不存在失序问题。
    • 第三,没有冲突。

      • 不同的通信双方拥有不同的信道,不会出现争用物理信道的问题。
    • 第四,使用范围广;

      • 电路交换既适用于传输模拟信号,也适用于传输数字信号。
    • 第五,实时性强;

      • 这主要得益于其通信时延小的优点。
    • 第六,控制简单;

      • 电路交换的节点交换机及其控制都比较简单。
  • 电路交换的缺点如下:

    • 第一,建立连接时间长;

      • 电路交换的平均连接建立时间,对计算机通信来说太长了。
    • 第二,线路独占,使用效率低;

      • 电路交换一旦建立连接,物理通路就被通信双方独占,即使通信线路空闲,也不能供其他用户使用,因而信道利用率很低。
    • 第三,灵活性差;

      • 只要连接所建立的物理通路中的任何一点出现了故障,就必须重新拨号建立新的连接,这对十分紧急和重要的通信是很不利的。
    • 第四,难以规格化;

      • 电路交换时,数据直达不同类型、不同规格、不同速率的终端很难相互进行通信,也难以在通信过程中进行差错控制。

  • 报文交换的优点如下:

    • 第一,无需建立连接;

      • 报文交换不需要为通信双方预先建立一条专用的通信线路,不存在建立连接的时延,用户可以随时发送报文。
    • 第二,动态分配线路;

      • 当发送方把报文传送给节点交换机时,节点交换机先存储整个报文,然后选择一条合适的空闲线路,将报文发送出去。
    • 第三,提高线路可靠性;

      • 如果某条传输路径发生故障,会重新选择另一条路径传输数据,因此提高了传输的可靠性。
    • 第四,提高线路利用率;

      • 通信双方不是固定占用一条通信线路,而是在不同的时间分段部分占用物理线路,因而大大提高了通信线路的利用率。
    • 第五,提供多目标服务;

      • 一个报文可以同时发送给多个目的地址,这在电路交换中是很难实现的。
  • 报文交换的缺点如下:

    • 第一,引其了转发时延;

      • 这是因为报文在节点交换机上,要经历存储转发的过程。
    • 第二,需要较大的存储缓存空间;

      • 这是因为报文交换对报文的大小没有限制。
    • 第三,需要传输额外的信息量;

      • 这是因为报文需要携带目标地址、源地址等信息。

  • 分组交换的优点如下:

    • 第一,无需建立连接;

      • 分组交换不需要为通信双方预先建立一条专用的通信线路,不存在建立连接的时延,用户可以随时发送分组。
    • 第二,线路利用率高;

      • 通信双方不是固定占用一条通信线路,而是在不同的时间分段部分占用物理线路,因而大大提高了通信线路的利用率。
    • 第三,简化了存储管理;

      • 这是相对于报文交换而言的。因为分组的长度固定,相应的缓冲区的大小也固定,管理其来相对容易。
    • 第四,加速传输;

      • 由于分组是逐个传输的,这就使得后一个分组的存储操作与前一个分组的转发操作可以同时进行。
    • 第五,减少出错概率和重发数据量;

      • 因为分组比报文小,因此出错概率必然减小,即便分组出错,也只需重传出错的部分(分组),这比重传整个报文的数据量小很多,这样不仅提高了可靠性,也减少了传输时延。
  • 分组交换的缺点如下:

    • 第一,引其了转发时延;

      • 这是因为分组在节点交换机上要经历存储转发的过程。
    • 第二,需要传输额外的信息量;

将原始报文分割成等长的数据块,每个数据块都要加上源地址、目的地址等控制信息,从而构成分组。因此使得传送的信息量增大了。

  • 第三,当分组交换采用数据报服务时,可能会出现失去、丢失或重复分组;

    • 分组到达目的节点时,需要重新还原成原始报文,比较麻烦;若分组交换采用虚电路服务,虽然没有分组失序问题,但有呼叫建立、数据传输和虚电路释放三个过程。

  • 在本节课中,我们介绍了电路交换、分组交换以及报文交换这三种交换方式。其中分组交换是重点内容,希望大家能很好的掌握他的特点。

有关1.3 三种交换方式:电路交换、分组交换、报文交换的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  8. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  9. ruby - 如何更优雅地记下这三种情况? - 2

    是否可以让这段代码更紧凑?我在这里错过了什么吗?ifvaluemax_ratemax_rateelsevalueend 最佳答案 这里有一些完全不同的东西:[min_rate,value,max_rate].sort[1] 关于ruby-如何更优雅地记下这三种情况?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13309740/

  10. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

随机推荐