四、网段划分
IP地址的构成
IP地址由网络号和主机号两部分构成:
网络号:保证相互连接的两个网段具有不同的标识
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
可以在IP地址的后面加一个 /,并在 / 后面加上一个数字,这就表示从头数到第几位为止属于网络标识
譬如,下图中路由器连接了两个网段。对于网络标识来讲,同一网段内主机的网络标识是相同的,不同网段内主机的网络标识是不同的。而对于主机标识来讲,同一网段内主机的主机标识是不同的,不同网段内主机的主机标识是可以相同的
若在子网中新增一台主机,则这台主机的网络号和子网的网络号一致,但是主机号不能和子网中的其他主机重复
DHCP协议
手动管理IP地址较为麻烦,当子网中新增主机时需要给其分配一个IP地址,当子网中有主机断开网络时又需要将其IP地址进行回收,便于分配给后续新增的主机使用
因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术
DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率
DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器
当连接WiFi时需要输入密码,本质就是因为路由器需要验证账号和密码,验证通过路由器就会动态分配一个IP地址,然后就可以基于这个IP地址进行各种上网动作
为什么要进行网段划分?
当IP要将数据跨网络从一台主机发送到另一台主机时,不是直接将数据发送到目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。因此数据在路由时的第一目的并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络中找到目标主机
数据路由之所以不一开始就以找目标主机为目的,是因为这样效率太低了
找主机的过程本质是排除的过程,若一开始就以找目标主机为目的,那么查找一次仅能排除一个主机。而若一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机,可以提高检索的效率。为了提高数据路由的效率,对网络进行了网段划分
网段划分
过去曾经提出一种划分网络号和主机号的方案,即将所有IP地址分为五类
A类:0.0.0.0到127.255.255.255
B类:128.0.0.0到191.255.255.255
C类:192.0.0.0到223.255.255.255
D类:224.0.0.0到239.255.255.255
E类:240.0.0.0到247.255.255.255
要判断一个IP地址是属于哪一类时,只需遍历IP地址前五个bit位,第几个bit位最先出现0值,那么这个IP地址对应就属于A、B、C、D、E类地址
子网划分
但随着网络的飞速发展,这种划分方案的局限性很快就显现出来
如一些学校、公司、实验室等组织想要申请自己的局域网,由于A类地址的网络号只占7个比特位,因此A类地址可申请的网络只有个,于是大多数组织都选择申请B类地址。由于B类地址的主机号占16个比特位,因此理论上一个B类网络中允许有65536台主机。但实际网络架设中,一般不会存在一个局域网中有这么多主机的情况,也意味着大量的IP地址都被浪费
为了避免这种情况,于是又提出了新的划分方案,称为CIDR(Classless Interdomain Routing):
在原有的五类网络的基础上继续进行子网划分,这也意味着需要借用主机号中的若干位来充当网络号,此时为了区分IP地址中的网络号和主机号,于是引入了子网掩码(subnet mask)的概念
每一个子网都有各自的子网掩码,子网掩码实际就是一个32位的正整数,通常用一串"0"来结尾
将IP地址与当前网络的子网掩码进行"按位与"操作,就能够得到当前所在网络的网络号
此时一个网络就被更细粒度的划分成了一个个更小的子网,通过不断的子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用IP地址的个数也就越来越少,这也就避免了IP地址被大量浪费的情况
如在某一子网中将IP地址的前24位作为网络号,那么该网络对应的子网掩码的32个bit位中的前24位就为1,剩下的8个比特位为0,将其用点分十机制表示即255.255.255.0
假设该子网中有一台主机对应的IP地址是192.168.128.10,将这个IP地址与该网络对应的子网掩码进行"按位与"后得到192.168.128.0,这就是这个子网对应的网络号
实际在用子网掩码与子网中主机的IP地址进行"按位与"操作时,本质就是保留了主机IP地址中前24个bit位的原貌,将剩下的8个比特位的值清0了而已,也就是将主机号清0了,所以"按位与"后的结果就是该网络对应的网络号。
注意:子网划分不是只能进行一次,可以在划分出来的子网的基础上继续进行子网划分
因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,也意味着IP地址中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了
五、特殊IP地址
并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就是具有特殊用途的
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 2^主机号位数 − 2
本机环回基本原理
本机环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络中,相当于本机环回时不会将数据写到网卡上
本机环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常
本机环回的基本原理:
当数据到达IP层需要继续向下交付时,若是环回程序,那么IP输出函数会将该数据放入到IP输入队列中,然后再由IP输入函数读取上去
IP输入函数将数据读取上去的本应该是链路层交付上来的数据,因此该数据后续就会被当作从网络中读取上来的数据看待,各层协议会对该数据依次进行解包和分用
若不是环回程序的话,那么接下来就会判断该数据对应的目的IP地址是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,若是则也会将该数据放入到IP输入队列中,等待IP输入函数将其读走
只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP获取该数据目的主机的以太网地址并进行后续数据发送的操作
六、IP地址的数量限制
IP地址数量不足问题
IP地址(IPv4)是一个4字节32位的正整数,因此一共有个IP地址,即将近43亿个IP地址。但TCP/IP协议规定,每个主机都要有一个IP地址
现在全世界人口已经有70多亿了,电脑、手机等都需要IP地址。随着科技的发展,智能手表、智能冰箱、智能洗衣机等设备若要入网也是需要IP地址的。并且IP地址并不是按照主机台数来配置的,因此一个主机可能需要多个IP地址,更别谈还有很多组网的路由设备也需要IP地址,以及一些特殊的IP地址不能使用的问题
43亿个IP地址其实早就不够用了,因此才提出了CIDR的方案对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费
CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址的绝对上限并没有增加
如何解决IP地址不足问题
解决IP地址不足有以下几种方式:
动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备
NAT技术:能够让不同局域网中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
IPv6:IPv6用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版,其是互不相干的两个协议,彼此并不兼容,因此目前IPv6还没有普及
七、私网IP地址与公网IP地址
私网IP地址的种类
若一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
10.*,前8位是网络号,共16,777,216个地址
172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的,都被称为私网IP,其余的则被称为公网IP(或全局IP)
连接云服务器时,连接的IP地址即是公网IP
可以使用ifconfig命令来查看博主这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的就是博主机器的网络接口,可以看到私网IP地址是10.0.8.2
由于博主使用的是腾讯云,因此这里的10.0.8.2是博主这台云服务器在腾讯内部的私网IP,可以看到这个IP正好在第一种私网IP范围内
数据是如何发送到服务器的
路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:
LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连
WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网
LAN口的IP地址被称为LAN口IP,即子网IP;WAN口的IP地址被称为WAN口IP,即外网IP
不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址可以重复
每一个家用路由器,本身也是运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP
若希望自行实现的服务器程序,能够在公网上被访问,就需要把程序部署在一台具有外网IP的服务器上,可以在阿里云/腾讯云进行购买
由于私网IP不能出现在公网中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术就是NAT(Network Address Translation,网络地址转换)
为什么私网IP不能出现在公网中?
不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机
但由于IP地址不足的原因,不能让主机直接使用公网IP,而让主机使用私网IP,因为私网IP可以重复也意味着可以在不同的局域网使用相同的IP地址,缓解了IP的不足
两个局域网中的主机进行通信必须通过公网
两个局域网中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址
即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为其IP地址都是私网IP地址
当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了
所以数据要从一个局域网发送到另一个局域网,不经过公网是基本上不可能的。在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网
但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,即内网穿透,也被称为NAT穿透
八、路由
数据"问路"过程
数据在路由的过程中,实际就是一跳一跳"问路"的过程。所谓"一跳"就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳
路由器的查找结果可能有以下三种:
路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网
路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由
路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机
路由表查询的具体过程
每个路由器内部会维护一个路由表,可以使用route命令查看云服务器上对应的路由表
Destination 代表的是目的网络地址
Gateway 代表的是下一跳地址
Genmask 代表的是子网掩码
Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发
Iface 代表的是发送接口
当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,与路由表中的子网掩码 Genmask进行"按位与"操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,若匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出
若将该数据包的目的IP地址与子网掩码进行"按位与"后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,即路由表中目标网络地址中的default。默认路由对应的Flags是UG,实际就是将该数据转给另一台路由器,让该数据在另一台路由器继续进行路由
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址中的网络号进行路由了,而是根据目的IP地址中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了
九、路由表生成算法
路由可分为静态路由和动态路由:
静态路由:是指由网络管理员手工配置路由信息
动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整
路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等