在这一章当中我们讲述计算机网络基础。

一、计算机网络

  网络通信就像人与人之间的交流一样,说同一种语言,而后双方进行无障碍的通信交流,那么两台主机通信时,它们彼此交换数据的格式的前提为互相理解才可以,我们此前也有了解到,当两台主机在交换数据时,一般而言这个数据为流式数据,或者叫做可流式化的数据,简单来讲假如在本地放的是一个文件,这个文件是由文本流组成的,我们需要将这个文本文件的文本流将其抽成丝儿,一个位一个位转换成1和0组成的二进制格式,这样才能在线路介质上进行传输,那么对于这台主机之间,我们只需知道需要数据完成交换时,也有一种传输介质,这种传输介质可以是有线的,常见的有以太网网线,在以太网未出现之前早期使用的是同轴电缆来实现信号传输,到今天为止还有另外一种更为常用的就是基于电磁波信号来进行传输的,这其实都是传输信号的一种方式,来实现其信号交换的机制。

  无论是用那种信号方式进行传输,必然的是,当传送方发出信号后,接收方必须能理解对方是如何传送的,真正传送文件时,文件大小在本地的容量有所不同,假设要传输五个文件到另一台主机上,则必须要界定文件的开始和结尾处,这实际上两台计算机之间要想完成数据传输并且让对方做到精确理解时,通过网络传输无非就是二进制01的信号,传达给对方之后,对方如何理解并还原成原来的文件就变得至关重要,但是两台主机之间为了完成信号传输需要解决的问题有很多,不光是文件本身的格式,还要恢复原来的样子也是一个问题,比如在传输信号过程中万一线路收到干扰,导致信号传递失败该如何解决,还有双方在实现数据交换时,如果一方发的速度很快,而另一方接收很慢,这样的话,发送方的数据流会将接收方给淹没,导致数据丢失,因此这里面有许多复杂的问题。

  实际上,在现在的互联网当中所使用到的协议为TCP/IP协议,TCP/IP其实不是一个协议,它是一个协议簇,也可以称之为协议栈,因为在这里涉及到许许多多的协议,那么协议可以理解为是一种标准或规范,就是双方事先商定的一种组织机制,并协调的一种机制。

  对于计算机来讲,要想了解网络的话,就得需要深度参与进去,需要人为的参与,因为站在自然角度来讲,它们是没有办法能够自行解决的,因此计算机网络上的主机与之间,完成信息交换时也讲过这是一个很复杂的问题,不过可以将其化整为零,一个一个的逐个击破,所以说主机之间的通信所面临的非常复杂的问题,就得必须划分层次,每一个层次逐一能够单独进行解决,那么这就是协议分层的概念,而TCP/IP协议栈共有四层或五层(看人为理解),哪一种模型都不为错,因为本身TCP/IP协议栈从设计上并不太规范,而OSI才是一个非常规范的协议栈,但是这并不能说明TCP/IP是在计算机网络中正在广泛使用的协议栈,因为这个世界并非完美,不管黑猫白猫,抓到老鼠就是好猫。

  由于TCP/IP定制的不规范,而且该协议在概念上有很模糊,所以ISO(国际标准组织)就定制了OSI(开放系统互联)参考模型,它也是个协议栈及协议规范,原先就是取代TCP/IP协议接口之间的不规范,而且接口之间交互及边界模糊不清的目的,但并没有取代,因为OSI设计上是规范了,理解起来也清晰了,但是带来的问题就是该协议过于重量级,为了接口规范,它在性能上做了许多妥协,有些功能在OSI协议栈的内部实现了多次,所以该协议比起TCP/IP来讲有些过于重量级,所以OSI就成为了学习的模型,但TCP/IP是一个使用中的模型。

  计算机通信是需要协议的,而就在之前讲过,它们之间的问题太复杂了,所以将大问题分割成为了小问题,而这些小问题彼此之间交接起来来完成,就像收发快递一样,如果我们将一个包裹从A地发往B地的话,有以下方式:第一,亲自跑到B地,不过这样很麻烦,那么如果可以让包裹可以飞起来的话,则解决了很多麻烦,至于如何飞肯定是由第三方机构所为我们提供,那么A和B为了完成物品交换的问题,有一些物流公司来解决这样的一个问题,帮我们提供数据交换的服务,那么对于A来讲,为了发送包裹给B,只需调用物流公司的接口,也就是说自己去还是上门取件,这就是接口调用的机制,至于如何传送的,无需关心,只关心B是否接收成功就可以了。

  所以站在这个角度来讲,物流就是社会实现物品交换的一个基础设施即服务,而对于计算机来讲,为了完成数据能够交换,我们最起码有网卡这样的接口,还需要有传输介质,无论是有线还是无线,可以理解为它们是为了实现通信的基础设施,但我们应该明白,基础设置能够传输很多物品,无论大到×××,小到一张纸发送给对方都可以的,不管你要传输什么物品,一般而言就能够承载完成传递的任务,同样的道理,两台主机所实现的数据交换,不管你的数据形态是什么(大到电影,小到文件),这个介质都能够进行传递,但传递过去之后,在传递过程中我们需要关注一些问题,比如说将数据打碎如何还原成原来的形态,对于传输来讲,这也是必须要这么做的一件功能,基于现代的通信交换通常都是按照来进行的,数据无论是什么形态,最终都要流式化,所以双方彼此之间要在协调与商定,如何将数据进行流式化,以及如何还原。如果你的数据不能还原,避免出现这样的问题,则双方都得需要某种协议,来定义数据的交换类型以及数据交换如何进行,所以这里涉及到一些复杂的问题。

  计算机传输的过程我们无需关心,只要能将流式化的数据传输过去就可以,并且能够还原回来,但是如何还原需要了解物品的原生形态的问题,这涉及到文件本身的组织格式,所以说TCP/IP网络也大致分为两个层次,第一个为较低的层次是关心数据如何送往及传输的功能,而第二层就是将数据是如何被组织起来的,站在另一个角度来讲,我们的网络被成为通信子网资源子网,所谓通信子网只是关心你的数据到底如何从该主机送往另一台主机,而所谓的资源子网主要关注的就是如何将数据组织起来。

  一般而言,对于TCP/IP来讲,负责完成数据交换或完成通信的,就叫做通信子网,无论有几个层次,而负责文件类型数据内部组织格式的,就叫做资源子网。

  简单阐述一下上面的内容,其实就是为了完成数据交互及传输,于是就有了TCP/IP协议,以及提供了便于理解的OSI的学习参考模型,我们都需要去了解,但是我们需要了解的是,我们要对于一个复杂的问题切割成多个小问题,但两台主机进行通信时,在底层的物理结构上,将其组织起来。

  但其实主机之间实际上不止有两台,所以我们不考虑多台的复杂问题,只是考虑两台完成信号交换很容易,一方发送一方接收就可以了。但是对于计算机网络来讲,这件事情复杂很多,因为在一个网络时,组织的计算机是很多的,当我们组织n台主机在一起时,如何将它们实现通信及传输信号也是个问题,在施乐公司的PACK实验室里,他们研发了现代主流的以太网网络,那个时候的以太网网络是一种使用同轴线缆,每个同轴线缆可以做多个T型头,每个T型头可以使主机链接到同一根儿线缆上,意味着这一根物理传输介质,它所带来的问题就是,A主机如果想和C主机通信时,底层的线缆上给调至相应的电压信号施加到该线缆上,高低电压,这个线缆充满的信号,所以说不止C能收到,B也可以收到,那么这时如果B和D也想传输信号,则是不允许的,因为B和D在想施压时,则造成信号干扰,因此这四台主机在某一时刻只能有一个信号来进行传输。因此,等通信信道空闲时,那一台主机就开始抢占通信信道进行数据传输。

  那么这样会带来几个问题,A发信号时,B也发了,二者必然会冲突,那么如何避免冲突,既然空间中不能复用,则只能进行时间上的复用,实际上计算机网络组织有很多问题需要解决,这也是其中一种,但解决的方案有很多种,在以太网当中引入了一种协议叫做CSMA/CD,叫做载波侦听多路访问/冲突检测协议,也可以理解为这也是一种线路仲裁的机制,A、B、C、D这四个主机,每一个主机在发信号之前,先去检测一下该线路是否被占用,如果没有占用,则开始抢占该线路,进行数据传输,如果同时占用该线路时,则载波侦听:将数据边发送变检测,检测是否有别的主机同时到达的信号以至于不要发生冲突,所以载波侦听还要冲突检测,如果没有检测到冲突,则传输完成退出,如果检测到其它信号干扰,则此前的信号传输将被打断,于是不得不终止刚才的信号传输,过一会在重试。总之就是如果信道正繁忙那就等待一个随机时间在检测,如果线路空闲时将会立即发送信号,并且边发送变检测是否有冲突发生,如果没有冲突发生将会持续发送数据信号,在传输信号的过程中检测到冲突的话则立即停止信号传输,并且后退随机等待一段时间再次检测,这就是CSMA/CD的解决方案。

