"Echo"
作者:Mylvzi
文章主要内容:网络原理(2)-IP协议
在网络原理(1)中我们详细介绍了应用层和传输层中的协议,重点是对TCP/UDP协议各种机制的理解,今天我们继续介绍网络层中一个非常重要的协议–IP协议
在计算机网络之中,网络层主要的功能有以下两点:
网络层中也有很多的协议,这里主要介绍最重要的一个协议IP协议
4位版本号
表示IP协议的版本号,现在主要使用IP v4 和 IP v6
4位首部长度
表示IP协议的报头长度,以4字节(32位)为单位,这个字段的取值是 0 -15,可以表示的最大值是 15个4字节,即60字节的长度.对于ip协议的报头来说,其固定长度是20字节,可以通过选项进行配置来获取额外的报头长度
8位服务类型
这个字段主要是使ip协议能够切换不同的形态
,就像奥特曼里的奥特曼一样(红色代表力量,蓝色代表敏捷)
8位服务类型分别是:3位优先权字段(已经弃用),4位TOS字段,和1位保留
字段(必须置为0),4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。
这四者相互冲突,只能选择一个。这四位TOS就对应着不同的ip形态~
16位总长度
描述一个完整的ip协议数据报(报头+载荷)的总长度,大小是 0 - 65535字节
我们知道UDP传输数据的一个限制就是一次发送的数据大小最大是64kb,如果想要传输更多的数据需要手动进行拆包和组包,比较繁琐,而ip协议内部就实现了自动的对要传输数据的拆包和组包问题
在一个数据量比较大的数据进行拆包时,将其拆分为更小的数据报,拆分之后需要明确各个数据包是由谁拆分得到的,如果这些小的数据报是由同一份大的数据报拆分得到,他们的16位标识
就是一样的
在组包时需要注意拼接的顺序,通过13位片偏移
就记录了他们在源数据报中的顺序,在组包时就可以按照这个顺序进行组包
3位标志:有一位表示是否允许拆包(有的数据报可能就不允许拆包),有一位是表示最后一个拆的包的位置(单链表中的尾节点)
注意:这里的组包+拆包的具体实现细节不用去考虑,面试中也不会考,但是提供了一个实现数据拆包发送的一个思路,在以后的编程中可能会使用到(拼接顺序 + 来源)
总结:通过16位标识来判断是否是同一个包,13位片偏移来确定先后顺序3位标志位来确定能否拆包和结束位置
8位生存时间(TTL)
TTL(Time - To - Alive)生存时间,首先这里的生存时间并不是生存多长时间,不是以s/ms为单位,而是指一个IP协议的数据报通过路由器传输的最多次数,一般取值为32,64,128…,如果是32,就代表该数据包在网络中经路由器传输的最多次数为32,如果传输超过32次,就会向发送方发送一个超时时间
TTL主要是为了防止一个IP协议的数据报在网络中传输的次数过多,大量的占用网络资源,比如一个数据在传输的过程中出现了路由环路,就会不断的进行循环的传输,通过TTL就能在达到一定次数之后丢弃掉该数据报
8位协议
这里的协议指传输层中的协议(TCP/UDP),数据在传输的过程中需要经历封装和分用,由网络层的数据报分用为传输层的数据报时,需要知道该数据包是由哪一个传输层的协议进行封装的,哪个协议封装就由哪一个协议进行分用,所以在ip协议的数据报中要存放是由传输层的哪一个协议封装过来的数据报
16位首部校验和
和UDP中的校验和类似,这里的校验和只对首部(报头)进行校验
32位源IP地址和目的IP地址
ip地址本质上是一个32位的整数,但是为了表示方便,使用点分十进制的方式进行标识
ip地址是ip协议中最重要的一个内容,要更好的理解ip地址,需要先理解什么事地址管理
,地址管理也是非常重要的一个概念~
地址管理
ip地址反映的是一个计算机在网络中的地址,一个计算机对应着唯一的一个ip地址,ip地址由32位数字组成,一个32位的整数最大可以表示的数字大约是42亿9千万,可能一听觉得这个数字很大啊,应该够用吧,实际上随着网络设备的不断增加(包括手机.各种智能设备)这些地址早就不够用了~
如何解决这个问题呢?主要有两种方式:
动态管理:什么时候用,就什么时候分配ip地址
这种方式属于一个治标不治本的方式,他只是提高了ip地址的使用率,并没有增加ip地址的数量(但是作为一种过渡方案,现在也在广泛的使用着)
NAT机制(Network Address Translation 网络地址转换)
首先NAT地址将IP地址分为两类:
在一个局域网之中不能存在相同的IP地址,但是对于不同的局域网之间可以存在相同的IP地址(内网ip一般以10/192.168/172.16-172.31开头)
在广域网中,不能存在两个相同的外网IP地址
NAT机制的工作过程
(重点掌握这里面运行商路由器的工作原理)
当我们使用计算机尝试去访问一个网页时,需要先通过运营商的路由器进行中转,刚开始我们的ip地址是一个内网ip(可能是同一个小区内部等),经过运营商路由器时会自动转换为路由器的外网IP地址,再通过广域网传输,直到我们要访问的目标服务器
注意:这里的运营商路由器就是一个NAT设备,专门用于将内网ip转化为外网ip
在运营商路由器内部存储的是内网ip和外网ip的映射关系,反应是哪一个内网ip尝试通过路由器访问其他网站.目标服务器收到请求之后就会返回一个响应,响应通过广域网先传输到运营商路由器,路由器就会根据ip地址将这个请求传输到映射的内网ip之中
以上是一个主机单独访问一个服务器的情况,如果有多台主机尝试访问同一个服务器,此时两台主机的内网ip不同,但是他们映射的外网的ip地址相同,在响应传回给路由器时,是如何确定这个响应是哪一个机器的请求呢?可以通过端口号来进行区分
端口号不仅可以区分同一台主机的不同应用程序的进程,也可以区分不同主机的不同应用程序的进程,在一个ip协议的数据报之中存储着"源端口号,目的端口号"这两个字段,运营商路由器可以根据数据携带的端口号去确定需要替换的目的主机的ip地址
这里其实也有一个问题,端口号的分配是随机的,如果两个主机尝试访问同一个服务器时,他们分配的端口号是相同的怎么办(尽管概率特别小)?运营商路由器其实也考虑到这点,在数据报传输到路由器时,路由器会进行检查
,如果发现两个数据报的源端口号相同,就会自动给两个相同的端口号重新分配两个不同的端口号以作区分,确保数据能正确传输(运营商路由器中记录着这样的映射关系)
NAT机制+动态分配是当前解决ip地址不够用的重要方案,NAT机制本质上是一个纯软件的解决方案,用户不需要去升级硬件设备之类的操作,只需要有这样的机制即可
NAT机制还保护了主机的ip地址不被泄露,内网的设备可以主动访问外网的设备,但是外网的设备无法直接访问内网的设备
但是NAT机制和动态分配都没有增加ip地址的数量,ip v6或许是解决ip地址不够使用的最终方案
ip v6
ip v6是ip协议的另一个版本,与ip v4最大的差距在于ip v6使用32字节的数据表示ip地址,最大的ip地址的数量是 2 ^ 128,这个数字足够地球上的所有计算机设备进行使用
ip v6和NAT机制其实是同时出现的,NAT机制一经出现就广受好评,被广泛的使用,为什么ip v6没有被大范围的使用呢?ip v6可以说从根本上解决了ip地址不够使用的问题,但是最大的一个问题在于 ip v6和ip v4不兼容,也就是说如果想要使用ip v6就需要大范围的更换路由器设备,更换之后实际上并没有实际的利益,所以ip v6迟迟没有得到推广
我国的ip v6的普及度已经超过 70%,这其实还要归功于川普的贸易战.首先我们要知道申请一个外网的ip地址不是向我们国家申请的,而是向美国的一个民间组织进行申请的,为了避免特殊情况的出现,我国大力推广ip v6的使用(但是现在的网络设备都是默认不开启的~用不用我不管,但是我必须要有)
一个ip地址可以划分为两部分:网络号 + 主机号
网络号:标识一个局域网
主机号:一个局域网内部的主机设备的表示
通过网络号来确定局域网,通过主机号来区别同一个局域网内部不同的主机设备,以下是一个介绍图
在上述介绍图中,网络号是三位,实际上网络号究竟是多少位是不确定的,网络号的确定是需要通过子网掩码进行确定的
子网掩码也是一个32位的数字,最大的特点就是左侧全是1,右侧全是0,不存在0,1交叉的情况
子网掩码中被标记成1的部分就对应着ip地址中的网络号,这里不一定就是24个1,可以根据实际的网络情况进行灵活的调配,家用网络的子网掩码就是:255.255.255.0(24个1),所以子网掩码最大的一个作用就是确定ip地址中网络号的位数
以下是一些特殊的ip地址:
ip协议的两个主要功能是:地址管理和路由选择,路由选择是指通过一定的算法,保证ip协议的数据报在传输的过程中选择最佳路径
打包好的ip协议的数据报在传输的过程中会经过许多网络设备和路由器,每一个路由器内部含有一个路由表(一中数据结构),路由器会根据路由表中存储的信息选择下一个跳(next hop),即下一个网络设备的地址,以将数据报传输给目标地址.在进行路径选择时,会使用一种启发式算法来选择最佳的下一个跳(最佳的网络设备的地址),以实现减少网络阻塞和延迟的目的
具体来说,ip协议在传输的过程中采用以下几个步骤来实现最佳路径选择:
以上就是网络原理(2)-IP协议的所有内容,下一期将要介绍网络原理中的其他内容,敬请期待!