🎇个人主页:Ice_Sugar_7
🎇所属专栏:计网
🎇欢迎点赞收藏加关注哦!
IP 协议
- 🍉报头结构
- 🍉地址管理
- 🍌动态分配 IP 地址
- 🍌NAT 机制(网络地址映射)
- 🍌IPv6
- 路由选择
🍉报头结构
TCP/IP 协议族是整个网络体系中最核心的协议,类似于 TCP,IP 所包含的内容也很复杂
IP 协议主要完成两方面的工作
- 地址管理:使用一套地址体系来描述互联网上每个设备所处的位置
- 路由选择:为一个数据包规划如何从网络中某个地址传输到另一个地址
先来认识一下 IP 协议报头
“16 位总长度” 描述了一个 IP 数据报的长度(包括报头和载荷),虽然 IP 自身有长度限制,但是 IP 也提供了拆包和组包
这样的操作,所以载荷很大也没关系,因为在 IP 这一层会自动拆成多个 IP 数据报,每个数据报携带一部分载荷
拆包后该如何组包呢?这就涉及到下面三个属性
🍉地址管理
设定 IP 地址的目的就是为了区分网络上不同的设备。但是 IP 地址本质是一个 32 位整数,由于网络设备越来越多,IP 地址不够用就成了上世纪 90 年代一个非常严峻的问题
对于这个问题,有三种解决方案
🍌动态分配 IP 地址
因为全世界的设备不是同时上网,所以就只给正在上网的设备分配一个 IP 地址就 ok 了。不过这并没有从根本解决问题
🍌NAT 机制(网络地址映射)
IP 地址分为两类
- 私网 IP / 局域网 IP
形如 10.,172.16-172.31.,192.168.* 的地址都是私网 IP - 公网 IP / 广域网 IP
不是局域网的 IP 就是公网 IP
公网上的设备对应的公网 IP 都必须是唯一的;但是私网上 / 局域网上的设备,它们使用私网 IP,只要保证在当前局域网内部的 IP 不重复就 ok 了,不同局域网之间的 IP 是允许重复的
这个设定就会带来一些限制:
- 公网设备可以直接访问其他公网设备
- 同一局域网中的不同设备之间可以相互访问
- 不同局域网中的设备之间不能访问
- 局域网设备如果要访问公网设备,那就需要先对局域网 IP 进行转换
- 公网设备不能主动访问局域网设备
这里第四点需要单独拎出来说一下
为了方便解释,这里就只考虑主机经过一个路由器之后就可以把数据转入公网,最终到达服务器,如下图:
所以发送数据报的流程如下:
上述的替换过程,本质上是让一个公网 IP 能够对应到多个设备,从而节省 IP 地址
路由器在 NAT 的时候会把这次通信的相关信息记录下来,比如源 IP、目的 IP。
如果局域网各个设备访问的服务器互不相同,那么路由器就可以通过服务器 IP 来区分是哪个设备,只需通过查表就可以把目的 IP 还原为之前的局域网 IP
如果访问的是同个服务器,可以通过端口号来区分,如下图,目的 IP 都是 5.6.7.8:
端口号可以用来区分同一主机的不同进程,也可以区分不同主机的不同进程,因为客户端的端口号是系统随机分配的,两台主机之间的端口大概率不同。路由器收到响应之后就可以查询传输层中的目的端口,看这里的端口是 2000 还是 3000,从而确定要把响应转发给哪个客户端
不过也有巧合,比如局域网中两台设备的端口恰好相同,那么此时路由器就会对端口号进行映射
:
比如对于第一个客户端:
🍌IPv6
IPv4 使用 4 个字节表示 IP 地址,取值范围为 0 - 2^32;而 IPv6 使用 16 个字节
表示,范围为 0 - 2^128。通过增加 IP 地址的个数,从根本上解决问题。但是 IPv6 的报头结构和 IPv4 不兼容
,引入 IPv6 就意味着当前的网络设备(路由器等)就需要更换为支持 IPv6 的设备
路由选择
路由选择就是路线规划,但是由于网络结构很复杂,每个路由器都无法掌握全局的信息,只了解一部分局部信息,因此路由器规划出来的路线,只是一个局部的最优解
(听起来类似贪心)
每个路由器对网络环境(与它相邻的设备情况)有一定的了解,这样它就可以根据数据报中的目的 IP,告诉数据报下一步应该往哪个方向走
其中的原理为:路由器内部有一个数据结构——路由表
,它记录目的 IP 的网段
和对应的网络接口
(就是从路由器哪个口出),但由于路由器只了解局部的情况,所以数据报的目的 IP 在路由表中很可能不存在,此时路由表中的特殊表项
(又称下一跳
)就发挥了作用,它指向一个默认的网络接口,这个接口通常指向更上层的路由器