网络层的 IP 协议
引言
博客到这里,写到了网络层,本篇博客主要对 IP协议进行介绍。
一、IP 协议段格式
1. IP 数据报的拆包组包
在上图中,我们可以看到:一个 IP 的数据报总长度为 16位,这看上去和 一个UDP 数据报的长度相同,最大都为 64KB.
而虽然 IP协议 看起来也是有个最大 64KB 的限制,但实际上,IP协议 内置了拆包组包的功能。如果一个数据太长了,IP协议 就会先将数据自动拆成多个数据报,再进行传输,最后接收方收到数据时,又会重新进行组包。这样一来,就没有单单的 64KB 的限制了。此外,IP协议 的拆包组包功能是内置在协议中的,不需要程序员实现这一功能,比较方便。
2. 8 位生存时间
8 位生存时间这个字段表示 一个 IP数据报 最多在网络上存活多久,而 TTL 并不是一个时间单位,它其实是一个以 " 次数 " 为单位的概念。
比方说,主机A 给距离较远的 主机B 发送数据,数据每次经过一个路由器转发,TTL 就减 1,而 TTL 一直减到 0 还未到达 主机B 目的 IP,那么就被自动丢弃。而一般情况下 TTL 的次数都较为充裕。
那么,8 位生存时间这个字段,主要是用来防止出现路由器之间的循环。( A -> B -> C -> A )
3. 源 IP 与目的 IP
这是整个 IP 协议中最核心的部分。
我们将 IP地址 比作成快递单号上的地址,源IP 就表示 " 发件人地址 ",目的IP 就表示 " 收件人地址 "。
4. IP协议 的两个核心功能
① 地址管理
地址管理:能够通过一系列的规则,将网络上设备的地址给描述出来。
地址管理中的一些重点部分在下面的 IPv4 协议中会详细介绍到,现在请继续往下看。
② 路由选择
路由选择:根据当下的源地址和目的地址,规划出一条合适的路径。
此处的 " 路由 " 指的是 IP协议 中的 " 路径规划功能 ",为什么要进行规划?
因为通过网络从某一端传输到另一端,在这个过程中,并不是 " 一站到达 ",它更多的情况下是错综复杂的路线,下图为我们展现出来了这样的情况。
主机A 与 主机B 之间进行通信,方框代表网络关口,即路由器。下图中只画出了三条路线,实际上不止三条路线,可以看到,每个路由器代表一个 " 关卡 ",在传输数据的过程中,下一步究竟走哪条路线,这是未知的。
举第一个例子:小明准备从家里出发去市中心购物,那么他就得先明确起始地和目的地,起始地是家,目的地是商场。可想而知,小明在去之前,就必须得规划好路线。坐公交车、坐地铁、或坐出租车…假设他坐地铁,而坐地铁又分为很多种路线,可能先是 1号线 > 6号线 > 5号线,也有可能是 1号线 > 10号线 > 3号线 > 16 号线…他在去之前就能够规划好路线,以此来提高效率。
但是在 IP 协议中的路由选择与我们上面说的坐地铁选择路线之间有本质区别,更多的是一种 " 探索式 " 的过程。因为当数据到达某个路由器之后,路由器并不能立马为数据规划好一个整套的路线,路由器只能知晓它附近的情况,即它只知道相邻设备的情况。这很好理解,毕竟路由器是一个物理层面的实体,它并不能掌控全局,它的存储空间有限,不可能通过一个路由器的路由表就保存整个互联网环境的所有情况。
举第二个例子:杰克第一次来到一个陌生的城市,他也准备去市中心购物。但这时候,他就只能向路人问路,但是路人每次只能列出一个大致的方向。
当杰克遇到第一个路人A,
路人A 说:我不知道商场在哪,但我知道你从这里坐 3号线坐到 xxx路,那里一定有购物的地方,即使没有,你也可以再问问别人…
之后杰克应了路人A 的话,坐了 3号线,当他从 3号线下来的时候,找了半天没找到商场,于是又问了路人B,
路人B 说:你从这里直走,走到头,再往左转,就能看到购物的地方。
于是杰克又应了路人B 的话,到了他说的地方,只是发现了服装专卖店,并不是商场,于是他又问了路人C
…
…
…
在刚刚的例子中,每一个路人,就相当于一个路由器。每个路人都有一个自己熟悉的范围,但一个路人并不知道一套完整的路线,只知道一个大致的方向。而这个例子,就类似于路由器中的一种核心数据结构:" 路由表 "。
二、IPv4 协议
在 IPv4 中,计算机主要是通过一个 32位 的二进制数来进行表示一个 IP 地址。
而为了给人们直观地观察 IP 地址,把这个 32位 整数表示成 " 点分十进制 " 的形式,使用三个点,把整数分成 4份,每一份最大 8位。
例如:下面的就为人们日常使用的 IP 地址格式
192.168.1.102
关于 IP 地址,涉及一个较为重要的问题:IPv4 协议对应的 IP地址 够用吗?
IPv4 协议对应的 IP地址 实际上使用 32位 整数来表示的,而 32 位的二进制数最多也就只能表示 42亿9千万之多,这是因为当初设计者就是这么设计的,他们也没有想到今天这个时代,互联网发展的如此迅速。
所以说,针对一个城市、一个人口不那么多的国家,IP 地址或许已经够用了。
但如果要做到全球通信,就很困难了,因为可能我们每个人不止一个网络设备,公司也不可能按数量为员工分配刚刚好的设备。
三、如何解决 IP地址的不够用问题
1. 动态分配 IP
本质上说,动态分配 IP 的思想就是:一个设备接入网络了,就为其分配一个 IP,另一个设备没接入网络,就不为其分配 IP. 但是这种办法,终归治标不治本。
因为在当下社会,很多人手机可能就已经全天 24小时 开着网络了。
2. NAT 机制
NAT:Network Address Translation ( 网络地址转换 )
NAT 机制的思想实际上就是使用一个 全局的 IP 地址,来代表一批私有 IP 的主机。
(1) 根据例子理解 NAT 机制
在下图中,在局域网1 中,全局 IP 123.456.12.7 这个地址用来表示整个局域网内的主机地址。在局域网2 中,也是同样的操作。而由于不同的局域网可以使用重复的主机 IP,这样一来,就可以 " 重复使用相同的 IP地址了 ",以此间接达到地址复用的目的。
在上图中,类似于 192.168.xxx.xxx 这样的 IP 是一个局域网内部的 IP,局域网内部的 IP 在同一个局域网内部不能重复,但两个不同的局域网可以使用重复的局域网 IP.
当使用局域网1 中的主机1 尝试发送请求,想与使用广域网范围的设备进行通信的时候,主机1 就要先将 IP 地址转换为路由器对应的 全局IP,通过这个 全局IP 再来和广域网范围的设备进行通信;而当广域网范围的设备返回响应的时候,也先是返回到路由器上,路由器再将 全局IP 转换为 主机1 的 私有IP,这样一来,主机1 最终才能获取响应。
简单说明通过 IP,发送与接收数据的过程:
主机1 发送数据,源 IP -> 目的 IP 的过程:
私有IP 192.168.0.10 -> 全局IP 123.456.12.7 -> 广域网的目的 IP
主机1 接收广域网返回响应的过程:
广域网的目的 IP -> 全局IP 123.456.12.7 -> 私有IP 192.168.0.10
举个例子:大学生在学校拿快递的时候,学校附近可能不止一家菜鸟驿站,而不同的菜鸟驿站中取件码可以相同,但这些菜鸟驿站基本上是围绕着大学的学生服务的。那么某某大学就相当于是一个广域网,某个菜鸟驿站就相当于某个局域网对应的 全局IP,菜鸟驿站中的取件码就相当于各个主机,因为各个取件码依赖着所属的菜鸟驿站,而快递员送快递的时候,根据快递类型又来放入不同的菜鸟驿站中。
(2) NAT 机制对应的模型
NAT 机制是当下互联网中解决 IP 地址不够分配的典型情况,也比较的适合当下的网络。
对上图的发送数据与返回数据进行说明:
- NAT 路由器发送数据时,将 源IP 从 10.0.0.10 替换成全局的IP 202.244.174.37;
- NAT 路由器返回数据时,将 目标IP 从 202.244.174.37 替换回 10.0.0.10;
- 在 NAT 路由器内部,有一张自动生成的,用于地址转换的表,当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系。
3. IPv6 协议
IPv4 是长度为 32位的数据,而 IPv6 是长度为 128位 的数据,读者可以使用计算器计算一下,IPv6 是一个巨大的数字。
IPv6 相当于釜底抽薪,它从根本上解决了 IPv4 协议的地址不够用问题。虽然 IPv6 已经提出了很多年了,但在当下的网络时代, IPv6 的普及程度,仍然相对较低,使用 IPv6 的 IP 远远少于使用 IPv4 的 IP.
原因就是 IPv6 和 IPv4 互不兼容,所以如果你要想升级成 IPv6,得把相关的网络设备,例如交换机、路由器、服务器…都得升级成 IPv6. 而这需要很大的一笔费用才能支持更换这些设备。此外,原先使用 IPv4 的网络设备使用寿命一般较长,也无需更换。
四、拓展
1. 关于局域网的一些特点
以下三类 IP 都表示局域网IP:
① 10.*
② 172.16.* - 172.31 .*
③ 192.168.*
① 每一个局域网内的主机,网络号需相同,主机号不能相同。
② 两个相邻的局域网,网络号必须不同。( 同一个路由器所构成的相邻局域网 )
③ 网络号需要根据子网掩码得出,子网掩码非常有特点,左半部分全是1,右半部分全是0. 然后把子网掩码和 IP地址 进行按位与运算,得到的结果就是网络号。因此,一般情况前半部分就是网络号,后半部分就是主机号。
2. 特殊的 IP地址
① 如果主机号全为0,这个 IP 就表示网络号,表示当前这个网段。
② 如果主机号为 1,这个 IP 通常表示当前网段的 " 网关 ",即路由器,就表示这个网络的出入口。
大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道 " 关口 ",这道关口就是网关。顾名思义,网关,就是一个网络连接到另一个网络的 " 关口 "。也就是网络关卡。(来自百度)
③ 如果主机号为 255,这个IP表示 " 广播IP ",如果你搞一个 UDP 数据报,然后把目的 IP写成主机号为 255 的 IP,此时这个数据报就能在当前局域网中广播,它的作用体现在:能够发给每个局域网中的设备。
④ 127.*
127.0.0.1 环回 IP 表示自己当前的主机。