IP协议
网络层主要由IP(网际协议)和ICMP(控制报文协议)构成,对应OSI中的网络层,网络层以实现逻辑层面点对点通信为目的。目前应用最广泛的IP协议为IPv4
基本概念给出
主机:配有IP地址但不具有路由控制能力的设备(广义上有IP就可以称为主机)
路由器:配有IP地址且具有路由控制能力,也叫做网关
节点:主机和路由器的统称
网络层与数据链路层
在已经有MAC地址的情况下为什么还要给出IP地址?原因在于数据包在网络中传输过程中需要经过很多个中间节点,从一个节点到另一个节点的行为称作'跳 ',必须通过mac地址来判断下一跳的节点,而IP地址为跳转提供了一个全局方向。
总的来说,源IP地址和目标IP地址在整个数据包转发的过程中是保持不变的,为数据传输提供一个全局方向,而源mac地址和目标mac地址在数据包转发过程是时刻变化的,为数据传输提供一个局部方向。
IPv4
IP地址
IP地址用于网络层中各个主机能够与其他主机相互通信的目标地址,在一个网段中每个主机的IP地址都是全局唯一的,即以IP地址作为域中唯一标识。
对于设有网卡的主机来说,其至少需要配置一个IP地址;
对于路由器来说,其至少需要配置两个IP地址。
路由控制
路由控制旨在将数据包成功地发送到目标地址,由于网络结构复杂,数据包在传输的过程中需要进行多次跳转动作,甚至是跨网段传输,往什么方向跳转,哪个网段跳转,全靠路由控制,没有路由控制会导致数据包在网络中随意跳转造成数据丢包和网络拥塞。
路由器就是负责路由控制的硬件 。
由于数据包在传输的过程中往往会经历多次跳转,因此IP路由也被称为多跳路由 ,多条路由的特点是路由器在转发数据包时仅告知下一跳地址,下一跳路由器仅告知下下一跳地址,直至到达目标主机。
可以参考原书给出的火车旅游例子来类比多跳路由:
路由控制表
为了将数据包发送给目标主机,路由器内部维护者一张路由控制表 ,存储其他路由器与IP地址的映射关系,此处的IP地址不是特定的一台主机,而是一个网段,具体之后会讲。
封装数据帧
网络中不同的数据链路实现相异,如果不进行任何封装就直接交给上层(传输层),那么传输层所要做的工作可就太多了,因此网络层需要对数据链路层的数据帧进行封装后向上统一交付。
不同数据链路最大的区别在于其最大传输单位(MTU )的不同,以太网帧最大正文长度为1500字节,当上层传输的数据大于MTU时,就需要网络层对数据进行分片处理 ,这个过程称为IP分片 ,将一个大数据包拆分成多个小于MTU的小数据包进行发送;必要的,网络层也需要有将多个小数据包合并为一个大数据包的能力,这个过程称为IP重组
虽然网络层提供了分片和重组的能力来满足不同的数据链路,但是在实际过程应该尽可能的避免传输数据大于MTU,本质原因在于IP属于面向无连接型 ,即不提供可靠传输,数据包越多意味着丢包的概率也大。
IPv4格式
IPv4地址在计算机内部以32位正整数表示,人所看到的IPv4地址以点分十进制的格式展示(0.0.0.0~255.255.255.255)
IPv4地址由网络(段)标识 和主机标识 两部分构成,前者用于标识一个网段,后者标识网段中的一个主机
网段和主机位数分配是决定着IP地址的利用率
IPv4分类
以固定位数进行IP分类可以将IPv4地址划分为A\B\C\D四大类(有些书上是ABCDE五大类,不过E类从未被使用 )
A类地址首位为0,前8位代表网段,后24位代表主机 0.0.0.0~127.0.0.0
B类地址前2位为10,前16位代表网段,后16位代表主机 128.0.0.1~191.255.0.0
C类地址前3位为110,前24位代表网段,后8位代表主机 192.168.0.0~239.255.255.0
D类地址前4位为1110,32位均代表网段(由于没有主机标识常用于多播) 224.0.0.0~239.255.255.255
每一类IP地址一个网段中能容纳的最大主机数N=2^主机位数-2
减2的原因在于规定每一个网段中主机位为0活255作保留,0为任意地址,255为广播地址
广播地址
广播地址用于在一个数据链路 中相互连接的主机之间发送数据包,将目标IP地址主机标识设置为255,(目标mac地址设置为FF:FF:FF:FF:FF:FF)
广播分为直接广播 和本地广播
本地广播是一台主机向当前数据链路中的所有节点发送数据包(路由器也会收到,但不会对其进行转发)
直接广播是一台主机向另一个数据链中的所有节点发送数据包
IP多播
多播是对于广播的优化,频繁的广播会造成网络拥堵,可能会产生大量的垃圾数据包(并不是所有的主机都希望收到广播数据的),因此衍生出了多播技术,多播旨在向多个特定主机发送数据包,而非整个数据链路中的主机,也就不存在垃圾数据包的问题。多播适用D类IPv4地址。
多播可以跨数据链路发送。
单播、广播、多播对比图
子网掩码
直接只用定长分类的IP地址会造成极大的IP地址资源浪费,例如B类IP地址的一个网段可以容纳6w多台主机,但这一般不可能,A类IP地址的一个网段所浪费的IP地址更是夸张,因此不得不引入新的手段对原有的4大类IP地址进行细粒度的划分,目前普遍采用子网掩码
子网掩码也是一个32位数,比特位为1代表网段标识,为0代表主机标识,1和0必须是连续的,不可能出现101...这种情况,将子网掩码与IP地址本身进行按位或 的结果就是一个新的IP类(按位或之后的结果一定是一个前半部分全1后半部分全0的32位数 ),有了子网掩码就可以更加灵活的动态调整网络标识长度了。
公网、私网
公网私网的划分也是对IPv4资源不足的一种治标手段
规定给出
10.0.0.0~10.255.255.255(10/8) A类私网
172.16.0.0~172.31.255.255(172.16/12)B类私网
192.168.0.0~195.168.255.255(192.168/16)C类私网
除此之外的所有IPv4称为公网IP,
公网IP是全球唯一的,绝不允许重复,私网IP是在不同网段中可以重复的,现代个人计算机普遍采用私网IP,而路由器和大型服务器采用公网IP,通过NAT技术可以实现私网与公网交互(NAT在后续章节给出解释)
路由控制
上面已经点过路由控制就是路由器通过自身所管理的路由控制表对数据包进行有方向的转发。IP协议始终认为路由控制表是正确的,路由控制表中的数据如何定义由独立的路由协议制作
路由控制表中的数据为网段和下一跳路由器的IP映射 ,当一个数据包到达路由器时,通过查询路由控制表可以确定下一网段,再将数据包转发给下一网段的路由器即可,直至数据包到达目标主机。如果找不到则会转发给默认路由
默认路由
任何网段都可以匹配的网段所对应的路由器IP称为默认路由,一般标记为default或0.0.0.0/0
主机路由
如果IP地址的32位全部充当网络标识(没有主机标识,IP/32)参与路由,则称为主机路由,使用主机路由可以精确定位,但是会造成路由表膨大,一般不推荐使用。
本地环回
环回地址用于在同一主机上的进程之间模拟网络通信,这个地址表示为127.0.0.1或localhost,这个IP地址不会流向网络。环回地址常用于调试网络程序以判断是否出现网络问题。
路由控制表的聚合
路由控制表不能太太,否则会影响查询效率。通过网络地址长度的动态调整可以对一些网段进行整合,再通过子网掩码可以对整合后的网段进行拆分
具体可参考原著给出的参考图
结合图示可以看到聚合前的路由器C表完全没有必要存放多个下一跳地址是路由器A或B的网段,可以把这些网段整合(减少网络标识比特位),更具体的网段划分交给下一跳路由器处理。