计算机网络基础 (一)--- 计算机网络概览篇
文章内容概览
了解计算机网络及其分类
什么是计算机网络
计算机网络主要由一些通用的、可编程的硬件互联而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用
计算机网络不仅仅是软件的概念,它还包含硬件设备(网卡、网线、路由器)
计算机网络不仅仅是信息通信,还可以支持广泛的应用
计算机网络的分类
1、按照网络作用的范围,可以将计算机网络分为
广域网(WAN)
城域网(MAN)
局域网(LAN)
2、按照网络作用的使用者,可以将计算机网络分为
公用网络(所有愿意付费、或者愿意加入的,都可以加入的网络)
专用网络(某些部门,或者某些人,为了满足特殊的业务需求,而建立起来的网络。如:军队、铁路局、银行、公司,他们都有自己的专用网络)
计算机网络发展简史
互联网的发展历史
互联网的发展历史有三个阶段:
第一阶段:单个网络ARPANET
这个阶段主要是一些计算机通过交换机进行连接,这个时候计算机通过连接交换机,就可以直接完成信息的交换,并且连接的计算机不多
第二阶段:三级结构互联网
这个阶段主要连接的是全美国主要的一些学校、研究所、实验室等拥有计算机的地方
第三阶段:多层次ISP互联网
ISP(Internet Service Provider):网络服务提供商(中国电信、中国联通、中国移动都是中国著名的网络服务提供商)
顶级的是主干ISP,这里边就包含了上边提到的三大网络服务提供商。中国的主干ISP可以连接美国、澳洲、欧洲的主干ISP。主干ISP下边是地区ISP,比如说移动网络在中国叫中国移动,在北京叫北京移动、在上海叫上海移动,这个就属于地区ISP,地区ISP主要就是负责地区的网络服务的提供
可以通过这个网站看到国际互联网的线路:https://live.infrapedia.com
中国互联网的发展简史
中国互联网的发展也可以分为三个阶段:
随着中国互联网的发展,中国也建立了多个公用的计算机网络,可以进行国际的信息交换,其中有五个公用计算机网络是规模最大的
中国电信互联网(CHINANET)
中国联通互联网(UNINET)
中国移动互联网(CMNET)
中国教育与科研计算机网(CERNET)
中国科学技术网(CSTNET)
我们出国的流量,主要也是通过这五个网络来进行国外的信息访问的。除了国家科研技术的参与,民间企业也对互联网贡献很大,其中就包含知名的企业家
1996年,张朝阳创建搜狐
1997年,丁磊创建网易
1998年,王志东创建新浪
1998年,马化腾,张志东创建腾讯
1999年,马云创建阿里巴巴
2000年,李彦宏创建百度
这些事迹也是推动了中国互联网的发展
计算机网络的层次结构
层次结构设计的基本原则
在了解计算机层次结构设计的基本原则之前,先了解一下,为什么计算机网络需要使用层次结构的设计
假设有A、B两台计算机,他们通过计算机网络进行连接。可以想象一下计算机网络在这里边主要是解决了什么问题
保证数据通路顺畅
识别目的计算机
目的计算机状态
数据是否错误
计算机网络需要解决的问题是繁多而复杂的,因此计算机网络就采用了分层去实现不同的功能
看一个关于现代我们使用网络的一个层次结构的例子
层次结构设计的基本原则
各层之间是相互独立的:某一层并不需要知道它的上、下层是怎么实现的,它仅仅需要知道,该层是怎样通过接口来进行服务的提供的。层与层之间耦合度是很低的
每一层有足够的灵活性:因为计算机网络是不断发展的,因此设计每一层的时候就要求有足够的灵活性,使得每一层可以应对未来的一些变化
各层之间完全解耦:也就是某一层的上下层发生变化,不影响当前层的稳定(虽然这是计算机层次设计的原则,其实如果我们在设计一个比较庞大的系统的时候,完全可以借鉴这些原则,这就是计算机底层的魅力吧)
OSI七层模型
计算机网络有七层模型,这个模型是由国际标准所定义的
OSI七层模型在制定的时候,是想成为全球计算机都遵循的标准,然后促进全球的计算机都可以沿用这个标准来方便的进行互联以及交换数据。而实际上,OSI在市场化过程中困难重重,因为在OSI制定标准出来的时候,TCP/IP模型在全球范围内成功的运行了。因此OSI七层模型,只是获得了理论层面的研究成果,但是在市场化方面却没有成功的推进。所以,OSI最终并没有成为广为使用的标准模型
OSI没有被市场所接受的几个原因
OSI的专家缺乏实际经验(他们是基于理论进行设计的,缺乏实际生产环境的经验。知行合一,理论一定要结合实践)
OSI标准制定周期过长,按OSI标准生产的设备无法及时进入市场
OSI模型设计的并不合理一些功能在多层中重复出现
TCP/IP四层模型
下边是OSI七层模型和TCP/IP四层模型的映射:
说明:右侧为TCP/IP四层模型中,每一层所使用到的一些协议
TCP/IP四层模型的实际应用
假设计算机A和B通过一个路由器连接起来了,计算机A会通过TCP/IP的四层和路由器进行通信,计算机A的数据会通过网络接口层、网络层来到路由器(在路由器中,到达的层面只有网络层和网络接口层)。路由器会将数据通过路由转发,转发给计算机B,计算机B通过由下到上的四层来接收数据。这个就是TCP/IP四层模型在进行收发数据的示例
除此之外,还可以通过分层的方法去理解不同的层面
现代互联网的网络拓扑
了解网络拓扑可以帮助我们在脑海中形成一个形象的计算机网络,是有助于我们往下学习的。对于现代互联网的网络拓扑主要分为两个部分
边缘部分
核心部分
边缘部分
主要指的的是平时的用户可以直接接触的部分,比如说在家、在公司或者在商场所使用的网络,都是属于计算机网络的边缘部分(家里的手机、电脑、智能家电,通过有线或无线的方式连接路由器,路由器连接一个当地的网关,然后网关连接到地区的ISP)
上边是一个家庭连网的一个网络拓扑,下边看一个企业的网络拓扑
核心部分
核心部分主要是由地区ISP、主干IS以及一些国际的路由器所组成
这些主干ISP相互连接,并且通过国际路由器来与其它国家和地区的主干ISP进行连接,这些就属于互联网的核心部分。这其中有很多的海底电缆、跨地区电缆等通信设备,他们主要是由中国联通、中国电信进行铺设,他们所使用的一些设备是来自中国的华为,所以说华为在通信领域是有一定的地位的
上边是网络拓扑的核心部分和边缘部分的简单图例,如果将核心部分和边缘部分连接起来的话,整个网络拓扑是非常复杂的
虽然说在学习计算机网络的时候,需要对网络拓扑有一定的了解,但是我们在平时使用网络的时候,并不会感知到这些网络拓扑的存在。我们不会知道主干ISP在哪里、也不会知道地区ISP在哪里,甚至不知道网关在哪里,我们最多可以知道的是接触较多的路由器,这个主要是因为平时我们更多是从一个用户的角度去使用计算机网络的。如果我们站在用户的角度去看互联网的话,更多的是一些模式,比如客户-服务器(C/S)模式
对于客户-服务器(C/S)模式,在互联网中,有很多的设备通过互联网进行连接,但是我们不需要感知互联网里边的细节。如果我们要使用某一个服务时,直接从自己的PC发起请求,那么这个请求就会通过路由来到服务提供的地方,服务器收到请求之后,就会响应,本地的PC会收到应答,这个就是客户-服务器(C/S)模式。在客户寻求服务的时候,以及服务器端在提供服务的时候,都不需要感知网络里边的具体细节
计算机网络的性能指标
了解网络的性能指标,有助于评估或判断网络的质量或者速度。在了解之前,先对常用的丈量单位进行简单的了解(速率)
为什么电信拉的100M光纤,测试峰值速度只有12M每秒?
时延
时延可以细分为
发送时延
排队时延
传播时延
处理时延
发送时延
主要是本机进行网络发送的时候,在本机所停留的时间
传播时延
排队时延
数据包在网络设备中等待被处理的时间
如果说一个数据从本机发送到某一个路由器,路由器并不是马上就处理,因为它可能在处理很多别的数据包,所以此时我们发的数据包,可能在路由器中停留一段时间,这个等待被处理的时间就是排队时延
处理时延
数据包到达设备或者目的机器被处理所需要的时间
如果我们到达的服务器,它的性能不好,可能数据包到达了它那里,它要反应一会儿才能处理我们的数据包
所以评估计算机网络关于时间的指标,总时延为
评估计算机网络关于时间的指标,除了时延,还有一个指标是:往返时间RRT
RTT(Route-Trip Time)是评估网络质量的一项重要指标
RTT表示的是数据报文在端到端通信中的来回一次的时间
通常使用ping命令查看RTT
ping一个广州的IP看看(最右边那列是往返时间)
ping一个美国的IP看看
(明显看到这个往返时间是比较长的)
物理层概述
物理层的作用
如果是OSI七层模型的话,物理层是处于最底层的位置。对于TCP/IP四层模型,它是属于最底层的网络接口层。物理层的作用是
连接不同的物理设备(比如路由器到计算机通过网线进行连接)
传输比特流(比特流就是0、1这样的高低电平,或者说是数字信号)
传输介质
连接不同物理设备的介质,包括有线介质和无线介质,其中有线介质包括
双绞线
同轴电缆
光纤
无线介质有:红外线(遥控器)、无线、激光
比特流
用高电平表示1、低电平表示0,对高电平和低电平的变化,就可以形成比特流
信道的基本概念
信道是往一个方向传递信息的媒体
一条通信电路往往包含一个接收信道和一个发送信道
因为发送信息和接收信息的方向不一样,所有这里有两个信道
一条通信线路,既发送又接收,如果引起了冲突会怎么办?
这个问题,其实物理层已经解决了。根据信道的不同,通信电路可以分成
单工通信信道
半双工通信信道
全双工通信信道
单工通信信道
只能一个方向通信,没有反方向反馈的信道
有限电视、无线电收音机等等,都属于单工通信信道(一方发送,另外一方只能接收)
半双工通信信道
双方都可以发送和接收信息
不能双方同时发送,也不能同时接收
全双工通信信道
双方都可以同时发送和接收消息
网线这些都是全双工通信信道
分用-复用技术
前边介绍到,如果两个计算机进行通信,那么在他们之间就会有一条通信线路,在这条通信电路中,可能用发送信道和接收信道。考虑一种情况,如果有很多的计算机,他们都需要连接,这个时候就有很多的发送信道和接收信道,并且在很多时候,他们也并不是处于活跃的状态。这就会导致信道的利用率不高。因此就提出了分用-复用的技术,用来提升信道的利用率
分用-复用技术是如何提高信道的利用率?
多个计算机连接复用器,另一侧的计算机连接分用器。通过复用器和分用器这两个设备就可以共享一条发送信道以及接收信道,这样就可以大大提升信道的利用率
注意:如果有很多的计算机,很频繁的通过信道收发信息,会导致信道拥塞
数据链路层概述
对于物理层,主要是进行不同设备的连接,以及传输比特流。下边是对数据链路层进行介绍,首先数据链路层是位于OSI七层模型的倒数第二层,也就是物理层的上边一层,位于TCP/IP四层模型的网络接口层
数据链路层主要是解决了以下三个问题
封装成帧
透明传输
差错检测
封装成帧
“帧”是数据链路层数据的基本单位(就好比比特位是物理层数据的单位)
发送端在网络层的一段数据前后添加特定标记形成“帧”
接收端根据前后特定标记识别出“帧”
下边是通过图示来理解封装成帧的过程
首先在网络层会将一些“IP数据报”传输到数据链路层,
数据链路层在接收到这个数据的时候,把它看做是数据帧的数据,然后在数据的前后加上特定的标记,表示这是数据帧的头部和尾部
从帧首部到帧尾部就是数据帧的长度
而数据帧在物理层表现的就是很多的0和1组成的比特流。上边的提到的帧首部和帧尾部,都是特定的控制字符(特定比特流)
帧首部的比特流是:SOH:00000001(SOH是控制字符)
帧尾部的比特流是:EOT:00000100
如果帧数据中也恰好有帧首部或帧尾部一样的比特流该怎么办
这个就需要下边要提到的透明传输
透明传输
通过透明传输就可以解决上边提到的问题。在介绍透明传输之前,先了解一下什么是“透明”
“透明”在计算机领域是非常重要的一个术语
比如我们平时在设计一个API的时候,我们会常说,你这个API设计的足够良好的话,那么底层的这个API的操作,对API的调用方是透明的。再比如说,数据链路层和物理层,对于数据链路层来说,物理层它所做的工作都是透明的,物理层只需要提供一些API给数据链路层去使用就可以了。说白了就是:一种实际存在的事务,却又看起来不存在一样。把透明这个概念使用在数据链路层就是,控制字符在帧数据中,但是要当做不存在的去处理
那么数据链路层是怎样做到,即使控制字符位于帧数据中,它还是可以装作不知道的去处理的呢?
假设此时帧数据中有一个帧尾部的控制字符,如果数据链路层没有使用透明传输,那么接收端很可能就把位于帧数据中的控制字符,看做是数据帧的尾部,从而识别出错误的帧。因此数据链路层就会对帧数据中的控制字符进行特殊处理
处理的方法就是在控制字符前边加转义字符,下边的ESC就是转义字符。这样的话,接收端在接收到数据帧之后,它就会先判断帧数据中的控制字符前边是否存在转义字符,如果存在,就不会把这个控制字符当做一个控制字符。那如果帧数据中也出现了转义字符怎么办?把转义字符重新转义一次即可
其实我们在平时的编程当中,“\”一般看做是转义字符。假设此时要输出“\\”,那么在这两个反斜杠前边都加上转义字符即可,表示这两个都不是转义字符"\\\\"
差错检测
物理层只管传输比特流,无法控制是否出错(如果物理层传输比特流的过程中受到了一些干扰,比如闪电。就会影响比特流的传输,物理层是察觉不到的)
数据链路层负责起“差错检测”的工作
数据链路层的差错检测错
这部分主要是对数据链路层需要解决的第三个问题:差错检测进行详细的介绍,其中主要包含两个部分:
奇偶校验码
循环冗余校验码(CRC)
奇偶校验码
奇偶校验码是一种非常简单的检测比特流中是否有传输错误的方法。该方法是通过在比特流的尾部添加一位比特位来检测比特流是否有出错。假设测试要传输“00110010”这个8位的比特流
首先在这个比特流后边加“1”这个比特位
当接收端接收到这个比特流之后,就会根据后边加的那个比特位来检测该比特流是否有出错
这个1是通过前边的8位比特流相加得到3,因为3是奇数,所以就在这个8位的比特流后边加上1,来表示这是一个奇偶校验的位
如果我们要传输“00111010”这个比特流,那么后边添加的比特位就应是“0”,因为这8位相加的结果是4,是个偶数。下边就看一下,如何通过这个奇偶检验码来检测错误。假设此时要传输“00110010”这个比特流,那么需要在尾部添加“1”这个比特位。假设在传输的过程中发生了错误,接收端收到的是“00010010”,此时接收端会通过奇偶校验码来进行校验,接收端计算的奇偶校验码是“0”,不等于“1”,说明这个比特流在传输的过程中出现了差错
相信聪明的你已经看出来,这里边有一个局限性,假设现在还是要传输“00110010”,在尾部添加的比特位是“1”。假设此时接收端接收到的是“00000010”,接收端经过运算之后,发现后边的奇偶校验位应该是“1”,而恰好此时,最后一位校验位就是“1”,就会认为数据没问题,而实际上数据是有问题的。所以当比特流出现两位错误,奇偶校验码就检测不到错误
循环冗余校验码(CRC)
循环冗余校验码是一种广泛使用的差错检测的算法
它是一种根据传输或保存的数据而产生固定位数校验码的方法(固定位数,可能是1位,也可能是多位)
它可以检测数据传输或者保存后可能出现的错误
它的过程和奇偶校验码有些类似,它首先计算生成一些数字,并且附加到数据后边
当接收端接收到数据之后,就会根据附加到后边的数字,来判断接收到的数据是否有出错
在了解循环冗余校验码算法之前,先了解一下:模“2”除法
模“2”除法是二进制下的除法
与算术除法类似,但除法不借位,实际是“异或”操作
下边看一个模“2”除法的例子
了解了模“2”除法之后,就可以了解CRC的整个过程了,CRC主要有三个步骤
选定一个用于校验的多项式G(x),并在数据尾部添加r个0
将添加r个0后的数据,使用模“2”除法除以多项式的位串
将得到的余数填充在原数据r个0的位置,得到可校验的位串
看文字描述容易让人一脸懵逼,下边直接例子
使用CRC计算“101001”的可校验位串
下边就根据上边提到的计算CRC的三步来计算
(1)首先是选定一个用于校验的多项式G(x),并在数据尾部添加r个0
什么是G(x)?
G(x)可能是下边这样的一个多项式
位串就是将多项式的常数项提取出来,得到了位串1101。在数据尾部添加r个0,其实就是在尾部添加最高阶个0。因此在“101001”后边添加3个0就得到了“101001000”
这个G(x)多项式并不是随便找的,可以通过维基百科查到一些常用的G(x)
(2)将添加r个0后的数据,使用模“2”除法除以多项式的位串
经过上边的计算,得到余数为“001”,然后进行第三步
(3)将得到的余数填充在原数据r个0的位置,得到可校验的位串
也就是将原来的“101001000”填充为“101001001”,最后这个就是最终要发送的可校验位串,上边的过程都是在发送端完成的,发送端通过校验出可校验位串之后,它就可以将这个比特流发送给接收端。接收端在接收到这个比特流之后,它就可以进行校验。校验的过程也是一样,接收端将接收到的数据除以G(x)的位串,根据余数判断是否出错,如果没有出错,得到的余数应该是0,如果不是0,说明数据在传输过程中出错了
上边就是循环冗余校验码算法(CRC)的整个过程
其实CRC的错误检测能力与位串的阶数r有关(位串中添加越多的0,检测能力就越强,比如,阶数如果是1的话,就是在传输数据后边加一个校验位,这样就退化成了前边介绍的奇偶校验码了)
数据链路层只进行数据的检测,不进行纠正(如果数据链路层发现错误的数据,它会直接的将其丢弃掉)
数最大传送单元MTU
MTU
最大传输单元MTU(Maximum Transmission Unit)
数据链路层的数据帧不是无限大的(因此MTU描述的就是最大可传输的数据帧)
设置MTU的好处
数据帧过大或者过小都会影响传输的效率(常用的以太网的MTU一般为1500字节)
在前边了解过计算机网络的性能时,介绍到时延
如果数据帧过大,总时延就会增大,这样就导致发送端和接收端处理信息的时间过长
如果过小的话也不行,假设每次发1个字节,那么1500个字节就需要发送1500次,虽然每个数据发送的总时延减少了,但是重复1500次,这个也会影响通信的效率,所以数据帧过大或过小都会影响数据传输效率
路径MTU
假设计算机A给计算机B传输数据,需要经过多个小型网络。假设计算机A给计算机B传输数据的话,那么路径的MTU由谁决定的呢?如下图
计算机和小型网络之间以及小型网络和小型网络之间的数字是MTU,那么整个路径的MTU就是受最小的MTU影响的,称之为木桶效应。所以整个路径的MTU就是1492
以太网协议详解
上边介绍了数据链路层中的数据封装成帧、透明传输、差错检测以及MTU。了解完这些,还不能让我们知道数据链路层是如何进行数据传输的,以太网协议是数据链路层非常常用的一种协议。在学习具体某一层的协议时,我们是希望可以屏蔽其它层的一些细节,比如我们在学习数据链路层的协议时,就不需要关注物理层是如何进行比特流的传输的,我们甚至可以认为比特流是由某一台机器的数据链路层直接传输到另一台机器的数据链路层的,以此来简化理解
假设有下边这么一个网络拓扑,图中有A、B、C三台计算机,这三个计算机通过一个路由器进行连接。假设此时A需要向C发送数据,数据是如何到达的C的?路由器怎么知道计算机A的数据要发送给谁?这个就是本部分要了解的内容
本部分主要由两个主要内容
MAC地址
以太网协议
MAC地址
MAC地址(物理地址、硬件地址)
每一个设备都拥有唯一的一个MAC地址(可以理解成设备的身份证)
MAC地址共48位,通常用十六进制表示
可以通过ifconfig -a(windows使用 ipconfig /all)来查看本机所有硬件设备的地址
以太网协议
以太网(Ethernet)是一种使用广泛的局域网技术
以太网是一种应用于数据链路层的协议
使用以太网可以完成相邻设备的数据帧传输
以太网数据格式
主要由五个部分组成:
目的地址、源地址:前边两个部分就是前边提到的MAC地址,下边的6,表示占用6个字节(48位)
类型:*类型表明的是帧数据是哪个协议的数据*,如果是网络层的数据的话,类型就是0800;如果帧数据是ARP协议的请求或应答数据,它的类型就是0806;如果是RARP的协议数据,那类型就是8035
帧数据:就是具体发的数据
CRC:这个是前边介绍到的循环冗余校验码
MAC地址表
MAC地址表是一个映射,会把MAC地址具体的映射到硬件接口。了解了MAC地址表,就可以解决最开始提到的那个问题了
当A要给C发送消息的时候,在路由器E中有一个MAC地址表,表中记录了每一个MAC地址映射到了哪一个接口。所以A给C发数据的整个过程就是:
A通过网卡发送数据帧
数据帧到达路由器,路由器取出前6个字节(目的地址)
路由器匹配MAC地址表,找到对应的网络接口
路由器通过目的地址匹配到的接口来发送数据帧
如果MAC地址表,不知道C的硬件接口具体是哪一个,该怎么办?
这个问题的过程就是:
路由器E检查MAC地址表,发现没有MAC地址C的信息
E将广播A的数据包到除A以外的接口
E将收到来自B、C的回应,并将MAC地址记录下来
对于比较复杂的网络拓扑,通过MAC地址表就不能解决跨设备的数据传输
因为通过MAC地址表只能进行相邻物理节点之前的数据传输,所以,如果A要给C发送数据,靠MAC地址表是完成不了的(E只能知道A、D、F的地址)。解决跨设备的数据传输就需要学习网络层的更多内容
在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/01ee4c175665124dc70f94183】。文章转载请联系作者。
评论