网络基础知识学习 – 网络层

/ 0评 / 0

我们平时配置网络打交道最多的就是网络层,我们说路由器处理的也是基于网络层,虽然很多路由器都有一定的L7处理能力,甚至为了部署BGP这些不还要支持TCP协议嘛,还有抓包分析功能等等,但是我们说到网络层,都是说OSI模型第三层,他相对复杂,可以说学完这一部分,对于我目前的需求,就已经会一半了.

我们平时打交道最多的就是路由表,路由表既可以通过自动配置,比如BGP,OSPF,RIP,或者本地链路自动发现,DHCP下发等等,也可以手动配置,下面显示的是一个互联网路由器的路由表.

网络层上的传输分两种模式,一种是面向连接的虚电路服务,他就像通信中必须保持一条稳定的连接,虽然是虚拟出来的,比如电话服务,另一种是无连接的数据报服务,互联网用的正是后面这种.可靠的通信需要用户来保证,由于每个需要发送的数据都称为分组,分组可以走不同的路由路径到达目的地,就像把数据分成很多车来分装.

从之前数据链路层的知识点中知道,以太网不保证传输有效性,Wi-Fi虽然保证,但是最后也要到以太网出去,而本身无连接的数据报服务也无法保证传输有效(IPv4有校验码),所以保证有效的传输还得靠上层的TCP,那网络层也必须约定一个方法,才能互相通信,这个约定就是IP网.

那IP通信就必须要用地址,分类编址和子网划分法已经成为历史[RFC1812],现在用的都是CIDR方法,可以更精细划分网络,而且保留地址也不断削减.除掉下面的保留地址,其他地址都是公网可全局路由的.

前面有说到,最主要的任务是构建路由表,如果有子网划分特别散,那就需要使用路由聚合方法来做一个大的条目,大多数路由器都自动支持这么做.

比如我们从APNIC申请了一块/24分给机房里的每一台服务器,使用FLSM(定长编码)虽然容易规划,但是容易造成浪费.比如按/27分配,那么一个/24能切8个/27,但是不是所有服务器要的IP都很多,甚至路由之间都占一个/27,好浪费啊.

采用VLSM(变长编码)虽然灵活性没那么高,但是他浪费的也少,在实战中如果网络1申请的是/28,会为他预留/27那么大,如果他有需求可以直接扩大子网,如果IP不够用还可以再启用预留的/28.

另外要记得IPv4是有几个保留地址不能用,第一个地址是网络地址,最后一个地址是广播地址,所以每划分一个段就少了两个IP了.

记得上一节说的网络链路层吧,他们通信的基本单位是链路,用的是MAC地址,为什么全球寻址不用MAC地址呢,首先MAC地址寻址很难做类似CIDR的操作,另外就是MAC地址他个数其实是更少的,同时MAC地址是数据链路层的,路由传递用的还是IP地址,两个公网IP互相通信时,链路层每一个链路都让网络层使用ARP协议获取另一边的MAC,然后继续通信,而源地址和目的地址不变,路由器通过查找路由表决定要不要把你数据包转发到哪里.

另外由于链路层可能随时改变,所以ARP高速缓存也是有过期时间的,不然改变了线路不改变IP岂不是不知道线路另一端MAC已经改了,链路层不就无法发送数据了.

前面说了网络划分CIDR,如果同网段,则不需要网关就可以完成通信,因为他是直接交付,和路由器没什么关系,否则就需要路由器查表,看看应该怎么找到下一跳.而路由器的不同端口可以属于不同网络,路由就是这个意思,把一个端口的包路由到另一个端口.除了VLAN,路由器也能隔离广播域,你想一下如果不隔离广播,岂不是我在这里ARP,全世界互联网都要收到.

在网络层,IP数据包就是最常见的数据包,比如IPv4/IPv6帧,我这里就不展开帧来说了,具体来说就是指示后面的数据如何装填,以后是否是分片数据等等.

手动路由就是我指定目的地去哪里,他的下一跳在哪,这个很简单,我们现在说说动态路由协议.

RIP会每隔30秒向自己连接的路由发送自己的路由表,当收到别人的路由表的时候在别人路由表的距离位+1,如果距离=16,则代表网络不可达.

举例4个路由器,更新后结果可能是这样的.

他并不考虑网络质量.比如下图中RIP会认为下面的距离短,所以他是优先的.

如果上下两条距离一样,他会都收下来使用.

