目录
1. IP 协议报文格式
IP 协议是网络层的重点协议。
网络层要做的事情,主要就是两方面:
1) 地址管理
制定一系列的规则,通过地址,描述出网络上一个设备的位置。
2) 路由选择
网络环境是比较复杂的,从一个节点到另一个节点之间,存在很多条不同的路径,就需要通过路由选择这种方式,筛选/规划出更合适的路径进行传输。
我们先来看看 IP 协议长什么样。
2. 网段划分
一个 IP 地址,分为两个部分:网络号(标识了一个局域网) + 主机号(标识了局域网中的一个设备)
比如:
一个 IP 地址,哪个部分是网络号,哪个部分是主机号,通过子网掩码就能知道。
子网掩码是一个 32 位的整数,左侧都是 1,右侧都是 0 ,不会 1 0 交替出现。
带有子网掩码的网段划分,是当下的网络环境的现状。
很久之前也有过下面这种方式划分:
但是在现在,这种方式已经看不到了,只会在教材上出现这种划分方式。
如果一个 IP 地址,主机号全为 0,当前这个 IP 就表示网络号,一个具体的主机是不能分配这个 IP 的。
192.168.17.0
255.255.255.0
如果一个 IP 地址,主机号全为 1,当前这个 IP 就表示广播地址,一个具体的主机是不能分配这个 IP 的。
192.168.17.255
255.255.255.0
如果一个 IP 地址是以 127 开头的,那么这个 IP 地址就是 "环回 IP ",表示的是设备自身,最常用的是 127.0.0.1,操作系统提供了一个特殊的虚拟网卡,关联到了这个 IP 上,环回 IP 主要是测试用的,它能够排除网络不通干扰因素,更好的排查代码中的问题。
IP 协议的两个核心功能:地址管理和路由选择。
3. 地址管理
IP 地址是一个 32 位的整数,2^32 => 42亿9千万
地址,理论上来说,是不应该重复的。
在以前看来,可能会觉得这个数字很大,绰绰有余,但是到了今天,能上网的设备早就超过了 42亿9千万 这个数字。
那么如何解决 IP 地址不够用的问题呢?
1) 动态分配
你要上网才给你分配 ip,不上网就不分配 ip。但是这个方案,指标不治本,提高了 ip 地址的利用率,并没有增加 ip 的数量。
2) NAT 机制 (网络地址转换)
本质上是让一个 ip 地址,代表一批设备。
把 IP 地址分为两个大类:
1. 内网 IP (局域网 IP)
如果一个地址,是以 10.* 或者 172.16.* - 172.31.* 或者 192.168.* 开头的,那么这个 ip 就是内网 ip。
同一个局域网内部,内网 IP 不能重复。不同的局域网之间,内网 IP 之间,可以重复。
2. 外网 IP (广域网 IP)
剩下的 ip 就是外网 ip。
外网 ip 则始终都不允许重复,只能唯一。
当前情况下,通常都是一个小区/一个学校/一个公司,构成一个大的局域网,这个局域网中可能就有几千个,上万个设备,这样的局域网,就使用一个外网 ip 即可。
那么 NAT 机制具体是怎么工作的呢?
如图:
如果当前局域网内,有多个主机,都访问同一个网站服务器,此时服务器返回的响应经过路由器之后,要交还给哪个主机呢?
如图:
如果同一时间,同一局域网,并且是相同的端口的主机同时请求同一服务器的话:
当前的网络环境,就是以 NAT + 动态分配的方式来解决 IP 地址不够用的问题的。
NAT 机制,最大的优势是:"纯软件的方案"。
也正是因为这个机制,局域网内部的设备,能够主动访问外网的设备,外网的设备无法主动访问局域网内部的设备,这个局限性也不是坏事,能够很好保护我们的设备。
3) IPv6
IPv6 使用 16 个字节来表示 IP 地址,这个就从根本上解决了 IP 地址不够用的问题。
2^8^16 = 2^128 = 2^32 * 2^32 * 2^32 * 2^32 = 42 亿的四次方,最终的结果是个天文数字。
这个数字大到可以给地球上的每一粒沙子都分配一个不同的 ip 地址,还绰绰有余。
但是,IPv6 的普及程度,是比较低的。
IPv6 最大的问题是和 IPv4 不兼容,想要支持 IPv6 就得换设备,要花钱,可是花了钱,网速上也不会有提升,所以就没人乐意主动升级 IPv6,但是我国是 IPv6 普及程度最高的国家,因为国家大力推进支持升级 IPv6,现在近几年装的宽带,都是主动送你支持 IPv6 的路由器的。
4. 路由选择
路由选择,就是描述了 IP 协议(IP 数据报) 的转发过程。
从 A 到 B,中间有很多条路径可以走。
进行数据包转发的时候,每个路由器都是无法知道网络的 "全貌" 的,只知道一些局部信息(一个路由器能知道哪些设备和它自己是相连的),这就意味着,IP 数据在转发过程中,是一个 "探索式", "启发式" 的过程,这个过程很难给出最优解,只能是较优解。
一个网络层的数据报,每次到达一个路由器,都会进行 "问路"。
每个路由器都有一个数据结构 "路由表"(路由表内容可以手动配置,也可以自动获取),根据数据报中的目的 IP,来查询路由表,如果查到了(相当于问路人,路人知道怎么走),就直接按照路由表给定的方向(从哪个网络接口进行转发),继续转发就行了,如果没查到(问路人,路人也不知道怎么走),路由表里面有一个 "默认的表项" (下一个地址),按照默认的表项转发即可。