前言
前面我们学习了关于 UDP 协议和 TCP 协议方面的内容,这些都是网络传输中传输层方面的协议,今天我将为大家分享网络传输层中网络层中主要的协议——IP协议。
IP 协议的协议头格式
- 4位版本:表示该 IP 协议是哪个版本的,4表示是 IPV4 ,6 表示是 IPV6
- 4位首部长度:跟TCP中的4位首部长度是一样的,这里表示IP头部的长度最长为15*4=60字节
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要
- 16位总长度(total length):IP数据报整体占多少个字节
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的
- 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环
- 8位协议:表示上层协议的类型,也就是传输层用的是 UDP 协议还是 TCP 协议
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏(IP报头中的校验和检验的是IP报头是否损坏,而不需要判断 IP 载荷中的数据,因为 IP 载荷中的数据是从传输层传来的数据包,其中的校验在传输层就已经实现了)
- 32位源地址和32位目标地址:表示发送端和接收端
- 选项字段(不定长,最多40字节)
16位总长度
IP 协议协议头中的16位总长度就说明了 IP 数据包的最大长度为 64 kb,这不就跟 UDP 一样出现问题呢吗?虽然 IP 能传输的数据最大为 64 kb,但是 IP 数据包支持拆包和组包的操作,也就是说可以将一个很大的数据拆分成一个个较小的小于 64 kb的数据包。
16位标识、3位标志、13位片偏移
而这些被拆分的数据包是通过 IP 协议头中的 16 位标识来辨别哪些数据包是由一个数据包拆分的,由同一个数据包拆分的 IP 数据包的 16 位标识是相同的。这个 IP 协议头中的 3 位标志中的第一位保留,现在还没用,第二位标识当前数据包是否可以拆分,1表示该数据包不可以被拆分,0表示可以被拆包。第三位是用来判断该数据包是否是拆分的数据包中的最后一个数据包,类似一个结束标志。13 位片偏移就是用来判断将一个数据包拆分成许多数据包之后每个数据包的相对位置。
8位生存时间
8位生存时间(TTL)表示该数据包可以在网络上的生存时间,单位是次,就是这个数据包每经过一个路由器,TTL 就会 -1 ,当 TTL 等于 0 的时候,这个数据包就 会在网络中消失。通过这个机制可以防止某个数据包的目的 IP 不存在而一直存在于网络上。那么有人就会问了,如果在我这个数据包到达目的 IP 之前,这个 TTL 变为 0 了该怎么办呢?其实不会的,只要这个目的 IP 是正确的,他经过最多 255 次的传输之后是一定能到达目的 IP 的,因为不知道大家有没有听过“6度空间”这个理论,就是世界上的任何一个人通过 6 层关系是能接触到任何一个人的,因为一个人的关系网复杂的,那么这个人的其他朋友关系网也是很复杂的,那么通过 6 个人就可以知道世界上的任何一个人。所以在网络中 255 次传输也是一定能到达正确的目的 IP 的。
IP 协议头中的源 IP 和目的 IP 是 IP 协议头中最关键的内容。而这个32位的源 IP 和目的 IP 通常是 8 位为一个部分,中间用 . 来分割开,比如1.2.3.4
地址管理
IP 协议头中 IP 地址是 32 位,能表示的最大值大约是 40 多亿,这个数据虽然看起来很大,但是它现在已经不能满足现在世界上人口的需要了,如今世界上人口数已经超过 40 亿了,而且一个人还不止一个网络设备,像什么电脑、手机和其他的联网设备,都需要使用到 IP 地址。那么该如何解决这个 IP 地址不够分配的问题呢?
1. 动态分配 IP
在这种方式中,每当一个设备连接到网络时,它会被分配一个临时的IP地址。这个IP地址是与设备在网上的会话相对应的,当设备断开连接时,该IP地址会被释放回IP地址池,以便其他人可以使用。
动态分配IP地址的好处包括能够更有效地利用IP地址资源,因为即使设备不经常连接到网络,也可以避免为每个设备分配一个永久的IP地址。此外,动态分配IP地址还可以提供更好的安全性,因为每次分配的IP地址可能都不同,这使得追踪设备在网上的活动更加困难。
动态分配IP地址的过程通常由网络中的DHCP(动态主机配置协议)服务器完成。DHCP服务器维护一个IP地址池,当设备连接到网络并请求IP地址时,DHCP服务器会从池中分配一个可用的IP地址,并将其配置到设备的网络接口上。
但是这个方案,治标不治本,并不能从根本上解决 IP 地址不够的问题,它只是一个过度的方案,但是这个方案在目前仍然是广泛使用的。
2. NAT机制(网络地址转换)
NAT(Network Address Translation,网络地址转换)是一种在传输层面上实现IP地址转换的技术。在NAT中,路由器通过修改传输数据包中的源IP地址和目的IP地址来实现地址转换。这种转换在不同的网络中常用于解决IP地址冲突、扩大私有网络数量并增强安全性等问题。简而言之,NAT的工作原理是类似于将一个私人地址转换为公共地址,通过这种方式来实现内部网络与外部公共网络的通信。
NAT 机制将 IP 地址分为两类:内网和外网。如果一个 IP 地址是以10.* 或者172.16.* - 172.31.* 或者 192.168.*,符合上面一个条件的都是内网 IP ,其他的 IP 就是公网 IP。
在同一个局域网内部 IP 地址不可以重复,但是不在同一个局域网内部的主机 IP 地址可以相同,但是外网 IP 无论什么时候都不可以相同。大家可以在自己电脑的命令行中敲入 ipconfig
来查看自己电脑的 IP 地址。
通过 NAT 这个机制因为只有外网以及同一个局域网中的主机 IP 地址不能重复,所以就类似于在大学中购物的时候,地址就填的是这个学校的地址,然后这个学校的所有学生在填写地址的时候填写的都是该学校的地址,再然后每个人凭电话号来取得自己的快递,这样就没必要每个学生都填一个属于自己的专属地址了,大大节省了地址的数量。
NAT 机制是如何工作的
假设我的电脑要向 IP 为 1.2.3.4 (经过路由器的映射)发送一个数据,那么机会形成以下的数据包。
当内网主机生成的这个数据包传输到该局域网中的路由器当中时,路由器首先会通过映射关系将源 IP 映射为自己路由器的 IP 并且记住这个映射关系。
当这个经过路由器的数据包经过广域网传输到达目的 IP 之后该怎么办呢?这个目的 IP 也是一个外网 IP ,那么这个路由器该如何知道传给哪个主机呢?其实这里就用到了前面路由器记住的映射关系,根据这个映射关系知道这个目的公网 IP 和端口号对应内网中的哪一个主机。其实主要区分的是端口号,因为从另一个局域网发送来的数据包的目的 IP 都是相等的,所以主要就是根据不同主机的不同端口号来区分数据包发送给哪个主机。
那么这里就会有人问了,如果就是同一个局域网当中的不同主机的同一个进程向另一个相同的局域网当中的同一个主机的同一个进程发送消息的时候,路由器该如何判断接收到的数据包发送给哪个主机呢?
当同一个局域网中的不同主机的同一个进程向另一个局域网当中的同一个主机的同一个进程发送消息的时候,当两个主机生成的数据包经过路由器之后,路由器会判断出这两个数据包的源端口号相同,所以就会通过映射关系在更换源 IP 的时候,将两个相同的端口号映射为不同的端口号,这样相同的接收数据的路由器也就知道了将这个数据包发送给哪个主机了。
NAT机制的优势包括:
- 安全性:通过将内部网络的IP地址隐藏,NAT机制可以增强网络的安全性,防止来自外部网络的攻击。也
- 节省IP地址:NAT机制允许一个公网IP地址对应多个私有IP地址,可以节省IP地址的使用。
- 简化网络管理:通过NAT机制,可以将多个私有网络通过一个公网IP地址进行连接,简化了网络管理。
- 提高网络性能:NAT机制可以减少IP地址冲突,从而提高网络性能。
- 纯软件操作:无需更换硬件设备,只需要安装了 NAT 就可以使用。
NAT 机制能承载的访问数量非常大,除非是局域网内部的超过 65535 个设备同时访问提供一个服务器,从而导致出现端口号出现重复的时候才会引发问题。
虽然 NAT 机制可以很好的解决 IP 地址不够的的情况,但终究是治标不治本,IPv6 才是解决 IP 地址不够用的最终解。
3. IPv6
IPv6 是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议。IPv6的使用不仅能解决网络地址资源数量的问题,也解决了多种接入设备连入互联网的障碍。IPv6的地址空间是IPv4的约8×10^28倍,其号称可以为全世界的每一粒沙子编上一个地址。
IPv6所能表示的字节是 16 个字节,可以表示 2^128 个 IP 地址,这个数 4 个字节所能表示的范围大了很多很多,不夸长的讲,16个字节所能表示的 IP 地址可以给世界上的每一粒沙子都给编上号,也就是说:在人类开始星际殖民之前,IPv6 所能分配的地址是不可能用完的。
但是由于 IPv4 与 IPv6 是两种不同的协议,两个协议之间不能进行直接的通信,所以要想使用 IPv6 就需要重新更换设备,但是更换设备不仅需要花费额外的价钱,网速也没有提升多少,对于用户来说:使用 IPv4 和 IPv6 效果是一样的,并且当时与 IPv6 一起出现的还有 NAT 机制,NAT 机制就是纯软件设施,也解决的 IP 分配不足的麻烦,所以 IPv6 在全世界的普及率还是比较低的。但是 IPv6 在中国的普及率是全世界最高的,那么为什么中国如此重视 IPv6 的使用呢?
其实之前的 IPv4 和 NAT 都是由美国的一个民间组织掌管的,也就是说 IP 的分配都是美国说了算的,美国要想让你这个国家的互联网消失只是一句话的事,虽然很多国家反映了害怕美国将这件事兵器化的事情,美国将对 IPv4 和 NAT 大部分职责都交给了 IANA 这个组织,这个组织也不是完全听由美国的命令,但是美国保留了 IPv4 的最终解释权,也就是说美国还是掐着我们中国人的脖子。后来美国就通过这个职权做出了一系列的违反国际法的事情,例如前几年影响很大的美国棱镜门事件。
发生这件事之后,中国就意识到了不能让美国独自掌握 IP 地址的分配,于是当 IPv4 问世的时候,中国就积极投入到 IPv6 的研发与测试当中,并且逐渐开始在中国普及开来。
网段划分
网段划分也是 IP 协议中比较重要的一部分。一个 IP 地址通常会被分为两部分:网络号和主机号。网络号表示该局域网在网络中的部分,而主机号则表示该主机在局域网中的位置。
这里的 192.168.1 就表示的是网络号,而10、11、12则表示的是主机号。两个相邻的局域网的网络号不能相同,同一个局域网中的设备的网络号必须相同,主机号必须不同。
而我们如何区分一个 IP 地址中哪些部分是网络号,哪些部分是主机号呢?这就需要用到我们的子网掩码了。
子网掩码
子网掩码又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码也是用 4 个字节来表示的,同样也是跟 IP 一样,1 个字节分为一个部分。子网掩码有一个要求就是:子网掩码的前部分的数字必须全是 1 ,后边部分必须全都是 0,不允许出现 0 和 1 交替出现的情况。
假如一个主机的 IP 是192.168.1.10,子网掩码是 255.255.255.0,那么 192.168.0 就代表的是网络号,10就表示的是主机号。
下面是一个“上古时期”的网段划分方式,现在很少使用这种划分方式了。
当然也有一些特殊的网段划分。如果主机号全是 0 的话,表示这个 IP 是一个网络号,这个 IP 是不能分配给一个具体的主机的;如果一个 IP 地址的主机号全是 1,则表示这个 IP 是一个广播地址,通过这个 IP 发送的数据,该局域网中的所有主机都能接收到这个数据,同样的,这个 IP 地址也是不能分配给一个具体的主机的,我们前面说的 UDP 能天然的支持广播,就是和这个 IP 地址是有关系的。如果一个 IP 是以 127 开头的话,表示这个 IP 是一个环回 IP,操作系统提供了一个虚拟的“网卡”关联到这个 IP 上,使用环回 IP 发送的数据,最终还会回到当前主机,这个 IP 的主要用途就是做一些测试工作,通过这个环回 IP 可以避免网络不通等干扰因素。
路由选择
IP路由选择是指互联网协议(IP)在确定数据包在网络中传输的最佳路径的过程。在IP网络中,每个数据包包含源IP地址和目标IP地址。当一个设备接收到一个数据包时,它需要决定将数据包发送到哪个网络接口,以便将数据包路由到目标地址。但是由于网络中的每个路由并不能知道网络中的所有路线的全貌,而是只知道与自己相连的路由器,所以传输的路线只是尽可能的最优。
IP路由选择主要基于目标IP地址和路由表进行。路由表是存储在每个路由器中的表,它记录了目标网络与下一个路由器之间的映射关系。当路由器接收到一个数据包时,它会查看目标IP地址,然后在路由表中进行查找,以确定最佳的路径将数据包转发到目标地址。如果该路由表中没有存储与目的 IP 相关的路由位置,那么就会走向默认的路由位置。
在IP路由选择中,有多种算法可用,例如最短路径算法、最少跳数算法等。这些算法根据不同的因素,如路径长度、网络拥塞等,来确定最佳的路径。
此外,IP路由选择还支持多种路由协议,例如动态路由协议(如OSPF、BGP)和静态路由协议。动态路由协议根据网络拓扑的变化自动更新路由表,而静态路由协议需要手动配置路由表。