网络层协议——IP
我们知道,两台主机在进行通信时,从我们的视角以为是主机与主机之间直接通信,但实际数据需要向下传递依次经过应用层、传输层、网络层等打包通过路由器发送给对方。然后对方再依次向上解包分用。可问题是,当数据想经过网络发送给对方时,它怎么知道要交给哪一个路由器、以及下一步路径该如何走呢?它的路径就是由IP协议规定的。IP地址,是全球具有唯一代表性的,我们也称公网IP。
并不是只有主机有IP地址,路由器同样也有,而且主机也有路由器的路由控制功能。主机和路由器我们统称为节点。
IP的协议报头格式
这个报头本质也是一个结构体,其中我们最熟悉的部分就是32位源IP和目的IP,由点分十进制最后要转换成字符串打包进行传输。其他部分我们逐一讲解。
IP报头是如何进行解包和分用的
当拿到报文时,直接取前20字节实现报头和有效载荷的分离,但其中的选项也算是报头的一部分,因此报头的长度是不确定的,衡量其长度其中有一个4位首部长度,范围也就是0-15,而其具有基本单位4字节,因此报头的范围是0-60字节。因为报头本身具有20字节,因此范围是20-60字节,因此选项的大小为40字节。
这样我们就可以成功把报头去掉,拿到有效载荷。
16位总长度:记录整个报文的大小。
16位检验和:?????
8位协议:IP协议上面一个是tcp一个是udp,而当选用某一种传输层协议后就会把该协议的协议号填充到此处完成ip报头的封装。分用则相反。
4位版本:代表IP报文的类型
8位服务类型:3位优先权字段(已弃用),4位tos字段和1位保留字段(必须置0),TOS字段代表我们采取传输的方式,比如省时但不安全,安全但延时,(最小延时,最大吞吐量,最高可靠性、最小成本)只能选择一个。
8位生存时间:是一个计数器,每经过一个路由器,做--操作。为了防止转发时间过长引起的麻烦,如果减到0直接丢弃掉。
剩下的我们稍后再谈。
网段划分
我们知道,一个数据想成功传输,只有源IP和目的IP是不够的,我还得知道中间的路如何走,但问题是,如果中间并没有路呢?因此,我们现在能够成功传输,都是已经铺好了路供我们选择,即网络是被设计过的——即子网划分。
其实IP地址分为两部分:网络号和主机号,比如192.168.128就是网络号(IP的前三部分)最后一部分是主机号用于标志主机唯一性,比如10.11等,不同网络号下主机号也可以相同,只要确保整个 IP不同即可。而每一个相同的网络号构成的网络区域称为子网,而连接两个子网就需要路由器,路由器内部就会有两种IP,且具有构建子网的能力。这就是网络路径的设计。
首先主机会拿自己的IP与目标IP对比,如果网络号不同,则主机知道目标主机一定不在自己子网内,于是把报文交给路由器,路由器经过路由把报文交给符合的子网内。因此,子网划分的意义在于可以提高传输效率,避免遍历的麻烦。
那么网段是如何划分的——CIDR
我们引入一个新的概念——子网掩码,它的作用是,IP地址和子网掩码进行按位与操作后即可得到网络号。这个子网掩码是一个32位整数,通常用一串“0”结尾。用于区分网络号和主机号。
我们进行按位与操作时需要把点分十进制转换成2进制的数字再进行按位与,这样我们就得到了网络号,而最下面一行就是该子网下的主机IP的范围。一般主机号全0或全1称特殊IP,因此我们能用的主机号有254个。
我们来算一下,首先240的二进制是11110000,68的二进制是01000100按位与后就是0100000(64),但为什么是64-79?,因为我们的前28位是网络号,后四位才是主机号,因此主机号范围是01000000-01001111(64-79)。
全0的IP称为网络号,全1的IP称为广播地址,给连接的主机发送数据包。
私有IP和公网IP
首先,私有IP的范围是: 10.*,前八位为网络号;172.16.*-172.31.*,前12位是网络号;192.168.*前16位是网络号。在这个范围外的都称为公网IP。
私有IP只能组建局域网,不能出现在公网中。只能在内网中使用,因此不同的子网IP地址可以重复!
运营商
实际上,申请IP,无论是公网IP还是私有IP的工作,都是运营商来做的!我们说过,路由器具有构建子网的能力,一旦家里安装了路由器,我们就可以通过路由器进行上网了,然而事情并没有这么简单,路由器上还有一个重要的配件——网线,这根网线就是运营商进行提供的(三大运营商),但并不代表我们有了网线和路由器,就可以直接访问公网IP了,事实上,在家庭路由器的上层,还有一个大路由器,这个路由器是由运营商管理,下连各个家庭的路由器,上连广域网与公网IP连接,因此,我们的数据,是先交给家庭路由器,再上交给运营商路由器最后交给广域网的。也可以理解为,运营商路由器构建了一个更大的子网,因此我们交网费都是给运营商。如果我们不交网费,那么运营商就可以不让我们入公网(无法与公网建立连接),或者如果我们访问某个IP非法运营商会进行拦截。
而且,家庭路由器一般会有两个IP,一个是用于分配IP地址的,也称子网IP(LAN),还有一个称为WAN口IP,这个IP就是运营商服务器的子网IP,而运营商的WAN口IP则是公网IP。而主机一开始的srcip是自己,dstip是目标公网ip,当数据走到运营商路由器是,srcip就进行了转换(因为公网中不允许出现私有IP),变成了运营商路由器的WAN口IP,dstip一直都是公网IP。这种技术解决了IP地址资源不足的问题,因为它支持一个IP可以重复使用。这种技术称为NAT技术。
下面是关于IP报头未提及的部分:
16位标识
用于表示主机发送的报文,如果被分片则相同。
什么是分片?
在传输层传送数据时,有时候会一次性发送多个报头+载荷,既然都是一块发,为什么不拼成一个大报文呢?问题就在数据链路层不允许,它规定单次发送的报头最长是1500,因此如果该报头超过规定长度就需要对报文进行分片,但分片同时也增加了丢包率。报头中的这三个部分就是为了标记报文是否被分片以及分片情况的。
3位标志
13位分片偏移