1523432067(1).jpg

  还有一种是IBM早期研发的网络,称之为令牌环网,将多台主机连接到可以想象为是一个还状网络中,在这个环状网络上游走一个令牌,这个令牌在这个网络上不断的游走着,任何一个主机想要发送信号时,必须得有令牌才可以,谁拥有这个令牌,谁就能够拥有传输数据的权限,其它主机则不可能有该权限发送信号,它也可以解决所有主机使用该线路去争用的问题,因为它的解决方案就是谁抓住令牌谁就能发送信号。

1523432092(1).jpg

  那么对于现在的以太网就是使用使用同轴线缆去连接多个主机,使用CDMA/CD来解决在信道上的网络就称之为以太网。那么A发送给C的信号B和D能看到但是并不接收,这是因为每个主机都有一个标识,这就相当于在信封上有个收件人的地址,同样的道理,每个主机主机都应该有唯一的标识,这种唯一标识对于以太网来讲,都会在主机上使用一个以太网的物理设备,来完成对主机上的内部基于IO的方式来完成信号的交换。这个IO设备我们通常称之为网卡,该设备有自己唯一的标识符,而这个标识符就是我们所熟知的MAC地址,而MAC所表示的意思为介质访问控制,MAC地址是固定在网卡设备上的,要求生产的网卡的公司或组织都可以生产网卡,而且将网卡的MAC地址固定进去,为了防止各个厂商之间的网卡地址相同,于是乎就有个国际组织来规范的来组织解决地址分配避免冲突等问题。我们知道MAC地址共有48位的二进制组成,国际名称地址分配机构ICANN将48位的地址块这样做了定义,前24位地址共有2^24,大约有一千六百万个地址,如果你想用需要就得购买,但凡以太网网卡厂商通常都是从该组织购买的,注册申请其中一个或某些个地址,而这个过程我们就称之为注册地址的过程,而后24位也共有2^24,是作为厂商来讲是可以随意变换的,主要保证生产网卡的当中不会有冲突就可以,而这前24位我们就称之为地址块,要是厂商还是不够用的话,可以继续再次购买。

  因此,计算机之间在底层的通信上解决了这些基本的问题,但是还有另外一个层次的问题,当同一个网络上的主机越多越多时,在以太网中是变检测变发信号,等到冲突就收回信号的一种机制,但有很多台主机时,冲突则就大大增加,大大增加的话则就会将冲突无时无刻的增加,相当于前世五百年净回眸,换来今生的擦肩而过,这里也是一样, 净是冲突。所以我们必须要解决该问题,虽然有很多的主机,但是真正交互的没有几台,不可能对每个主机彼此进行交互,可能率极小,我们可以将通信频繁非常大的主机放置在一个网络中,另外一些主机放置在另一个网络中,将其切割,但是切割就成为了两座孤岛,如果需要跨越这层需要网络进行通信的话,最简单的合并方式显然是不妥当的,我们可以找一个专门的设备将两个网络连接起来,这个设备有一定的智能性,智能在连接这两个网络能够判断A主机发送的信号,如果发送给X主机的,该设备将信号从该网络发送到另一个网络中去,但是该主机仅限制在本地通信的话,比如A和B之间通信,那么该设备是不会传送到另一个网络中去,因此就避免了冲突,那么这个该设备就是网桥,它能解决在跨越主机时将信号传送到另一个网络中去。将冲突性问题给分割开来,所以网桥的作用就是分割冲突域的,无论是本地通信还是夸网络通信,网桥其实都能接收到一份,但是在本地通信时,并不会将信号发送到另一个网络中去,但是某一个主机需要夸网络时,网桥才能将信号传送给另一个网络中的另一台主机,因此它分割并连接了两个网络。

  那么网桥是如何知道那个网络中有那台主机是凭着内部有一个地址簿,它明确知道某个主机在哪一个接口上,当接收到A主机发送信号的时候,通过检查该地址簿就发现,因为不管那个主机发送的信号,其里面肯定会有收信者,这个收信者一定是某台主机的地址,因此则根据收信者的地址查看该表,查看发现自己收到目标的接和目标主机都在同一个接口上,于是乎就认为这个是不需要进行转发的,但收到信号来自于左侧接口,但是一查表发现目标主机X在右侧接口,于是将数据将左侧接口发往右侧接口,那么这个过程就叫做数据交换的过程,这也是该设备也被称之为交换机的原因。那么这张地址表我们也称之为MAC地址表。

  但是我们需要开始要考虑一个问题,A主机有可能发送到的是广播信号,所谓的广播信号就是,A主机发送的信号不是针对的某一台,而是事先商定的任何一台主机都可以接收的一个地址,这个地址我们就称之为广播地址。全为1时就是广播地址,因此A主机发送的信号为目标地址是48个1,其它主机认为都可以接收,那么网桥设备也认为另一端的网络也可以收到该广播信号,因为这个设备也不确定该信号的目标主机,这时候交换机一定会将广播信号送给右侧接口一份,另一侧的主机也都接收到了该广播信号,这样做的后果是交换器忙着转发广播信号,而广播信号由于每个主机都要接收,久而久之如果广播信号过多时,则在网络内都会充斥着广播信号。

  广播信号的作用就是在网络内搜寻其它主机,为了避免大范围的广播信号,我们可以广播信号将其切割使得广播报文所到达的范围是有限的,就像一个部门一样,新同事来了对该部门进行自我介绍,而不是对全公司,这就限制了广播的范围。此前我们容易理解,对于MAC地址来讲,通常为两段组成,而且第一段是不由我们自己来控制的,是由ICANN来控制的,第二个其实也是不由我们控制,好在地址不同就可以,所以这使得我们的通信地址是平面的,是一个平面化的地址,所谓的平面化地址只能在同一个范围内进行通信。

  如果将大范围切割成为小范围,当我们需要完成通信时,将地址变得立体化时,则变得简便许多,与层级化结构相同,它也是一种倒置的树状结构,将一个大范围切割成n个小范围,从根处逐一向下去找,一级一级向下去找,将范围划分的越来越小,而现在的主机和手持的终端设备是有很多的,则更要将通信的范围将其切割,因此它们也是的确这样做的,假如在一个可控的组织内,有许多台主机,为了避免广播范围过大,许多台主机为了互相通信,使得网桥设备之间相互连接,假设A主机与X2主机进行通信,无非这个报文就是从第一个交换机交换到第二个交换机,而第二个交换机将数据放置在右侧端口送达X2,那么在这时,A主机送一个广播则全网都能收到,这也是必然的,那么为了避免广播规模过大的问题,我们也需要将地址切割成立体化结构,而后在两台设备之间在加上一个隔离广播的设备。必要时,如果A主机需要和X2主机通信时,依旧是可以通信的,但是不能够用广播的方式与X2进行通信,任何一个主机的广播只能限制在自己的部门内,该设备可以想象成是一个部门的分割器,那么A主机与X2通信时与之前的方式是不一样的,比如说A与X2进行通信,发送报文给X2,那么第一个交换机(S1),其实不知道有X2这台主机,因为S1的所有操作都无法跨越该隔离设备,因此该设备S1无法知道是有X2主机的,但X2的确是存在的,这样的话A主机与X2被该设备相隔了,虽然有可能知道,但是就是传递不过去,为了避免这种情况发生,当A主机发送信号时,S1发现这个广播域并没有该设备,就会送到该隔离设备,我们称之为R1,送到R1之后,由R1负责发送,由1号口发送给2号口,为了具有一定的智能性,R1在1号口和2好口所属的网络做了应有的标记,各自有一个网络号,用于标识各个范围的网络,A主机属于1号网络,X2主机属于2号网络,当A主机与X2主机通信时就会改成这种方式:我需要将信号发送给2号网络的X2主机,所以这个报文送给S1以后,S1并不知道有没有该主机,但是A主机要知道要将报文发送给R1的2号接口,R1的一号接口发现其目标主机是2号网络的,所以将报文就从1号网络扔到2号网络中去,而A主机的广播信号R1是置之不理的。

  但是有可能具体有某个报文信号从1号网络路由到2号网络,完成这个功能,所以站在这个角度来讲,每个网络都得有网络号来实现该功能,但是MAC地址是不能标记网络号,因为我们没有办法来进行界定,因此为了解决该问题,在原有的地址之上,重新设计一套地址标识方式,就像×××号码一样,MAC地址只能在本地通信时才能使用,如果非本地通信而是跨网络通信时,使用另外一层的地址,赋予某个新的地址,那个新的地址就是给每台主机一个网络号,使用MAC地址固然很好用,但是并不是同一套设计体系,而这个网络号的主机的标识方法为,在设立该主机一个网络号的同时,设立自己的主机号,因此则整个地址就会被分成为两段,网络号+主机号,而这就是我们所现在使用的IP地址。

  因此,有了IP地址以后,或者拥有了这样的标记以后,我们的主机就拥有了两个地址,第一个就是网卡上内嵌的地址就是我们刚才称之为的MAC地址,第二个就是自己官方所讲到的,为了实现编写容易以及跨网络进行通信,就需要额外给其添加的逻辑地址,这个逻辑地址我们通常就称之为IP地址,IP就叫做互联网地址,又称为互联网协议Internet Protocol,而这个地址(address)由网络号和主机号共同组成,所以这样的话,彼此主机之间相互通信时,需要指明那个网络中的的那个主机来接收报文就可以了,我们需要同时标记那个网络中的那个主机,但是,网络号和主机号也在之前讲过,对于计算机来讲,更容易识别的是数字,假设有个网络为1号网络中的2号主机,如何编写到一起的联系更加方便这也是个问题,那么IP地址其实就是解决这么一个问题的地址,它将网络号和主机号联系在一起,同时进行标识,而这个标识就叫做IP地址,所以一个IP地址的内部包含了网络号和主机号。

  那么IP地址的组织格式或组织标识为点分十进制,共有32bits二进制组成(注意:只有32bits组成),由于这是第四版,我们称之为IPv4,IP共有两种版本,一种为IPv4,另一种为IPv6,而IPv6共有128bits二进制,我们在现阶段只介绍IPv4,这32为地址每八位一段,使用点号.隔开,转换十进制每8位标识0-255,因此该地址的表示范围为:0.0.0.0-255.255.255.255,这四段当中如何定义那些是网络号以及那些是主机号是非常重要的,对于网络来讲,既有大型网络又有小型网络,可能对于一个小型的网络来讲,容纳两百台以上的主机,可以将最后一个8bits设定为主机号,因此对于规模不同的网络要求也是不相同的,因此我们不能将IP地址直接定死那些当作网络号,那些当作主机号。需要根据不同的使用场景进行灵活的调度。那么,这就是我们接下来所讲述的IP地址的分类。

   计算机网络:
       TCP/IP协议栈(使用)
           ISO, OSI:协议栈(学习)
        
       MAC: Media Access Control
           48bits:
               ICANN: 24bit, 2^24
                   地址块:2^24
                
               网桥(bridge):MAC地址表
                   静态指定:
                   动态学习:根据源地址学习;
                
               交换机(switch):多端口网桥;
            
           IP(Internet protocol)地址:网络号+主机号
               A <--> B
                   网络?
                   主机?
                
               IPv4:32bits
                   8bits.8bits.8bits.8bits
                       0-255
                       0.0.0.0-255.255.255.255

