UC头条:计算机网络入门(问题导向式)
计算机网络入门
如果现在有两台计算机,要实现两台计算机之间的相互通信,你会怎么设计?
最简单的办法,在两台计算机之间拉一条线,计算机之间的通信就通过这条线来进行。通信的方式就是将数据转换成0101这样的二进制高低电平信号通过这条线来传播
如果现在不止两台计算机,比如有五台计算机,要设计一个能够使每台计算机之间能够两两通信的网络,怎么设计?
很显然,如果用直接拉线的方法,每两台计算机之间拉一条线,那么随着计算机数量的增加,拉线的数量会越来越多,越来越复杂,成本也会越来越高
这时,我们就想到利用一个“中介”,所有计算机都拉一条线到这个“中介”上,再通过“中介”来转发,这样就能大大减少拉线的数量,节省成本。这里就提出了计算机网络设计中一个非常重要的思想——转发的思想
既然有了“中介”,我们就可以通过中介来进行通信,那么问题又来了,中介收到了你发给他的消息后,他怎么知道要转发给谁呢?
我们可以给网络中的每台计算机一个标识,相当于计算机的“身份证号”。这里就提出了计算机网络设计中另一个非常重要的思想——标识的思想
比如1要发送消息给3,1首先要把消息发给中介,并且在消息中写上收件人是3,中介拿到消息后把这条消息无条件地转发给网络中的所有计算机,其他计算机拿到消息一看,这不是发给我的,就直接丢弃了,只有3这台计算机拿到一看,哦是给我的消息,于是就接收下来,这样就建立了通信
这种无脑群发的通信方式称为广播
这种无脑转发的“中介”是一个叫做集线器的设备,所使用的”线“是双绞线,它是早期所使用的技术
如果网络中同时有两台计算机发出消息,那么集线器会同时收到两束信号,这两束信号可能会杂糅在一起,造成冲突,怎么处理这个问题呢?
针对这个问题,提出了一种协议——CSMA/CD协议。这个协议可以让这些计算机在发送前先进行载波侦听,就是先检测一下这个链路上有没有其他人正在发送数据,如果没有的话我再发送
这就是CSMA/CD协议最重要的功能,即防止冲突
很明显,集线器设备的这种”无脑转发“的方式虽然简单粗暴,但是有很多缺点——效率低下、通信资源利用率低、不安全。怎么解决这个问题?
在转发时可以采取另一种方式,中介拿到消息不是无脑散播出去,而是拿起来看一看收件人是谁,哦是给3的消息,于是就将消息转发给3,这样的方式明显效率更高,而且更加安全
这种方式也是现在所采用的技术,这里的”中介“叫做交换机
交换机就比集线器聪明吗?它在转发的时候怎么知道哪根线是3的?
交换机比集线器先进的地方在于,它设置了记录的机制。刚开始它和集线器一样,收到消息后也不知道要走哪条线,就直接无脑转发。但是集线器不善于归纳总结,非常死板,一直无脑转发。而交换机就不一样了,在1号发来消息时,他就知道了原来这个端口连接的是1号,他就在表中记录:1号对应xx端口。同时,在无脑转发后,他发现只有一条线上的计算机接收了消息,其他线上的计算机都把数据丢弃了。这样他就明白了,哦原来这个连着这个端口的线是通向3这台计算机的,于是他就在表中记录:3号对应xx端口。那么当下一次有消息要发给3号时,交换机在表中一查,就知道要走哪条线了,就不需要无脑群发了
那么,如果下一次有消息要发给2号呢?交换机在表中一查,诶?没查到!那就和之前一样,无脑群发,看谁接收了,再记录到表中。这样循环往复,发给谁走哪条线,对于交换机来说就一清二楚了
在实际中,给计算机的标识当然不是像1号、2号、3号这么简单,而是采用MAC地址,MAC地址是每个网卡在出厂时就已经写死的,也就是说,MAC地址就是网卡的地址。将网卡插在计算机上,计算机就能参与网络,所以这里的标识标的是网卡而不是计算机
交换机记录表记录的是MAC地址与交换机端口的映射关系,这个记录表称为交换表或MAC地址表
使用交换机会不会产生冲突的问题呢?又是如何解决这个问题的呢?
交换机不会产生冲突的问题。集线器采用的是双绞线,而交换机采用的是我们现在的网线,网线中是有八根线的,正常情况下至少有四根线在工作,这种方式可以实现某台计算机同时在发消息也同时在收消息(走不同的线即可)
这种能够同时在发消息也同时在收消息的通信称为全双工通信
而集线器这种可以发消息也可以收消息但不能同时进行的通信称为半双工通信
当然还有一种,一方只能发消息,另一方只能收消息的通信称为单工通信
交换机可以连接交换机吗?如果可以连接,那又是怎样建立表的呢?
交换机可以连接交换机,这种连接称为交换机的桥接
举个例子,MAC1,MAC2,MAC3对应的三台计算机连接在交换机1上,分别接入端口1,2,3;MAC4,MAC5对应的两台计算机连接在交换机2上,分别接入端口1’,2’;交换机1的端口4和交换机2的端口3’相连接
那么对于交换机1来说,MAC1,MAC2,MAC3之间相互发送消息就会使交换机1记录下MAC地址与端口的映射关系,即{MAC1:1,MAC2:2,MAC3:3}
当MAC1发送消息给MAC4时,交换机1收到MAC1发来的消息,一看是发给MAC4的,他就在表中找MAC4对应的是走哪个端口啊。诶?找不到!但是他可以判断出肯定不是端口1,2,3的,因为端口1,2,3在表中都记录了,都不是MAC4,所以他会走除了1,2,3的其他端口进行群发。这个消息从端口4传到交换机2那里,交换机2又在他的表中找,不管找没找到,反正最后消息会发到MAC4那里,这时交换机1就检测到哦原来只有端口4那条线接收了消息,所以就记录MAC4:4
那如果MAC1发给MAC5呢?一样的道理,最终结果也是只有端口4那条线接收了消息,所以交换机1记录MAC5:4。这样,不管是发给MAC4还是MAC5,交换机都会走端口4,发送给交换机2,再由交换机2去转发
发送数据的时候,MAC地址记录在哪里呢?
MAC地址记录在数据的头部,就像寄信的时候把地址写在信封上一样
其实,计算机网络是分层的,不同的层分管不同的任务,完成不同的功能,提供不同的服务
计算机在发送数据的时候需要先在数据头部加上MAC地址再发送,负责加MAC地址的就是数据链路层,而负责将数据转换成0101这样的电信号的就属于物理层。同时,交换机需要收到电信号要将其解析成数据,这个工作也是属于物理层的。交换机还需要从解析得到的数据的头部提取MAC地址,这个工作是属于数据链路层的
因此,物理层负责的是搞电信号和数据之间的转换的,数据链路层是搞MAC地址的
集线器无脑转发,不搞MAC地址,交换机要处理MAC地址,所以集线器工作在物理层,交换机工作在数据链路层
之前提出了CSMA/CD协议是处理冲突的协议,他是工作在物理层的
一般来说MAC地址表能存的数量是几千,虽然已经比直接拉线效率高很多了,但对于实现全球互联网还是有很大的距离。那么我们还能够怎样进行改进呢?
如果只是使用交换机来连接全球计算机,那么当一台计算机发出消息时,第一个交换机找不到,就会广播到下面几个交换机,还找不到就会再广播、再广播……一条消息发出去差不多要把全球的计算机遍历一遍,这种现象被称为消息洪泛
显然,交换机只能适用于小范围内的网络,对于大范围内的网络需要采取其他的措施
这里可以引入一些概念,网络按照范围来分类,可以分成个域网、局域网、城域网、广域网。个域网一般是个人的一些设备比如电脑、手机、打印机相连组成的一个网络;局域网就范围稍大一些,比如公司网、校园网;城域网的范围就扩大到一个城市或几个城市;广域网是最大范围
交换机在局域网中还是比较高效的,但范围再扩大时就力不从心了
这时候我们就可以把视角放大一点,既然交换机在局域网中是非常高效的,那么我们就在各个区域用交换机来连接成一个个局域网,然后想办法让多个局域网连接起来。想一想当初如何联通多个计算机的?对,就是通过中介!依照这个思路,我们可以再设置一个更高级别的中介,这个中介负责把多个局域网连接起来。
这个更高级别的中介就叫路由器
计算机1与同属于一个网络下的计算机2进行通信时,直接走交换机即可;如果计算机1要与其他网络下的计算机3进行通信,就必须通过交换机转到路由器接入到其他网络,再从其他网络的交换机转到计算机3上建立通信
不同的网络又称为子网、网段
路由器又是如何怎么知道他要转发给谁呢?
在交换机那里我们提出了MAC地址,用于标识连接进网络的各台设备(我们之前举得例子都是计算机,实际上手表、手机、甚至音响等等都可以作为网络设备联网)。在这里,我们需要一个新的标识,来标识各网络,因为路由器是各网络的中介,这里所引进的标识就是IP协议下的IP地址
而与网络设备不同的是,网络是一个抽象的概念,并没有规定大小有多大,也没有划定地理范围在哪里,因此这个标识网络的地址也必须是由网络设备在发送消息时顺带发送出去的。
IP地址不仅仅标识网络,同时也标识了设备。与MAC地址的处理方法一样,IP地址也是加在所要发送的数据的头部。路由器接收到发送来的数据时,也需要从中提取出IP地址。同样的,路由器也采用了交换机的策略,建立了映射表,这个表称为路由表,但不同的是,这个路由表的建立并不是像交换机那么简单,查不到就广播,而是有更加复杂的路由算法得到,这一点我们了解即可,这里就不再深究
我们发现这里又多出了一层,这一层是专门搞IP地址的,称为网络层
因此,路由器是工作在网络层的,IP协议是网络层下的一个协议
IP地址是怎么做到既标识网络,又标识设备的呢?
IP地址由4位0-255的十进制数组成,对应32位二进制数,比如192.168.0.1就是一个IP地址。
同时,在IP地址中又分为网络位和主机位,网络位标识了网络,主机位标识了在该网络下的设备。
网络位和主机位的划分通过子网掩码来完成,子网掩码与IP地址一样,也是32位二进制数,子网掩码取1的部分为网络位,子网掩码取0的部分为主机位
从属于同一网络下的各设备拥有相同的网络位,从属于不同网络下的各设备就有不同的网络位。这样就用IP地址+子网掩码做到了既标识网络,又标识设备
既然IP地址又标识网络又标识设备,那还需要MAC地址吗?
这里我们要注意,IP地址是网络层的提出的标识概念,实际的数据传输过程仍然走的是MAC地址
路由器也是有MAC地址的,在数据链路层范畴内,路由器与其他参与网络的设备没有任何区别,交换机一样会把路由器当作一个有MAC地址的网络设备进行数据传输
既然数据传输过程仍然走的是MAC地址,那么IP地址是怎么转换成MAC地址的呢?基于网络层的通信过程又是什么样的呢?
APR协议可以使IP地址转换成MAC地址,首先设备会发出ARP广播,询问哪台设备的IP地址是这个啊,每台设备都会收到消息,IP地址是这个的设备收到消息后就回应,我的IP地址是这个,然后我的MAC地址是这个.……这样就完成了IP地址到MAC地址的转换
比如网络1的IP为192.168.0.0/24,属于网络1下的设备1IP为192.168.0.102;网络2的IP为192.168.1.0/24,属于网络2下的设备2IP为192.168.1.254。路由器中连接网络1的端口IP为192.168.0.1,连接网络2的端口IP为192.168.1.52,所以路由器的原理实际上就是有多个属于不同网络下的端口IP,相当于黑道白道通吃的中间人角色
设备1向设备2发出数据,首先网络层会在数据前加头部,头部中包含源IP地址0.10和目的IP地址1.254;之后数据链路层在数据前加头部,由于目的IP地址与源IP地址不在同一网段下,因此目的MAC地址为路由器端口0.1的MAC地址;数据传输到路由器端口1后,经过解析和重新封装,目的IP地址和源IP地址不变,源MAC地址变为端口0.1的MAC地址,目的MAC地址变为1.52的MAC地址;传到端口2后,路由器再次对其解析和重新封装,目的IP地址和源IP地址不变,对于MAC地址,路由器发出ARP广播,得到目的MAC地址为1.254的MAC地址,源MAC地址为1.52的MAC地址,最终数据成功发送到设备2