目录
? ? ? ? 前面我们介绍了应用层与传输层相关协议,本文主要讲解网络层相关概念与网络层相关协议;
? ? ? ? 网络层主要的协议就是IP协议,我们经常听说的TCP/IP协议簇中便包含该协议;IP协议也是网络层中最主要的协议;
? ? ? ? IP协议报头如下图所示;
????????该字段主要标识IP协议版本,一般为IPV4,因为IPV6与IPV4并不兼容,该字段可不深究,理解即可;
? ? ? ? 该字段来标识IP报文首部的长度,与TCP协议中的首部长度一样,该字段的单位为4字节,由于IP报文的大小最小为20字节,因此该字段最小值应该为20 / 4 = 5,用二进制来表示就是0101;最大值应该就是60字节了;
? ? ? ? 该字段也只需了解即可,该字段最高3位已经弃用,而接下来4位TOS字段,分别用来标识最小延迟,最大吞吐量,最高可靠性,最小成本;这四者互相冲突,只能选择一个;最后一位为保留位,设置为0即可;
? ? ? ? 该字段来表示整个IP报文的长度(包括数据部分),单位是字节,注意,这里与首部长度的不同,首部长度的单位为4字节,这里的单位为字节;
? ? ? ? 这三个字段为设置IP分片所需字段,具体文章后面会专门讲解;
? ? ? ? 该字段用来表示我们发送的报文在网络上最长的生存时间;该字段最开始的单位为秒,后来被改为了跳数;那么我们会有如下问题;
为什么会有生存时间呢?没有不可以吗?
? ? ? ? 当然不可以,实际上,我们的网络上的情况非常复杂,有可能会出现路由环绕等问题,就是在转发IP报文过程中出现路由回路,若没有没有生存时间将会不断的重复转发,这种转发当然会消耗网络资源的,为了避免这种情况IP报文设置了生存时间;
? ? ? ? 刚开始时,生存时间的单位为秒,后来随着互联网硬件的发展,路由转发的速度也越来越快,我们发现设置成秒并不合适,因此我们转发一个路由可能仅仅只需要us甚至ns级别,这时我们设置成秒明显就不合适了,因此这个参数也就被改为了跳数,所谓跳数就是经过中间路由次数,没经过一个路由,跳数加一;
? ? ? ? 这里的8位协议也就是网络层应该向上层中的哪一个协议交付,可能上层位TCP协议,也可能位UDP协议等等,我们要讲IP报文解用后的数据交给上层的指定层;
? ? ? ? 该字段用于检测我们在进行数据传输中IP首部中的某个数据是否发生错误,用于检测IP首部的正确性;这里可能有小伙伴会有疑惑了,那数据部分不需要进行检测吗?这其实在传输层中,我们讲TCP、UDP协议中就介绍了,这里我们要清楚的是在IP协议中,IP报文中的数据部分就是一个完整的TCP报文或UDP报文等,而在传输层中的这些协议都有差错校验,这个差错校验会讲数据部分进行差错校验,因此在IP报文中的差错校验只需检验首部是否正确即可;
? ? ? ? 源IP地址用于告诉接收端发送端的IP地址是什么?因为在网络通信过程中,往往是双向的,我们要给对端发送数据,对端也要跟我们发送数据,而目的IP是在路由转发过程中告诉中间路由我们要去的IP地址是哪个,用于定位对端主机;
? ? ? ? 这个选项是附加字段,我们可加一些特殊功能,对IP协议进行拓展,这里我们仅需了解即可;
? ? ? ? 学习了上面字段,这个问题对我们来说并没有多大难度,我们可以通过字段中的16位总长度 - 4 * 4位首部长度,这样就可以得到我们的有效载荷,封装就是给报文添加报头即可;
? ? ? ? 通过8位协议字段我们得到应该交付给上层哪个协议,我们解包后就可以直接交付了;
? ? ? ? 首先我们在了解IP分片之间我们得直到什么是IP分片,所谓IP分片就是将我们的IP报文通过分片技术将IP报文分成一片一片后再发送;
? ? ? ? 为什么要进行IP分片呢?一整个IP报文一起发送出去不可以吗?
这里我们需要直到我们IP层的下层,也就是数据链路层,有一个规定,上层交付给我的数据不可以超过MTU,这里MTU也就是 Maximum Transmission Unit,一般为1500字节;因此若传输层给我们网络层交付的数据过大,我们需要进行分片操作;
? ? ? ? 在分片技术中,该字段用于标识IP报文的序号,若为同一个分片,16位标识相同;
????????该字段最低为记为 MF(More Fragment),若为0,要么表示该IP报文没有分片,要么表示该IP报文是IP分片后的最后一个IP分片报文;若为1,表示后面还有分片,这时该分片即可能为第一个分片,也可能为最后一个分片;
? ? ? ? 次高位记为 DF(Don't Fragment),表示不能分片,若为1表示该IP报文不允许进行分片,若为0时则表示可以分片;
那么要是上层传输层给我们交付的数据大于MTU,而IP报文中的标识被置为1时,那该怎么办呢?
? ? ? ? 此时,我们不用考虑别的,直接丢弃该报文即可!
? ? ? ? 该字段为分片后,该分片的起始地址在原分片中的位置;注意,片偏移是以8字节为单位的!
如何区分是否分片,或是该分片是分片中的哪一块?
没有分片:MF=0,片偏移=0;
分片第一块:MF=1,片偏移=0;
中间分片:MF=1,片偏移>0;
最后一块分片:MF=0,片偏移>0;
中间分片有这么多块,我们怎么知道它们是否收齐?如何组装?
? ? ? ? 我们通过16位标识找到所有属于一个IP数据报的分片,我们可以通过上述规则找到第一片与最后一片,我们接着我们可以通过第一片的总长度找到第二片片偏移的字段应该是多少,从而找到第二片,同时也可以用这个方法找到第三片,第四片等等;最终找齐所有分片,找到所有分片不就可以将其组装起来,然后向上交付吗?
我们是否推荐分片?为什么?
? ? ? ? 实际上,我们并不推荐分片这种做法,因为我们思考一下,我们将一个IP报文分成多个IP报文然后发送出去,那么若我们丢掉其中一个IP报文,此时完整的IP报文都不可能被我们完整组装起来,此时我们就要将该IP报文丢弃,视作丢包,等待对端重传,这时效率就低很多了,因此一个报文丢失概率与若干个报文其中一个报文丢失的概率想比,低了很多,因此我们不建议进行分片;
网络号:保证相互连接的两个网段具有不同的标识;
主机号:同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
注意:通常在同一个网段内的主机可以直接通信,具体原理为局域网通信原理;这里记住即可;
? ? ? ? 上述中 /24表示该IP地址中,前24个比特位表示网络号,后面8个比特位表示主机号,也就是192.168.128表示网络号,10表示主机号;
????????早期是IP地址被划分位如下几类;
????????可是如此划分,很快问题就暴露出来了,我们不难看出,A类地址的可分配的主机数地址为2^24,可一般来说很少有子网可以有这么多主机,B类地址有2^16台主机地址,C类有2^8台主机地址,很多公司都申请B类地址,很快B类地址就被用完了,而申请A类的地址,实际上用不上这么多主机,都浪费了,随着互联网发展,这种情况是IP地址越来越不够用了;因此我们后面便未使用这种方法对IP进行分类,而是采用下面的方法;
? ? ? ? 所谓CIDR即是 Classless Interdomain Routing,就是通过引入一个网络掩码来区分网络号与主机号;子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
例如,一个网路的IP地址为192.168.128.10,子网掩码为255.255.255.0;
? ? ? ? 此时我们的网络号就是这两个IP地址按位与的结果,也就是192.168.128.0/24;
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
????????我们的网络是如何进行划分的呢?接下来我将带着大家一起进行一次网络划分,下面所有的划分为小编自己划分,并不为真实划分,小编只是模拟划分来带着大家一起理解子网划分的概念;
? ? ? ? 我们假如用IP地址最高八位,来对国家进行划分,如下所示;
? ? ? ? 上述图中,我们只划分了5个国家的IP地址,其中每个国家都有一个国家路由器,也就是该路由器能识别别的国家路由IP地址,也就是如下图所示;
????????每个国家可能有多个不同地区划分,我们以中国为例,中国有34个省,我们可以用6个比特位表示这些省份,如下图所示;
? ? ? ? 我们还可以将上述网络继续划分到每个市,甚至每个县,很显然,我们会发现这样我们的IP地址是非常不够用的,因此有了后面的NAT技术
????????由于IP地址数量的不够,因此诞生了公网IP与私网IP的概念;我们规定以下地址为私网IP地址;
- 10.*,前8位是网络号,共16,777,216个地址
- 172.16.到172.31.,前12位是网络号,共1,048,576个地址
- 192.168.*,前16位是网络号,共65,536个地址
其余均为公网IP地址;私网IP地址就是为了解决公网IP数量严重不足的问题,具体就是使用NAT技术,暂不介绍;