二、IP地址分类

  我们需要注意的是,在互联网上通信的,只有A、B、C三类。D类是组播地址,E类姑且算科研用。

2.1 A类地址

  IP地址共分为五类,由A、B、C、D、E来进行标识,对于A类来讲,前8位二进制当中,第一位为0不变,后7位可以随意变化,我们现在知道IP地址共有4段组成,将第一段当作网络号,后三段为主机号。所以网络号的变化范围为:由于第一位0是固定不变的,后7位可以随意变化,可表示为0 000 0000 - 0 1111 1111,这样的话,网络号的数量范围为1-127,需要注意的是,全0不能用,以及全1也不能用,所以有效的网络范围为1-127。所以A类地址的第一段为网络号,而后三段为主机号,那么对于A类来讲的网络数量为127个,但其实共有126个,因为127被拿来当作本地环回地址。而每个网络中的主机数量为2^24-2,其中2^24表示了主机的范围,而减去两个则表示全0全1不能配置,因为全0的为网络地址,表示其网络自身,全1的为广播地址,表示网络内所有主机。子网掩码为255.0.0.0,而子网掩码是用来做如果目标主机和本地主机在同一个网络中,那么这个是不需要路由器进行参与,因为路由器是用来实现跨网络主机通信的,那么如何判定本地主机和目标主机是否在一个网络时,需要靠掩码来实现,掩码是对每一个通信的主机,该主机用自己的掩码和IP地址按位进行"与"运算,1与谁向与还等于谁,0与谁相与都得0。这是该两个特点,因此,掩码的主要作用就是将对应的网络号的一部分都置为1,用来表示计算的结果还是自己,而对应的主机号置为0,用来取得网络地址。所以子网掩码的作用就是用来"与"计算IP地址,计算以后取得网络地址。

  因此,掩码就是用于与IP地址按位进行"与"运算,从而取出其网络地址的一种机制,每一个主机和其它的主机进行通信时,通常都有自己的地址,也有对方的地址,所以它会拿着掩码与自己的IP地址做一次"与"运算,得到一个网络号。并且与对方的地址做一次"与"运算,又得一个网络号,之后开始比较这两个网络号是否一样,如果一样则进行本地通信,如果不一样则跨网络通信,夸网络通信则需要路由器进行转发。

  对于A类来讲,我们可以划分子网,既然有默认掩码,也可以没有默认掩码,可以继续做三级或四级划分。

  每一类网络当中,需要注意的是,既然有了IP地址,那么IP地址的分配也是由国际名称地址分配机构所分配的,任何人要想使用互联网通信使用该地址时,是需要买地址块,或者买一个地址,如果不打算进行互联网通信,而仅仅是用于本地通信的话,需要购买地址也是对我们需要在本地通信的用户也是非常不友好的,所以他们也想到保留下一些地址,只进行在本地通信的用户而使用,但是不能用于互联网通信,而这些地址我们就称之为私网地址。私网地址就表示,虽然有这些地址,但只能在有限的范围内进行通信,比如说在公司内部进行通信,但不能在互联网上进行通信,互联网不会将该数据包进行转发的。

  那么对于A类地址总结如下:

   IP地址分类:
       A类:
           第一段为网络号,后三段为主机号
           网络号:
               0 000 0000 - 0 111 1111: 1-127
           网络数量:126, 127
           每个网络中的主机数量:2^24-a
           默认子网掩码:255.0.0.0, /8
               用于与IP地址按位进行"与"运算,从而获取其网络地址;
                   1.5.2.1/255.0.0.0 = 1.0.0.0
                   3.2.4.6/255.0.0.0 = 3.4.0.0
           私网地址:10.0.0.0/255.0.0.0

