目录
1. CIDR无分类编址
由于互连网的兴起,如果还是采用ipv4每人一个ip,那么42亿ip地址一定是不够用的,为了解决这个问题就有了CIDR无分类编址。
传统的IP地址分配方式:
举一个简单的例子,某公司需要2000个ip地址,那么如果使用c类地址那么只有2的八次方 = 256个地址能用显然是不够的,所以使用b类地址,那就是有2的16次方 = 65536个地址,剩下的ip资源就会大量的浪费。
CIDR无分类编址分配IP:
分配21位网络号,那么主机号就是32 - 21 = 11,也就可以有2的11次方 = 2048个ip地址可以提供分配。
1.1 CIDR的子网划分
1.1.1 定长子网划分
这样做有什么缺点呢?例如我们使用2bit作为子网号,那么14位是主机号,那就意味着每一个子网都要2的14次方个ip地址,那么实际情况下,有些子网可能根本不需要这么多的ip地址,就会造成资源的浪费。每个子网都一样大,资源就会造成浪费。
1.1.2 变长子网划分
从自由分配的主机号里面每次取出1bit作为子网号,就可以分为两个子网,每个子网依次重复之前的步骤。
不断划分子网的网络前缀不是其他子网的网络前缀的前缀,其实就是哈夫曼编码。
2. 路由聚合
当路由表项的部分网络前缀相同并且转发的出口一致,就可以合并为一个路由表项。这样的聚合叫做路由聚合也叫做超网。
优点:
①路由表变小,内存占用减少。
②查询速度减少。
缺点:
①可能引入无效地址;但是转发的时候会走默认0.0.0.0,此帧将会被丢弃。
2.1 最长前缀匹配原则
当目的地址与表项中多个路由地址相同,有限选取匹配程度最高的表项,从该表项的接口转发。
3. 网络地址转换NAT
3.1 端口号
网络层实现了主机和主机之间的通信,但是事实上的通信一定是进程之间的通信,例如微信发送消息只能微信接收,那么我们要实现进程之间的通信就会引入端口号这一概念。
IP地址+端口号就可以锁定某一个主机的特定进程;每一台主机的端口号相互独立。
传输层包含的首部是:源端口和目的端口;网络层包含的首部是:源IP地址和目的IP地址。
3.2 IP地址不够用?
地址是32个bit,如果每一台主机都要消耗全球唯一的IP地址,那么2的32次方 = 42亿肯定是不够用,那么如果一个局域网使用一个IP呢?例如校园网,有成千上万台设备,如果学校只用一个IP,成千上万台设备里面运行了几十万+个进程,我们只需要给这些进程编号即可区分彼此,所以端口号就能做到这一点。
3.3 公网IP和内网IP
一般来说,一个局域网才有资格使用全球唯一的IP,这个IP叫做公网IP或者外网IP。在局域网内部,有一些可以复用的特殊网段例如192.xx.xx.xx等,这些网段只能由内网使用,可以复用。
3.4 NAT作用
使用NAT可以将外网IP+端口号 ==》内网IP + 端口号(特定主机的特定进程)。
发送信息的流程:
首先发送信息的一方把自己的内网IP和端口号、目的进程的公网IP和端口号封装;然后到了距离目的进程最近的路由器,使用路由器中的NAT表对封装内的目的IP和端口进行改写,改写成该网段下该进程的内网IP和端口,最后将封装好的信息传送给指定进程,进程再逐级拆分从而获得真正的信息。
如何进行封装信息:
信息首先会添加传输层的TCP首部,其中包含源端口和目的端口;然后经过网络层添加IP首部,其中包含源IP和目的IP。
4. ARP协议
ARP协议最核心的就是ARP表,里面记录着IP和MAC地址之间的映射。
4.1 如何利用IP地址找到MAC地址?
首先将ARP请求分组封装进MAC帧,目的地址全1进行广播,源地址是自己的地址;当目的路由器收到ARP请求分组的时候,会记录分组中的MAC和IP之间的映射关系在ARP表之中。ARP请求分组进行广播之后,会受到ARP响应分组进行单播,源地址是要找的地址,目的地址是请求分组的源地址。此时发送方的路由器也会记录IP和MAC地址在ARP表之中。
ARP请求分组:
我的IP是xx,我的MAC是xx,要找IP是xx的家伙。
ARP响应分组:
我是你要找的那个家伙,我的IP是xx,MAC是xx。
5. DHCP协议
5.1 DHCP作用
分配IP地址,配置子网掩码、默认网关。
5.2 DHCP分配流程
一台新接入网络的主机会经过以下几个步骤:
①discover:
首先在应用层封装DHCP报文,自报家门,把自己的MAC地址封装。
然后再传输层封装UDP数据报,把自己的端口号和目的端口号进行封装。
然后网络层中封装IP数据报,目的地址是全1进行广播,源地址因为没有分配所以是全0,形成广播数据报
最后在数据链路层封装MAC帧,把自己的MAC地址和全1的MAC地址封装进去形成广播帧。
如果是其他服务器接受到这个MAC帧,一层一层剥开发现传输层里面的目的端口是67,而67是DHCP独占端口,所以接受到之后直接丢弃。
②offer:
DHCP服务端接收到客户端发送的MAC帧就会一层一层拆开,最后发现传输层的端口就是自己的端口,于是返回一个offer。
首先在IP地址池里面找到一个空闲地址,应用层封装DHCP数据报里面存着提供的空闲IP地址租用期、默认网关、子网掩码。
然后到了传输层封装UDP数据报里面存放着源端口号和目的端口号。
然后到了网络层封装IP数据报,目的IP是广播,源IP。
最后封装成MAC数据帧,把客户端的MAC地址作为目的地址,源地址是本地地址,进行发送。
到了路由器直接进行精准发送。
DHCP客户端收到MAC帧之后一层层拆开获得IP地址、子网掩码、默认网关。
③request:
此时在应用层封装DHCP请求报文,内含自己的MAC地址,以及接受此IP地址。
然后去传输层封装UDP数据报,内含DHCP服务器的端口和客户端的端口。
在网络层封装IP数据报,内含广播IP地址和0.0.0.0
在数据链路层封装MAC帧,内含广播MAC地址和自己的MAC地址
路由器收到MAC帧直接广播,非DHCP服务器接收之后拆到传输层发现端口不对,直接丢弃
最后DHCP服务器收到。
5.2.1 提出问题
为什么第一次DHCP客户端收到服务端的信息报文里面不含服务端的IP和MAC地址呢,这样一来第二次发送request的时候就直接点对点发送不就好了吗?
答案:因为不止一个DHCP服务器,第一次discover是进行广播的,所以服务器都会发送一个offer,如果第三次是点对点发送给服务器,那么就有n-1个服务器不知道那个客户端接收了谁的IP地址等信息,所以第三次的request必须是广播形式。
④acknowledge:
DHCP服务端收到客户端发来的MAC帧之后,需要返回确认帧。
DHCP确认报文被封装到UDP报文,封装到IP数据报,最后封装到MAC帧指定发送给客户端。