RIP有坏消息传播得很慢的问题,因为他会发送自己的完整路由表,所以会造成不是故意的谣言路由表.

为了解决上面的问题,OSPF就出来了,这里的开放是使用了一些开放的算法.并且把端口代价变成考虑目标.用100Mbps除链路带宽,小于1则设置为1,得出链路代价,这样就可以避免路径短但是慢的问题.

每个人都会发送LSU来高速网络自己的LSA是什么,LSA包含自己的直连网络和非直连网络及其代价信息,最后整合,LSU也需要定期同步,这样路由器就收到完整的LSDB了.

OSPF为了解决大型网络收敛问题,还可以分开不同的区域来操作,比如R6接外部网络,所有网络都经他出去,R3,R4,R7都接受其他区域的更新,这样R5,R6的维护就只管到这些区域边界路由器的成本就行了.

最后一个就是BGP,这个可用的太多了,不同AS之间,大型内部网络之间都可以用,BGP也是交换路由为主要目的,不过交换的路由是全球性的,BGP内容比较多,而且可以通过BGP社区来控制一些路由行为.BGP的选路原则也相当的复杂,包含管理员手动调节和动态自动调节.

那我们获取到了路由表,接下来可以做些什么?如果没有默认路由或者这个网络就是不通,路由怎么通知我们,这就涉及到ICMP了,ICMP除了回应我们的ping,通过icmp包的时间戳估算延迟,他还会可以把一些错误信息带回来,比如目标不可达,UDP端口不通,我们用到的traceroute,也是通过设置TTL为较小的数值,使得中途被路由器丢弃,而得到路上还有谁.

traceroute利用这个特点.

设置的下一跳不是最好的结果.

路由的功能还有防火墙分析,NAPT(现在基本不可能存在纯NAT,都是NAPT,就是带端口映射的NAT!),隧道服务等等.

说完ICMP,这里还有一个重点是IGMP,在IPv6中,IGMP不存在,ARP和IGMP都封装到ICMPv6中了.为了简化理解,现在说的是IPv4的IGMP.我们把IP设置到多播IP中,就会加入到多播组,多播IP里也分为用户多播和保留为特殊协议的多播,比如OSPF就使用多播协议.多播IP也要映射到MAC地址方便数据链路层处理.

因为还有5个比特无法映射,所以有时候在网络层还需要做判断,这当然是设备自行完成的.

为什么说多播和IGMP有关呢,这就因为设置多播后,如果路由器也支持,路由器收到一份发送给多播组的数据,就会自动复制多份给下面的在多播组内每一个人,那么谁在组内,这就要有人声明这个多播组是存在的,只要组内有一个人发送这个组是存在的,那么通过ARP和IP识别,就能找到整个组里所有多播成员了.如果有人要退出组,那么退出后路由器也会问还有人在多播组吗,如果有,路由器仍然要处理这个数据.

一个网络中有多个路由器,他们需要建立多播关系,则需要考虑多播包经过哪些路由,哪些路由需要转发,通过IGMP确认要不要嫁接或者剪枝.

多播大多数在局域网使用,主要是源主机不用挨个发送每一个数据副本,节约很多带宽.具体要了解更多可以看RFC1075,RFC1585,RFC2362,RFC3973,RFC2201.

不知道有没有想过这么一个问题,当我们拿着手机移动了很多个基站,正在下载的文件也不会断开,这就是基于网络层隧道技术实现的移动IP技术,主要就是在你联网一刻,你先拥有一个永久地址(这个永久指的是这次联网),然后等你到了别人基站,数据包依然发送到你归属网络(获得永久地址的地方),由你的归属网络把数据打包到隧道里再通过外地代理发给你,全程是透明的.

如果是发送则可以直接使用外地代理,也是透明的.

如果要维持固定主机是透明的,那么可能会发生一个奇怪的问题,明明这个固定主机距离你有更好的路由,却造成了三角形路由问题,绕大圈.除非让固定主机运行一个代理发现,这样网络就不透明了.

我们前面说的路由,一直都是说目标IP地址在哪,应该下一跳在哪,现在有提出的SDN,扩大了路由的这个选择范围,

他把路由搞成了两个层面,这样上层专注如何规划路由,下面专注如何转发包,使得全局路由都是受控的,而且路由调度也变得更加灵活.比如OpenDayLight就是一个SDN控制器,对于大型内部网络来说是非常有效的手段.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注