linux网络协议栈(五)网络层 (1)L2与L3

5.1、L2与L3:

网络的目的是使可以访问不同主机的资源,仅以最简单的使用如访问我们软件四部网关技术组的服务器,是通过访问192.168.36.XXX的IP地址达到访问那台主机的目的,而我们自己的主机IP都是192.168.10.XXX,我们的主机和网关技术组的主机不在同一个网段内,这和我们访问我们自己的服务器192.168.10.22/192.168.10.72是不同的。

5.1.1、相同网段的访问:

linux网络协议栈(五)网络层 (1)L2与L3_第1张图片

事实上无需网关192.168.10.1,我们即可访问代码服务器、ixia测试仪、其他主机,可以试着把主机的默认网关去掉或换成一个别的IP地址,依然可以访问上述主机,也就是说只需二层交换机即可达到此目的;但此时如果访问网关技术组的主机是不可能了,如肯定无法ping通192.168.36.106。

如我的主机是192.168.10.55,要访问代码服务器1即192.168.10.22,那么当我发出一个目的IP为192.168.10.22的IP包时,我的网卡必须弄清楚对端的链路层地址,这对于链路层实现是以太网的网络来说,就是MAC地址,可是第一次发送时我的网卡并不知道这个代码服务器1即IP地址为192.168.10.22的主机的MAC地址是什么,这就必须需要一种能够获取对端MAC地址的方式;

对于链路层来说,这种能够记录L3地址和L2地址关系的方式是由“邻居系统”实现的,所谓“邻居”简单理解就是“可以直接访问的其他主机”,具体对于以IP协议为L3协议的网络来说,这种“邻居”的实现方式是通过ARP协议实现(需要注意对于IPV6就变成了ND协议,它类似ARP协议,对于其他三层协议也有其他类似的方不同方式);

关于邻居和ARP具体内容可参照7.3、7.4两节,这里先知道在IP/以太网的网络中,通过ARP协议,我的主机首先广播发送给所属广播域中所有主机“who is 192.168.10.22”,然后192.168.10.22的主机将回复“我是”给我的主机,我的主机由报文中的源MAC即可获知192.168.10.22主机的MAC地址,并把它记录下来,同时还会记录在该IP报文对应的路由缓存中,这样以后就可以直接发了不用再查邻居表项,关于路由的内容见后面几节),这样192.168.10.22的主机就是发送者的一个邻居(通过ping或查看ARP缓存表测试IP是否可达,是我们日常处理问题的常用方式);至此,我的主机获知了192.168.10.22主机的MAC地址,这样我就可以和它收发包了。

至于上图的二层交换机,它的本质作用还是集线转发(当然二层交换机还有很多其他二层相关的功能这里不讨论),只是它比起集线器优势在于它可以按照按MAC地址转发(即MAC地址学习功能,事实上是MAC+VLAN转发,先不讨论vlan),记录从每个端口进入的报文的源MAC,以此获知每个主机对应的交换机端口;这样随着同网段的所有主机不断发送报文,交换机学习到了所有主机的MAC地址和交换机端口的对应关系。

但是如果把我的主机的IP地址改为其他网段如192.168.11.55,那么就没法访问局域网内其他192.168.10.XXX的主机了,要发送的报文甚至在我的主机内的IP层就被丢弃了,而如果某台主机也改为192.168.11.XXX,那么就可以了,这里的原因就是L3的内容了。

5.1.2、不同网段的访问:

还如上面的图所示,如果我的主机192.168.10.55希望访问192.168.36.106,那么会发出”who is 192.168.36.106”的ARP请求报文,这时其他主机除了路由器网关192.168.10.1外都无法回复我,192.168.10.1这时必须行使其ARP代理功能,回复我的ARP请求,那么我的主机就会认为它就是192.168.36.106,记录下IP地址和MAC地址的邻居信息,从此以后需要访问192.168.36.106就发报文给它,而实际上需要192.168.10.1把报文转发给192.168.36.106,事实上对于192.168.36.106情况是一样的,它也不知道192.168.10.55是谁,它也认为包括我在内的访问者都是192.168.36.1。

