前面小哥跟大家介绍了在Linux平台的的UDP和TCP的多线程编程等等,采用的编程模型一般是客户端与服务器模型(C/S模型)。而前面的知识只是学习了一台主机到另外一台主机的通信过程,或者说应用程序之间的通信,而实际报文是如何通过交换器或者路由器进行传递的呢?如上图所示,是一种常见的网络拓扑形式,主机通过交换器,再经过路由器等最终可以访问到右侧服务器。那么从今天小哥就跟大家一步一步讲解这中间的一些过程。当然在学习的过程中,一般不太可能在现实环境中搭建这样的平台,如果你有这样的条件也是可以的,通过抓包工具进行测验学习。但是更加方便的是使用一些网络的仿真工具进行测试、仿真所搭建的网络拓扑和通信,比如常用的PacketTracer工具等。
如下是集线器常用的拓扑形式:
集线器可把多台主机互联到同一网段的网络中,具体集线器是如何工作的,我们以PC1 ping PC2为例讲解该过程,从而解释集线器的工作内容。PC1使用ping命令主要采用ICMP网络控制报文协议向PC2发送报文,而ICMP在IP层之上,可以认为其也在网络层。
那么当网络层的报文发往链路层,其需要通过目的主机IP获得对应的目的主机mac地址,而每个主机都有自己的一张arp表,即目的IP地址与mac地址映射的表格,在windows的cmd命令栏中可以输出arp -a进行该表的查询。在首次通信的过程中并没有对应的映射数据的存在,所以当ICMP报文下发到链路层以后,其在对应的arp表中无法寻找到目的主机对应的mac地址。(注意 : ICMP报文发请求和应答都是单播)为了获得目的主机的mac地址,链路层会使用arp协议(也叫地址解析协议)进行广播获得对应的mac地址,目的主机ip地址相同的主机会进行单播应答,其他主机会丢弃,从而更新本主机的arp表,以便后续使用。上图的时间表示的是网络延时,因为回复和发送都需要传输时间;TTL表示生命周期,一把是64或者128,单向每经过一个路由器其TTL数值会减1,如果TTL在传输过程中降为0了就会被丢弃。
从上面的通信过程我们可以知道,通过集线器发出的数据均为转发到连接在集线器上的其他设备上。
但需要注意的是:
1、其不是广播,而仅仅只是一种转发,其转发的数据目的mac并不是8个FF。
2、集线器其工作在物理层,并且是共享带宽,如下图所示:
由于集线器是工作在物理层,几乎是无条件转发数据,所以每个设备会平分集线器的带宽,比如40M的带宽,那么4台主机,每台主机的带宽就只有1/4=10M。3、功率放大功能,网络数据的传输都是会被衰减的,那么集线器为了更好的转发,集线器会使用自身电源来对传输的数据进行处理,从而使得更加稳定的传输。
前面小哥跟大家介绍了一下集线器的工作原理,其大致功能就是在物理层直接转发所有的数据到所连设备,今天来看看交换机。
交换机在网络中的接法与交换机类似,多台主机连接到一台交换机上从而可以实现相互之间的信息交互。
但是交换机与集线器最直观的不同就是其工作来链路层,相关报文数据只会转发到对应的设备,而不会进行无条件转发。同样我们还是以之前的ping命令为例来简单介绍下:当PC1 ping PC2的时候,首次报文分别是ICMP和ARP报文,通过ARP广播获得对应目的IP的mac地址填充到自身ARP表中。上图是不同协议报文的大致流向,与前面介绍的集线器不同是PC1和与PC2之间的交互报文不会再经过交换机转发到无关的PC3和PC4。就好像交换器知道对应主机的mac地址,然后进行相应的识别转发,这也是说为什么交换器工作在链路层的原因,所以也叫二层交换机(二层为链路层),当然还有一些交换机在网络层中增加了新的功能,比如三层交换机(具有网络层的相应功能,如VLAN虚拟局域网划分)、四层交换机(具有传输层的相应功能,如端口映射功能)
交换机主要工作在链路层,原因是其在主机通信的过程中会记录通信过程中的相应信息,比如mac地址等。当下一次主机有数据需要外发,那么交换机会识别报文的目的地址根据之前所记录的信息进行对应连接端口的转发,当然如果是广播帧交换机也会广播到所有的端口,一种类似于自动适应、学习的机制。所以交换机其网络带宽几乎不再是共享了,除非交换机处理能力有限。
前面小哥跟大家介绍了一下集线器和交换机的工作原理,今天该带来大家非常熟悉的路由器了,熟悉归熟悉,路由器在网络中到底是怎样工作的,估计还有一些朋友不是特别了解的。
集线器和交换机大部分都只能工作在同一网段,如何从一个网段访问到另外一个网段呢?这个时候就需要使用到我们的路由器。
路由器也叫做网关设备(Gateway),它是不同网段通信的桥梁。
上图源于网络,仅供学习参考,侵删
如上图所示应该是大家非常熟悉的示意图了,目前大部分的路由器都是路由器+交换机的模式,WLAN口用于接外网,LAN口连接到当前局域网,一般LAN口有多个,为了满足用户可以多台主机设备链接到当前局域网。
值得注意的是路由器工作在网络层,通过IP地址来识别网段进行处理。
一个网段连接到路由器上的位置,我们称为网关,访问其他网段的主机就必须要通过这个网关来进行数据的转发,你可以把路由器上的网关看成是一个转发的主机,它也有其IP地址,一般我们设置为该网段常规IP地址的最大值或者最小值(如掩码为255.255.255.0则一般选192.168.1.254或者192.168.1.1)。
比如在windows中的网关配置:
路由器其实内部存在多块网卡,实现转发可以看成从一张网卡转发到另外一张网卡并进行发送。当一台主机发送数据到其他网段的主机或者服务器,首先网络层判断是否是本局域网网段IP,如果不是,就把数据发送给对应的网关。当数据从网络层发往链路层,在链路层中首先查找本机的arp表中是否存在网关的mac地址,如果没有找到网关的mac地址,就会使用arp协议广播数据从而获得网关的mac地址并更新ARP表,然后把所要发送的数据进行打包,其中网关的mac地址作为目的mac地址进行发送。这里我们以PC1向另外一个网段中的PC5发送报文,数据到达链路层以后会判断不是当前网段IP,所以会封装网关的mac地址,从而发到对应网关,也就是上图中的192.168.1.3的网卡,那么路由器接收到该数据以后该如何转发呢?路由器首先会判断报文的目的IP是否在该路由器所拥有的网关接口处于同一网段,如果有则直接转发,所以PC1所发的报文路由器会直接转发给PC5。那如果PC1发送报文给PC4,对于路由器该如何处理呢?同样与前面的的PC1访问PC5类似,路由器1通过接收到的目的IP查找是否有接口的网段匹配,如果找不到就通过查找路由器中的路由表(类似于路标)根据目的IP网段找到所要转发的网关接口即下一跳地址(Next Hop),此时报文的目的mac地址为下一跳的地址,而源地址为当前接口的mac地址,如果在下一个路由器还没有找到对应的网段,路由器会重复上面的过程根据路由表继续转发。同样当数据报文从PC4应答PC1相应的路由器2也会在路由表中存在相应网段对应的下一跳转发。值得注意的是 : 在不同的网段中报文中的IP地址是不会发生变化的,也就是目的IP和源IP不会发生改变,只是对应的MAC地址发生变化。前面小哥跟大家说过路由器工作在网络层,IP表示着对应的主机,一旦变化则无法再识别,而mac地址只是标识对应的物理通信硬件,所以不同网段的报文发送需要经过不同的设备,自然就需要改变报文中的mac地址来进行转发。所以当你要在不同网段访问其他主机或者设备就需要中间加入路由器。