网络层
网络层的核心在于:routing和addressing
引入问题:为什么不基于硬件地址(物理地址)进行通讯?
- 广域网硬件数量太多
- 不同的底层网络和设备之间差异较大,介质也不同,帧的格式也不同。
- 第二层设备查找地址时是平铺的一层,不便查找,需要一种有层次的逻辑地址来帮助查找。
Overview
第三层网络层划分成网段(广播域),网段之间通过路由器进行联通。最重要的是IP协议。
网络层接受数据链路层的各种不同的帧(Ethernet帧,Token Ring帧和X.25帧等),忽略底层的不同介质形式,对数据进行网段间的传输。虽然不同的传输介质采用不同的帧类型,但是第三层形成的报文还是相同的。
网络层和传输层的不同在于,传输层只有终端设备,而网络层不仅包含终端设备还有网络中间设备。
第三层的设备主要是路由器。路由器负责将不同的网段连接起来,而每一个端口也连接一个不同的网段,每个端口都有它的一个IP地址。
IP 数据报
这里主要介绍IPV4协议的IP地址和IP报文。
IP报文由首部和数据部分组成。首部又分为固定首部和可变部分。结构如下:
分别进行说明:
- 版本:现在只有IPV4和IPV6两种。使用4位数据表示。
- 首部长度:以4个字节为单位,表示首部的总长度。这里一共4位,所以能表示的最大数是15。那么整个首部最大长度就是15*4=60。固定首部的长度为20字节,所以可以计算出可变部分的长度最大为40字节。
- 服务类型:基本不再使用。占8位。
- 总长度:指的是整个报文的总长度,占16位。
- 标识:方便报文分片后接受时的重新组合,相同标识的报文是来自同一个大报文的。分片:由于路由器连接的介质可能不同,所以报文的格式和最大长度都不同。例如从无线网传来的较大帧无法通过有线网络的一个帧囊括,所以会采取分片的形式传输,即将一个报文拆分成几个报文分别传输。占有16位。
- 标志:协助分片。占有3位。其中比较重要的是DF(Don’t Fragment)位和MF位。DF位为零表示这个报文可以分片,而为1表示这个报文不接受分片。MF为1说明这个片不是最后一片,还有后续;而0说明这已经是最后一片。
- 片偏移:协助分片重新组合的时候找到片的连接顺序。以8字节为单位。占有9位。
- 生存时间:TTL(Time to Live)。数值表示数据报在网络中可通过的最大路由器数量。每当报文被路由器转发的时候,路由器也会把这个数值减少1。如果生存时间归零,路由器就会把这个报文抛弃,然后像源地址发送错误报告。作用:避免传输回路。另外如果想发给相邻网段的设备,可以将TTL设置为1。
- 协议:表示数据段使用的是哪种协议。
- 首部校验和:产生过程是把首部每16位做加法运算,结果取反码。这里不包含数据部分的校验。
IP 地址
报文中的源地址和目的地址都是IP逻辑地址。这里只讨论IPV4的IP地址。
IP地址共32位,分为两段:网络地址和主机地址。
分类:
- A类:第1位为0,从第2位到第一个字节处这7位表示网络地址,后面三个字节表示主机地址。
- B类:前两位为10,从第3位到第二个字节处这14位表示网络地址,后面两个字节表示主机地址。
- C类:前三位为110,从低4位到第三个字节处21位表示网络地址,后面一个字节表示主机地址。
- D类:前四位1110,后面是表示组播(多播)的逻辑地址。
- E类:除前四种以外。保留。
规范:
- 每个网段第一个地址(主机地址段全为0)表示该网络地址,不分给主机。
- 每个网段的最后一个地址(主机地址全为1)表示该网段的广播地址,也不分给主机。
- 受限广播地址:255.255.255.255 适用于所有网络地址,但是不会被路由器转发,也就是受限于本网段的广播地址。
还有一些特殊的IP地址也要保留:
- A段内的10.0.0.0~10.255.255.255
- B段内的172.16.0.0~172.31.255.255
- C段内的192.168.0.0~192.168.255.255
这三种地址只在一个网段内部使用,不会在Internet内转发。
IP地址的发展过程:
IP地址–>标准分类IP地址–>划分子网–>构成超网(CIDR)–>地址转换(NAT)
子网划分
IP地址的分类中包括ABC三类地址,但是往往一些公司和地方用不了一个很大的net段,造成了IP资源的浪费。所以引入了子网的划分方法。
划分子网就是在IP地址的Host段借用一些位数来表示大Net网段下的子网。但是这里借用的位数有限制。给子网分配的位数不能少于两位,因为要保留全0和全1的两种特殊IP地址;另外,留给Host段的位数也不能少于两位,Host段的全0表示网段IP,而全1是广播地址,都要保留。
地址保留使得划分子网后可以使用的有效IP地址变少了。例如一个C类地址借两位用来划分子网,那么子网就只有4-2=2个,而每个子网的主机数量也只有64-2=62个,利用率仅为原来的49%。
子网掩码:用来指示划分子网之后,哪些位是新的Net段,哪些位是Host段。例如一个C类网络的子网掩码为255.255.255.240则说明这个网络Host段分出了4位用来划分子网了。一台主机的子网掩码和它的IP地址做按位与运算就可以得到这个子网的网络地址。
路径选择
路由器可以决定自己的转发路线,而影响路由器选择的因素有很多。
路由器每个端口都有一个网卡,有自己的IP地址,网段号和端口连接的网段一致。而不同的端口应该连接不同的网段。
路由器对消息做转发时会把帧拆掉重组,更改了发送接收的MAC地址。而对于再内部的报文,除了对TTL减1不会做其他任何更改。
分配IP地址的方法主要分为静态分配和动态分配。静态分配指的是人为地或者使用脚本为每台主机指定IP,而动态分配则是依靠一些其他协议给主机配上IP地址,如DHCP协议。
ARP协议
在通常的传输中,往往是知道目的的IP地址而不知道MAC地址,就阻碍了帧的封装。ARP协议就是为了解决这种问题的。
在主机中有一个ARP缓存区,这里以表格的形式储存着一些其他主机的IP地址和对应的MAC地址。ARP Table中的条目是有时效性的,如果一段时间没有接收到来自这个条目的IP地址的消息,这个条目就会被删除。发送信息形成帧的时候会首先去查询ARP Table看看有没有目的IP地址对应的MAC地址信息。
有时候可能在ARP Table中也查不到IP。如果目的IP地址在本网段,发送方的主机就会先在本网段进行一次广播,称为ARP request。其中帧头部包含了自己的MAC地址,而报文中还有自己的IP地址和需要查询的接收方的IP地址。如果接收方接受到这条request,发现自己的IP地址和请求中的相同,那么就会发回ARP应答,来告知对方自己的MAC地址(写在帧头部就行了)。同时一个小细节就是这个接收方的主机也会顺便更新一下自己的ARP Table。发送方受到应答后更新自己的ARP Table,就可以正常组织帧了。
如果目的IP地址不在本网段的时候,有两种实现方式:
- 发送方主机直接发送给配置的默认网关,也就是说发送方主机知道路由器端口的IP地址。发送方会请这个路由器帮助转发。如果不知道网关端口网卡的MAC地址,也可以像上面一样进行ARP请求获得。
- 有些主机可能不支持默认网关,也就是说主机连路由器端口的IP地址也不知道。这时要求路由器启动ARP代理。路由器的端口网卡接收到广播信息并将自己的MAC地址通过ARP应答的方法发给发信方主机。这样,发信方主机下次发送信息的时候直接给这个端口的MAC地址发信就可以了。ARP代理就如同网关路由器扮演主机所找的目的主机,主机只要和网关沟通就好了,网关负责和真实的目的主机沟通。
默认网关的作用就是:当主机遇到一个要发到非本网段IP的包时,如果这个IP又不在自己的ARP table中,主机就会把数据发给默认网关IP。如果默认网关IP是本网络的广播地址(主机段全为1),那么主机的数据层将不再关心目的IP处的Mac地址,而是以全1作为Mac地址也就是广播地址发送出去。
网络层服务分类
根据侧重点不同,可以将网络层服务分为面向连接的网络服务和无连接的网络服务两类,或者分为虚电路交换和分组(报文)交换两类。
面向连接的网络服务:任何发送数据服务之前,首先要建立连接,使得所有数据进行有序传输。类似打电话的过程。
无连接的网络服务:不要求实现建立会话,而是直接发送数据。不用处理大量上下文工作。类似于发短信
虚电路交换:现在发送方和接收方之间建立一条虚电路。优点是传输更为可靠,但是问题是会造成电路的利用率下降,因为虚电路部分在传输过程中不能复用。是面向连接的网络服务主要使用的方式。
报文分组交换:和虚电路相对立,是将原始数据分成子报文,然后将每个报文分别发送。接受的顺序可能是乱的。是无连接的网络服务主要使用的方式。
网络层的路由
路由器的内存中存有路由表,路由表有两种获得方式,一种是静态,即管理员直接将路由信息写入;另一种是动态的,即路由器有一进程持续根据一些规定好的路由协议动态更新路由表,这样可以适应变化。
当有信息传达给路由器时,路由器会首先将目的IP地址和子网掩码进行按位与运算得到目的主机所在的网段地址,然后查询自己的路由表并选择端口进行转发。转发的路线是由路由器所决定的。但是可能网段地址在路由表中查不到,这时如果有实现配置默认路由,路由器就会把报文转发给默认路由(这种情况通常是发给外网的)。
路由协议
路由协议总的来说可以划分为两大类:
- IGP,是一个自治系统内部所使用的内部网关协议,包括有RIP, IGRP, EIGRP, OSPF等。
- EGP,外部网关协议,指的是很多自治系统之间的路由协议。包括有EGP, BGP等。
IGP 内部网关协议
又可以分为两类:
- DVP 距离矢量路由协议,包括RIP和IGRP
- LSP 连接状态路由协议,包括OSPF
DVP 距离矢量路由协议
从邻居的视角进行观察,是基于跳数选择路径的路由协议。
获得路由表的方式为定时和邻居路由器交换路由表信息。
如图,一开始ABC三个路由器都只知道自己两个端口所连接的网段,然后每过一个时间周期,相邻的路由器之间会有一次路由表信息的交换,这样一来路由器逐渐就知道到达这个系统任何一个网段所需要的跳数了。在转发信息时会优先选择需要经过跳数比较少的路径走。
DVP的常见协议有:
- RIP(route information protocol):最远可以到达的跳数为15,每30秒将路由表广播出去。
- IGRP(后来发展为EIFRP):是思科的一种协议。最远跳数为255,每90秒路由器交换路由表。事实上这个协议不仅参考跳数,还考虑了带宽、负载等其他因素。
LSP 连接状态路由协议
基于全局视角交换路由表,选择路径根据多角度考虑的路由代价(带宽、负载等),路由器之间交换链路信息,也就是整个网络的拓扑图,不再仅仅是路由表。
节点之间交换拓扑数据库,然后每个节点以自己为根,根据线路状况按照最小生成树算法生成移库SPF树。交换是基于事件触发而不是定时的,也就是说当线路发生变化时才会更新数据。
这里常用的协议是OSPF协议。它的线路评判标准是基于带宽,缺点是内存使用会比较高。是现在使用最多的一种路由协议。
ICMP
因特网控制报文协议。
指定这个协议是为了提高IP数据报的交付成功机会。
如果是一个IP数据报是一个ICMP报文,那么数据部分符合ICMP协议,构成如下图:
ICMP报文主要包含差错报告报文和查询报文。
查询和应答报文的首部通常如下,首部还有一个ID号和SEQ Number 序号组成。这个序号在NAT和PAT地址转化中会充当“端口号”的作用,用于区分内网的主机,详细可以参考我的另一篇博客: 用packet tracer验证NAT机制的最后一部分说明。
如果是差错报告报文,报文中会截取原报文数据部分的前八个字节来组织ICMP报文,组织形式如下:
ICMP查询报文的最常见应用就是ping了。ping所使用的就是ICMP的Echo request和Echo reply消息实现。ping直接使用网络层的协议,并不涉及到第四层的协议。
VLSM
Variable Length Subnet Mask,可变长子网掩码
介绍
在经典路由中,数据包的首部是只有IP地址而没有子网掩码的。这个时候要获得子网掩码有两种途径:要么判断IP地址的类别(ABC类),要么是在同一网段的设备间通讯直接默认和本网段的子网掩码相同。
但是在经典路由中,由于没有对子网进行进一步有效划分和利用,存在着IP地址浪费的问题。
VLSM技术中,可以根据网络的差异来给子网分配不同的子网掩码,即从host段借出不同的位数给子网。这样可以显著提高地址的利用率。也就是说在一个大网段中,可以用不同的子网掩码分给不同子网。但是这要求在数据包的首部应该包含子网掩码的信息。
现在的大部分路由器和很多协议都是支持VLSM的,也就是说,它们都已经支持在数据包首部放入子网掩码信息了。
由于报文中包含有子网掩码的信息,子网的网络段地址即使全为零也不会产生误会。这样一来,host段借给子网的那些位全为零的时候也是有效的子网地址,所以划分出的子网数量也比之前多了一个。(注意:考试中除非注明zero subnet available,否则还是认为全0地址和全1地址均不可使用)剩余host段仍然是全0和全1地址不能使用。
实例
例如在下图的案例中,某公司购买了一个C类IP网段地址要进行分配。改公司分布在不同位置,而且不同位置的主机数量不相同,他们之间用路由器相互连接。
可以看出,现在分配IP地址的时候需要划分7个网段(路由器与路由器端口之间的也要计算在内)。如果不使用VLSM将不能实现子网划分。
使用VLSM将对子网进行从大到小的分层划分,如下图所示。
这样一来不仅利用有限资源完成了IP的分配,还剩余大量IP地址资源备用。
路由聚集
由于子网划分应用广泛,路由器的路由表一再扩大。为了减轻路由器的压力,提高路由选择的效率,出现了路由聚集的技术。
路由聚集就是将之前划分出的很多子网在与外网沟通时,连接的路由器会把子网合并成一个网络,也就是说会把一部分子网的位视为host位。这样一来对外时,内部的子网结构就被隐藏了,大大缩减了外部路由器的路由表。
如图所示,新的子网掩码1更少,将之前表示子网段的一部分位掩去。