所以,跨网段的访问,需要路由器网关去转发,当然这需要路由器知道是否应该转发以及转发到哪里。这就是路由器网关存在的最基本意义,连接不同网段内的主机。这也就是为什么我们的电脑都设置192.168.10.1为默认网关的原因。

5.2、L3都在做什么:

5.2.1、IP网络基本原理:

L3网络层之所以存在最大的原因是整个网络由都是一个个的以IP地址为标识的主机拓扑的,也就是说,网络中不论是哪部分的哪一个主机,无论它是用户终端和服务器,还是用于传输转发报文的路由器网关,都是一个个以IP为标识的主机,尽管每个主机的每个网卡都有理论上唯一的MAC地址标识,但实际的网络通信是以IP地址标识每个主机,这里的原因有很多,最重要的原因是IP地址的子网划分方式(涉及IP组网相关知识),这里不讨论细节,简单的说就是一个“大网”IP地址及其带宽接入其底下若干子网,直观的例子就是软件四部这个子网都通过192.168.10.1接入到一个更高层次的子网,然后包括192.168.10.1在内的一些子网又接入到某个更高层次的子网,而这些更高层次的子网研发中心最终会接入到一个或多个能接入Internet的核心路由器网关IP地址(如我司研发中心的公网地址应该是1.202.176.232/32),也就是说根据需求把整个Internet划分成一个个的子网,每个子网又划分成一个个的子网……这样整个网络的主机是以层叠不穷的大大小小的子网组成,子网与子网之间以路由器网关相连接,每个路由器需要记录的地址表信息就可以相对少很多,这样就大大减轻了传输转发设备即路由器网关的负担(当然负责主干通信的路由器所需地址表还是非常庞大的),可以设想下如果以MAC地址去定位每个主机,这将要求传输转发设备要记录非常海量的其他主机的地址信息,检索它们将极其繁琐,所以虽然MAC地址是每个网卡的唯一标识,但以MAC地址去标识、定位每个主机是不现实的。

所以L3层最大的作用就是把报文发送到它应该去(的IP地址)的主机,不论这些报文是广播报文、组播报文还是单播报文,只要是IP报文,L3层的网络传输设备就会通过检索路由地址表寻找该报文应该走向何方。至于这些报文是发送给该主机上的哪个应用程序,这是L4传输层的功能。

需要注意的是,L3层并没有什么确认、重传机制,也就是说是不保证一定能够收发,真正意义的确认、重传机制是做在L4传输层的TCP协议,它提供了通信的保证机制,要直到收发成功为止。

5.2.2、L3层的其他功能:

除了确定报文走向,L3层还有一些其他功能:

可根据IP协议字段实现L3的一些qos功能诸如限速等等,如依据tos字段标识不同报文的不同传输服务,这部分详见5.3节;L3还实现了超长报文的分帧,这部分详见5.6节;

不论是基于linux的协议栈实现还是其他一些协议栈实现(如cisco),都可以在L3实现策略路由,即可以通过标识不限于IP协议字段的报文中的其他字段,如L4协议字段、L5协议字段或其他报文内容字段,实现对报文做特殊标记,对不同标记的报文根据需求做出不同的路由选择,比如让重要报文走高带宽接口,其他报文走低带宽接口,注意策略路由的实现不仅需要路由模块的iproute工具,还需要安全模块工具的iptable工具的配合,这涉及netfilter的内容。这部分详见5.4节;

此外基于L3可实现多主机使用同一接入IP地址访问公网(NAT穿越)、远程安全的访问目的地的方式即虚拟专网(VPN),这两部分详见5.7节。

你可能感兴趣的:(linux网络协议栈,网络层,IP,路由转发,跨网段访问,网关)