2.2 B类地址

  对于B类网来讲,基本的套路与之前A类的套路都是一样的,只不过有些不同而已,在这里不做阐述,总结如下:

       B类:
           前两段为网络号,后两段为主机号
           网络号:
               10 00 0000 - 10 11 1111: 128-191
           网络数:2^14-2
           每个网络中的主机数量:2^16-2
           默认子网掩码:255.255.0.0. /16
           私网地址:172.16.0.0-172.31.0.0

2.3 C类地址

       C类:
           前三段为网络号,后一段为主机号
           网络号:
               110 00000 - 110 11111: 192-113
           网络数:2^21-2
           每个网络中的主机数量:2^8-2
           默认子网掩码:255.255.255.0, /24
           私网地址:192.168.0.0-192.168.255.255

  那么以上就是我们IP地址的分类,需要背会和算划分出来IP及网络地址。

三、路由器

  路由器所看到IP地址进行通信时,自动寻找最佳路线进行数据包的传送,路由器如何知道那个网络属于哪里是有一个路由表来进行决策的,所以无论是交换机还是路由器的智能性表现在:交换机(前身为网桥)的智能性表现在拥有MAC地址表,网桥如何知道那个主机在那个接口上的是通过两种方式来指定:第一,静态指定,通俗一点来说就是手动配置,不过这样很麻烦,也是非常繁琐的事情。第二,动态学习,交换机会自动学习learn,在刚开始时,交换机上的接口并不知道接入的是那台主机,但是当A主机发送一个报文的时候,该主机一定是从某个接口接入的,所以交换机就知道,假如A主机是从1号接口接入发送报文的,该接口收到A所发的报文,无论发给谁,只记录A在那个接口上发送的,所以这是根据源地址进行学习,这就是动态学习的过程,它的好处就是无需手动配置,坏处在于必须要有一个有效期限,因为交换机自动学习到的源地址,但该主机移除了,所以MAC地址表中的条目都会有一个TTL值,我们称之为生存周期,这个生存周期一般默认为300秒钟,那么时间周期过了之后就会该源地址就会被删除,过一会还得需要重新学习,这样的话交换机大量的时间用来进行学习,在这学习过程的当中,有可能会发送大量广播,因为交换机如果不知道该主机在那个接口上,就只能发送广播给每个接口使得该主机接收并回馈给交换机,这种我们就称之为泛洪。

  而对于路由器来说,刚才提到过,路由器靠的是路由表,能实现IP地址转发的报文叫做路由器设备,我们称之为router,另外刚才所讲到的网桥设备,一般指的是交换机,但是他俩并不是同一种东西,交换机一般指的是多个端口,现代的智能化网桥,早期网桥通常用来连接两个网络,现在的交换机有多个接口,而且并不是连接的网络,而是连接的是单独的主机,那么我们把它称之为交换机(switch),又把它称之为多端口网桥。

  对于路由器来讲,刚才也讲过,内部是靠路由表来事先判定该主机通信时目标主机在那个网络上,从而能转发给那个接口。路由器可能不止一个接口,或者不止两个或n个,它们能连接多个网络,但全球的网络非常庞大,从那个网络到那个网络这也是一个问题,事实上全球的路由器可能是分成多个等级的,路由器可分成多个分支,层层环扣,跨国家以及夸大洋是可以的,那么一台国内的主机与另一台国家的主机进行通信,中间是有n条路径可以走的,有很多路径可以到达,但无论多少条路,选择的路只有一条,不过无论多少条路,姑且那一条路最近这是最好的选择。而且那一条最近的路是根据估算标准来进行决策,有所谓的路径最短,以及花销最少,还有就是时间最短的,所以说,估算标准不一样使得有很多条路可以走,看对于那条路来进行估算,是根据时间还是很据距离等。

  因此,我们要在选路时,找出一种标准来完成所谓的其路径×××的计算标准,所以我们的路由实现的路由协议算法时,通常的算法第一个为距离矢量,例如像RIP协议,还有一个就是OSPF,OSPF叫做开放最短路径优先,但至少是在我们的路由表当中,应该会定义一下最终每一条路由表都应该知道自己在网络中所处在什么位置。

  每个路由器到最终都需要明白,整个网络或者是有限需要到达的某个路径可以走,每个路由器在某一时刻必须要知道到达全球每一个位置到底有那些个路可以走,而其中选择最优的并且记录下来,这个记录的条目就叫做路由表条目,最终记录了n条路径,因为需要有很多网络进行到达,到达每一条网络都得有寻好的路,最终每一个路都是一个条目,于是条目很多,就形成了路由表。那么条目的生成以及如何到达某个网络时从哪里经过这也是最主要的事情,对于路由表的生成以及对于MAC地址表的生成是一样的,无非之前说的两种方式,静态指定和动态学习,静态指定对于小范围的网络来讲是比较可靠的,但对于大范围来讲并不可靠,那么对于动态学习的方式来讲,它需要专门的学习来专门帮助我们来学习,例如rip2ospf等协议,当然前者已经废弃,ospf就是学习知道从其它网络哪里学习得知我们能够到达那些网络以及有那些路可以走,每一种不同的协议它们的选择路径长短标准也是不一样的,甚至同一种协议经过调整以后也可以基于不同的标准来进行,所以这叫做路由表。

  有了路由表终于可以确定从那个主机到那个主机二者之间或彼此之间是如何进行通信的,因此在系统中有个命令,该命令的功能是例如从A主机到B主机之间走的那条路,这条命令称之为traceroute,而ping操作就是探测两台主机之间有没有可靠的链路彼此之间能够到达的一条命令。

    路由器:router
        路由表:
           静态学习
           动态学习:rip2, ospf
        
        路由条目:
           目标地址 下一跳(nexthop)
              目标地址的类别:
                  主机:主机路由
                  网络:网络路由
                  0.0.0.0/0.0.0.0;默认路由

  

