IP协议网络层最核心的协议。网络成协议的工作主要有两个:地址管理和路由选择(路径规划)。
(1)4位版本号,表示当前IP协议的版本,有两个:IPv4和IPv6。这里主要讨论IPv4。
(2)4位首部长度,表示当前IP报头的长度。带有选项字段(可以有,可以没有)可以实现增长报头。
(3)8位服务类型,这里的八位,实际有四位,另外的四位是保留位,可以提供未来的扩展使用。四个服务类型中,比特位都是互斥的,一个报文中四个位只有一位可以是1,其他的都是0。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。实际开发中,很少手动调整。
(4)16位总长度,表示一个IP数据报(报头+载荷)有多长。载荷部分就是一个完成的传输层数据报(比如完成的TCP数据报)。IP协议是自己内置了拆包组包的协议,可以自动完成过长的TCP数据报分包,每一个包来携带TCP的一部分数据。
(5)16位标识,3位标志,13位片偏移。16位标识,同一个包拆出来的若干个小包,标识是一样的;十三位片偏移,描述了拆出来的包的先后顺序;三位标志,其中一位是关键的,标识结束标记。
(6)8位生存空间(TTL),描述了这个IP数据报,还能在网络上存活多久。网络环境是很复杂的,发送方发送一个IP数据报,数据报就会沿着网络尝试找接收方的位置。如果存在,就直接发过去,否则就会放弃。正常的情况下,能够很快的找到。TTL的单位不是时间单位,而是“次数”,能够被转发的次数。每次数据报经过一个路由器的转发,TTL就会减少一次。一旦TTL减为0,认为这个IP找不到,就要丢弃包。
(7)8位协议,表示了传输层使用了哪些协议。
(8)16位首部检验和,只针对“报头”的检验,不针对数据部分的校验。数据部分的校验和,数据部分的校验是传输层的协议,比如TCP协议来负责的。
(9)32位源IP地址和32位目的IP地址,表示发件人地址(源端口号)和收件人地址(目的端口号)。IP地址本质上是一个32位的整数,因为32位的整数不方便,使用了另外的表示方式:点分十进制。使用三个点,将32位的整数,分成4个部分,每一个部分8位(1个字节),每一个部分的取值范围0~255。比如本人当前的IP地址:
如果查看IP的话,会经常见到192.168开头的IP地址。这时内网的IP。内网的IP有三类:(1)10.*;(2)172.16* ~ 172.31*;(3)192.168.*。其他的就是外网IP了。内网IP和外网IP是人为划分的。
现实中的IP地址,都是“唯一的”,但是网络中的IP地址,是动态变化的,不能保证唯一,换句话来说,是不能保证每一个主机都能分配唯一的IP地址,还是需要解决IP地址不够用的问题。
(1)动态分配IP地址(DHCP)。一个设备上网,就分配,不上网就不分配。动态分配会导致同一个设备的IP地址在不同的时候可能产生变化。这个办法指标不治本。
(2)使用NAT, IP地址转换。把IP地址分成两类,内网IP(局域网里面使用的IP)和外网IP(广域网中使用的IP)。允许局域网之间的内网IP重复,但是外网IP要保持唯一。同一个局域网中的IP地址不能相同,但是不同的局域网内部的IP允许重复。
如果IP地址重复了,就需要进行IP地址的转换。
大概的流程是通过运营商的路由器的时候,就会进行IP地址的替换,记录替换的记录,然后继续发送。
NAT机制,本质就是使用一个外网IP地址代表一大批内网的设备。
(3)IPv6,是解决IP地址不够用的终极方案。IPv6使用16字节的值来表示IP地址(IPv4是4个字节),这是一个非常大的数字,比IPv4大了不是一个天文数字量级,地球上的所有沙子都分配一个IP地址,都是足够的。但是问题是IPv4和IPv6的协议是不兼容的,这就给升级带来了很大的困难。
为了更好的组网,又把IP分成两段,前一段称为网络号,后一段称为主机号。具体的分法有不同的策略(主要存在教科书中)。
主流的划分方式是CIDR。引入了“子网掩码”,来区分哪部分是网络号,哪个部分是主机号。也是一个32位的整数,左侧都是1,右侧都是0,比如255.255.255.0。标记为1的部分,表示这部分的IP是网络号。要求在同一个局域网内部网络设备之间的网络号都是相同的,主机号是不同的(有相同的则导致只有一台能上网);两个相邻的局域网(同一个路由器连接的两个局域网)网络号是不同的。
路线规划的过程中,就是路由选择,就和地图寻路差不多。路由器在进行路径规划的时候,没有很多的空间来保存全局的信息,每一个路由器只能知道位置信息的一部分,只能知道和它的一些相邻的设备什么走。路由器的数据转发,类似于原始的问路过程。