计算机发出的网络包都会通过集线器,路由器等设备转发,最终到达目的地。这些设备在转发包的时候只会查看包头部的控制信息,然后就会将包送到下一个目的地。本章我们将探索一个网络包经历集线器,交换机以及路由器最终进入互联网的过程。
1. 双绞线究竟是干什么用的
在这之前,我们先看看常说的网线究竟是什么。
上一章说到,我们的网络包通过层层包装,最后由网卡的PHY模块将包转换成电信号,这些信号就会通过RJ-45接口进入双绞线。RJ-45接口就是这个东西
但是信号到达集线器的时候会和出发时不一样,主要原因是能量衰减和噪声的影响。
电信号在传输过程中会因为电阻而损失能量,我们传输时候的正方波信号的拐角会因此变圆滑。
同时噪声也会使得波形产生失真。噪声是网线周围的电磁波,我们高中物理学过,电磁波遇到金属导体,切割磁感线就会产生电流。这种电流和我们传输的电流会混杂在一起,造成信号失真。这就是噪声的影响。
而双绞线的设计就是为了抑制噪声的影响而发明的。双绞线的螺旋形结构,使得电磁波切割磁感线时候产生的两个电流方向相反,从而使得噪声电流相互抵消,噪声就得到了抑制。
2. 集线器是如何广播数据包的
当信号到达集线器后,就会被集线器广播到整个网络当中。集线器的内部如图所示
可以看出,集线器的每个接口后边都有和网卡中PHY模块功能相同的模块。信号在到达集线器模块后,就会进入中继电路,中继电路的功能就是将输入信号广播到所有集线器的端口上。接下来,信号就从所有接口流出,到达连接在集线器上的所有设备。
集线器会将信号原封不动地广播出去,所以即使要广播的信号实际上受到了噪声干扰,也会原样广播。
3. 交换机是如何转发数据包的
交换机和集线器是不一样的设备,交换机并不只是简单地让信号流过,而是现接收信号并将其还原为数字信息,然后再重新转换成信号发送出去。
交换机也有多个端口,每个端口都有一个PHY模块和MAC模块,其中PHY模块的工作当时和集线器的是一样的,都会将信号进行接收。但是之后,PHY模块会将接收的信号转换为通用格式,然后转发给MAC模块。MAC模块将信号转换为数字信息,然后通过包末尾的FCS进行错误校验,如果发现错误,说明这个包的数据已经坏掉了,就丢弃这个包。如果没错,就存放在缓冲区中。
这部分的操作和网卡是相同的。但是网卡会在接下来检查MAC头部的MAC地址来确认这个包是不是发给自己的,不是会丢弃。但是交换机就不会管这个。
交换机的内部构造如图
将包存入缓冲区后,接下来就会查询交换机的MAC地址表了。MAC地址表主要包含两个信息,一个是设备的MAC地址,一个是要去往这个设备需要走的端口。MAC地址和端口是一一对应的。
例如我们收到一个包,这个包的MAC头部存储的接收方MAC地址为00-02-B3-1C-9C-F9,那么就和图中第三行匹配,那么交换机就会将包转发到第8号端口。
MAC地址表也需要维护的,需要不断地更新和删除地址。交换机会在接收到一个包的时候,解析其MAC头部,若这个包的发送方MAC地址不存在于此交换机的MAC表中,就会将其发送方的MAC地址和接收到这个包的端口号记录在表中。同时,有可能出现某个端口对应的设备被移走了,比如我将笔记本从会议室拿走带到别处,那此时这个MAC地址就失效了。因此MAC地址表中的记录不是永久有效的,每隔一段时间会被自动删除。
同时,若一个包的目标MAC地址在这个交换机的MAC地址表上查不到记录,此时交换机就会向所有端口广播这个数据包,这样如果目标设备在的话并回复这个数据包,交换机就可以将它的地址写入地址表中了。
若当一个数据包的发送和接收方的MAC地址是相同的,交换机就会丢弃这个包,因为很可能这个包实际上不是发给自己的,自己不用负责转发,如下图所示
这里再提一嘴,交换机可以支持全双工模式从而提高传输效率,而集线器则不能。
4.路由器是怎么转发包的
网络包经过集线器和交换机后,现在到达了路由器,并在此被转发到下一个路由器。转发的工作原理也与交换机相似,但是具体过程还是不同的。因为路由器是基于IP协议设计的,而交换机是基于以太网设计的。
路由器的构造如图
路由器大致可以被分为转发模块和端口模块两个部分,转发模块负责判断包的转发目的地,端口模块负责包的收发操作。
转发模块内部则有一个路由表,在转发的时候进行查询,路由表长这样
路由器端口模块可以安装许多不同的通信技术而不是仅限于以太网,例如ADSL,FTTH等等。每一个端口都具有自己的MAC地址和IP地址。
路由器接收包的过程是这样的,这里只介绍以太网端口。首先,路由器会接收到网络包,端口的PHY模块和MAC模块会将信号转换为数字信息,然后通过包末尾的FCS进行错误校验。有问题就丢弃,如果没有问题则再检查MAC头部的接收方MAC地址看看是不是发给自己的。
如果是则放入缓冲区,否则就丢弃这个包。这点和交换机不同,交换机就不用查看MAC头部,只需要无脑转发就好。
成功接收包后,这个包目前的MAC头部就完成了使命,路由器就会丢弃包开头的MAC头部。接下来路由器会查询MAC头部后边的IP头部信息,找到IP头部中接收方的IP地址,然后查看路由表,通过路由表中子网掩码和目标地址的运算,找到最匹配的那一行,将网络包向那个网关那一栏对应的IP地址转发。 如果没有匹配项目,则路由器会将包转发给默认网关,也就是路由表中子网掩码为0.0.0.0的记录表示的默认路由。这部分的操作和计算机的网卡是一样的。
接下来就是包的发送部分了,这一步和协议栈中IP模块发送包的过程大致是相同的。我们需要重新加入MAC头部,这个MAC头部中目标MAC地址应该是路由表匹配的那一栏中网关项目的IP对应的MAC地址。为此我们还需要通过ARP协议查询IP对应的MAC地址(当然路由器也有ARP缓存,如果查不到才会发送ARP请求)。将得到的MAC地址写入这个新的MAC头部,就大功告成了。
当然也有可能网关内容为空的情况,此时表示已经到达接收方IP地址对应的以太网,不需要转发到下一个路由器了。则接收方的IP地址就是下一个转发目标。
接下来网络包就会被转换成电信号并且通过网络端口发送出去。发出去的网络包会通过交换机到达下一个路由器,由于接收方的MAC地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输给下一个路由器。下一个路由器会将包转发给再下一个路由器,经过层层转发后,网络包就到达了最终目的地。
5.路由器与交换机的关系
我们可以通过路由器包转发过程看出路由器与交换机之间的关系。这也是IP协议与以太网协议之间的关系。路由器通过替换收到的包的MAC头部,从而委托交换机将其转发出去。而这种委托只是要求交换机能将包传输到下一个路由器就好了。
IP(路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。当然,这里的以太网可以替换成任意的通信技术,如无线局域网,互联网线路等。
6. 路由器的附加功能
(1) 地址转换功能
由于接入互联网的设备不断增长,如果每台设备都都分配一个独立的IP地址,那么IP地址将会很快用完。解决这个问题的关键就是固定地址的分配方式。
对于两个局域网来说,由于这俩局域网是完全独立的,那么在这种情况下,两个网中的设备们之间不会有数据包流动,那么这俩网内的设备具有相同的IP地址也是没有关系的。即局域网内部设备的地址不一定要和其他公司不重复。局域网内部设备就没有必要分配独一无二的地址,从而大幅度节省了IP地址的空间。
这种可以重复的地址被称为私有地址,相对的,之前说的唯一的IP地址就叫做公有地址。私有地址的可命名范围就这些:
这些地址属于公有地址中还没有分配的范围,可以被私有地址使用。这个范围的地址和其他局域网重复也没有关系。
那如果局域网内的设备需要访问外网怎么办?我不能顶着这个私有地址给人发网络包吧?这时候路由器的地址转换功能就派上用场了。
前边说过,局域网内的设备用的是私有地址,是可重复的。但是路由器是用于介入互联网所用的设备,路由器的端口是有公有IP地址的。所有的局域网设备要访问外网的时候,发出的网络包会被路由器改写,改成路由器的IP地址和一个随机分配的空闲端口。这样,局域网内的设备就使用路由器的IP地址发送消息了。对于同一局域网的不同设备,因为其使用的端口号不同,也很容易区分彼此。需要同时发送数据包的时候也不会冲突。
同时,路由器中会维护一个地址和端口对应的表格,具体长这样
如果有外部设备给局域网内部设备发送数据包,路由器就会根据端口号查表,找到对应的私有地址,改写数据包头部后,就可以发送给那个设备了。
通过这个机制,具有私有地址的设备也就可以访问互联网了。从互联网一端看,实际的通信对象其实是路由器。
(2) 包过滤功能
路由器的包过滤过程原理就很简单,就是当路由器对包进行准发时,会根据MAC头部,IP头部,TCP头部的内容,按照事先设定好的规则决定转发这个包,还是丢弃这个包。大多数防火墙就是利用这一机制防止入侵的。