目录
1. CIDR无分类编址
1.1 CIDR的子网划分
1.1.1 定长子网划分
1.1.2 变长子网划分
2. 路由聚合
2.1 最长前缀匹配原则
3. 网络地址转换NAT
3.1 端口号
3.2 IP地址不够用?
3.3 公网IP和内网IP
3.4 NAT作用
4. ARP协议
4.1 如何利用IP地址找到MAC地址?
5. DHCP协议
5.1 DHCP作用
5.2 DHCP分配流程
①discover:
②offer:
③request:
5.2.1 提出问题
④acknowledge:
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帧指定发送给客户端。