1523432112(1).jpg

  但是有了IP地址最多也就是拥有跨网络的特性,虽然我们现在通过路由这种方式能够跨越很复杂的网络,但是能让各个互联网之间的主机能够通信,需要有个问题进行解决,现代的主机都是多任务的操作系统,我们此前也说过我们的OS都是拥有多用户及多任务的,在多任务的概念中,是由多进程同时运行,我们平时浏览互联网的时候,一方面可以浏览网页,还一方面还可以聊天以及听音乐,这意味着不仅仅是主机与主机之间进行通信,每一个主机中的多个程序需要与另一个主机的程序进行通信。

  因此,当本地的聊天工具发送的信息被WEB服务器接收到,其结果是非常糟糕的,所以我们还得需要给每个进程去标识某个地址,这样一来就意味着,对方的信号发送过去以后,对方的主机需要想办法识别出与本地的那一个进程进行通信,既然进程间都有地址,地址可以固定,也可以不固定,每个进程不可能跨越主机来使用地址的,所以进程地址只能在本地主机范围内使用,因为刚才讲过,进程地址只是在当前主机上来区别不同进程的,所以它的有效范围只限于本地主机。再则,我们用于标识进程的时候,这个进程地址是不是固定的,就像IP地址一样,至少有一段时间是固定的,那端口也亦是如此,在通信时的某一时刻,无论是IP还是端口,只要不随意更改或者一直传输都是永久固定的。就像服务器一样,必须有固定的IP地址等待管理,就像守株待兔一样,而客户端的IP地址和端口可随意变的,由它发起的通信,一时兴起访问一次,主动出击。

   OS: 多用户, 多任务
       多任务:多进程
           chrome
           Wechat
           网易云音乐
        
   Client: 主动出击,临时可用地址和端口;
   Server: 固定且明确的地址,守株待兔;

  所以说Server端,也就是服务器端必须要有固定且明确的地址,这个地址包含IP和端口,但对于客户端而言,只要能进行访问与回应就可以了,它也必须要有明确的地址和端口,但只是临时的。

  端口就是标识主机上哪一个进程唯一的数字标识,是进程用于实现网络通信时所给出的数字标识,这个数字标识用二进制表示的范围有16位二进制,所以它的范围为0-65535,但0一般不会拿来去使用,所以实际使用的范围为1-65535,但是在这些标识当中,有些进程是需要使用固定的,比如就是服务器端,而客户端随意拿来用都可以,但国际名称互联网机构给其做了一些界定,界定介绍如下:

    通信时,进程的数字标识:
        16bits:
            0-65535: 1-65535
                  1-1023: 固定分配,而且只有管理员有权限启动;专门用于服务进程使用;
                  1024-41951: 半固定;
                  41952: 临时;

  那么真正的互联通信其实就是从某个主机的进程到另外一个主机进程的通信,那么每个主机的进程如何标识地址的方式为IP:PORT,这就是一个套接字,一个IP加上一个端口说明指明了那个主机上的那个端口,从而标识了用来通信的某一进程,所以这就是一个进程的完整地址,我们就把它称之为套接字地址,而真正的套接字是由内核提供的。

       进程地址:
           IP:PORT, socket

  对于我们Linux主机来讲,系统共有四层组成由硬件、内核、库文件、应用程序,这是站在静态视角来看,而当一个操作系统运行起来以后,其实共有两个层面,一个层面叫内核空间Kernel space,另一个层面叫用户空间User space,所谓的用户空间就是各进程运行的集合空间就叫做用户空间,而内核线程所运行的空间位置就叫做内核空间,而内核启动的有进程管理、网络协议栈、驱动程序、内存管理、安全相关、文件系统等;其中有这么一个功能叫网络协议栈,TCP/IP协议栈就在这里,可分为两层第一个叫通信子网,第二个叫资源子网,而通信子网就是由内核使用,而资源子网就是由用户空间来实现。资源子网就是运行在用户空间中的各个服务或者是客户端进程,用来实现通信及资源交换的,或者完成资源的表现形式所定义的,而内核所谓的TCP/IP协议栈,它只是负责能从A主机的数据送往B主机的进程,后背后的一些问题是由用户子网的进程来实现。

  端口是由内核来提供的,每一个进程启动要想完成网络通信,需要向内核申请注册使用该端口,如果该端口没有被其它进程所占用,则可以分配,否则就是端口冲突,一个端口在某一时刻只能被一个进程所占用,不然的话就无法做到唯一标识进程,任何一个服务类的程序,启动时注册一个著名的端口,但两个程序同时注册时,就会出现冲突,例如httpdnginx,都是提供WEB服务,固定使用的是80端口,启动其中一个时,后一个肯定是启动不了的,不然内核就会告诉你注册不成功。那任何一个进程都必须得向内核注册端口(指网络程序),排除只是守护的进程。而这个注册过程我们也称之为注册套接字的过程。

  现在我们了解到,主机与主机之间通信需要用三个地址。

   第一,MAC地址用来实现本地通信;
   第二,IP地址用来实现跨网络通信;
   第三,端口地址用来实现进程间通信;

  那么有了IP地址之后,在主机还得需要使用MAC地址,原因就是IP地址仅仅是用来标识、路由,也仅仅用来标识网络使用的,虽然我们给了主机一个IP地址,但是真正到达本地内部事务以后,需要转换成MAC地址才能完成真正的通信,所以互联网通信是先完成一段又一段的本地通信才完成的。通信过程就相当于是一个大的目标没有变,但是在实行的过程中是需要不断修正的,比如:随便先实现个小目标,但一定要到达大的目标。所以互联网的IP地址仅能标识源主机和目标主机是谁,并且能够选出一条可要选的路来,所以互联网通信无非就是实现的是多段接力的本地通信。两段之间是不断的发生变化最终才能走完的数据包到目标主机,看上去使用的是IP,但最终使用的是MAC地址及本地局域网通信。

  那么A1和X2通信的方式是:首先,确保存在X2这个主机,第二步,A1的报文以本地(MAC)通信的方式发送给R1的1号接口,而这个过程就是本地事务,而R1将该报文交给了2号接口,于是2号接×××给了X2,这又是一次第二段的本地事务,而R1的1号接口与A1通信靠MAC地址,而R1的2号接口考的也是MAC地址,IP仅用来标识A1和X2,而真正通信的是A1上的某个进程和X2上的某个进程而已。因此,真正通信的方式是某个主机的某个端口,和另外主机的某个端口通信,但最终转换为MAC或本地事务之间的交互,从而完成通信,当然这也是在通信子网中完成的过程。

  而到了资源子网之后,需要取决于具体的协议,而且到了具体协议之后还得有一个地址,只不过是应用层的地址,但是我们说了三个地址需要简单总结一下:

   总结:
       MAC:本地通信;范围:本地局域网;
       IP:界定通信主机,源和目标;范围:互联网;
       Port:界定进程;范围:主机;