上一篇说了一下浏览器发起http请求后的大致流程,数据报如何进行层层封装之后发出去,以及接收到数据报之后如何进行解析。
今天来看一下动态iP是如何获取的,以及根据ip如何获取网络号、主机号以及子网掩码。
个人电脑的网络设置都是默认为自动获取IP
当需要对网络随连随用,无需手动配置静态IP时候,就需要这个DHCP。
咖啡厅里面的气氛组电脑,就不能设置为静态IP,设置了之后在咖啡厅里面连了wifi无法上网可咋整!
只需配置一段共享的IP地址,每次有新机器接入都通过DHCP协议,向这个共享的IP地址申请,然后进行自动配置,用完即还,相当于是一个IP池。
类似于一个人走到一堆出租车面前说要打车,那么会有很多司机过来拉客,但是一般会选择第一个过来拉客的司机,此时司机会牵着你走,给大家说这个人我拉走了,你们别想了。
详细流程如下:
(1)当机器新加入一个网络时,只知道自身的MAC地址,就会发送一个广播数据包,这一步称为「DHCP Discover」,新机器使用0.0.0.0的IP发送一个广播包,目标IP时255.255.255.255。
广播包封装了UDP,UDP封装了BOOTP。
(2)如果配置了DHCP Server(相当于IP管理员),收到广播包会立刻知道来了一个新机器
只有 MAC 唯一,IP 管理员才能知道这是一个新人,需要租给它一个 IP 地址,这个过程我们称为「DHCP Offer」。同时,DHCP Server 为此客户保留为它提供的 IP 地址,从而不会为其他 DHCP 客户分配此 IP 地址。
DHCP Server仍然使用广播地址作为目的地址,因为此时新机器还没有IP。服务器还发送了子网掩码、网关和IP地址租用期等信息。
(3)如果新机器收到多个DHCP Offer,一般会选择最先收到的哪个,并向网络发送一个「DHCP Request」广播数据包,包含客户端的MAC地址、接受的IP地址、对应的DHCP Server地址等,并告诉所有DHCP Server它将接受哪台服务器提供的IP地址,请求撤销他们提供的IP地址。
此时,由于还没有得到 DHCP Server 的最后确认,客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。在 BOOTP 里面,接受某个 DHCP Server 的分配的 IP。
(4)当 DHCP Server 接收到客户机的 DHCP request 之后,会广播返回给客户机一个 「DHCP ACK」 消息包,表明已经接受客户机的选择,并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机。
「IP地址的收回和续租:」
客户机会在租期过去 50% 的时候,直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置。这样,IP 租用更新就完成了。
将32位的IP地址一分为二,前面是网络号,后面是主机号。
例如一个IP地址 10.100.122.2/24,后面有一个斜杠,斜杠后面有个数字24,这种地址表示形式,就是CIDR。
后面24的意思就是在32位的IP地址中,前24位是网络号,后8位是主机号。
伴随着CIDR存在的,一个是「广播地址」,10.100.122.255,如果发送这个地址,所有10.100.122网络里的机器都可以收到,另一个是子网掩码,255.255.255.0。
「将子网掩码和IP地址按位进行AND计算,就是网络号」
例如,IP是10.100.122.2,子网掩码是255.255.255.0,那么网络号就是10.100.122.0。
「如何根据CIDR求网络第一个地址,子网掩码和广播地址?」
比如一个CIDR是 16.158.165.91/22,那么如何求网络第一个地址,子网掩码和广播地址呢?
那么16.158.165.91转换成二进制为:
「00010000.10011110.10100101.01011011」
那么22位网络号就是:
「00010000.10011110.101001」
10位主机号就是:
「01.01011011」
那么子网掩码就是:
22位网络号全为1,10位主机号全为0
「11111111.11111111.11111100.00000000」
转换成IP也就是:255.255.252.0
网络的第一个地址为:
22位网络号不变,10位主机号最后一位是1,其它全为0
「00010000.10011110.10100100.00000001」
也即是:16.158.164.1
广播地址为:
22位网络号不变,10位主机号全为1
「00010000.10011110.10100111.11111111」
也即是:16.158.167.255