详细讲解IP协议 O > O
文章目录
- JavaEE & IP协议
- 1. 地址管理
- 1.1 IP协议报文格式
- 1.2 动态分配IP地址
- 1.3 NAT机制
- 1.4 IP协议
- 1.4 IP协议工作过程
- 1.5 IPV6协议
- 1.6 IP地址的组成
- 1.7 特殊的IP地址
- 2. 路由选择
JavaEE & IP协议
1. 地址管理
我们希望,每个网络上的设备,要能分配到一个地址(唯一)
1.1 IP协议报文格式
本质上,IP地址就是一个32为的整数
- 点分十进制的形式~
- 三个点分成四个部分,每个部分0-255
而如果单看int的取值范围
- 它可以表示42亿9千万的数据
- 2147483648 * 2
- 字节换算牢记(常见)
- 0 - 255 ==> -128 - 127
- 0 - 65535 ==> -32768 - 32767
- 0 - 42亿9千万 ==> -21亿 - 21亿
显然,这是不够用的
- 全世界有很多的电脑,服务器路由器,还有很多很多很多的手机~
1.2 动态分配IP地址
设备上网才分配,不上网就不分配
- 可以省下一大批ip地址,但是并没有增加ip地址的数量
- 治标不治本,只能缓解~
路由器的一个功能,DHCP
- 如果开启了DHCP,此时路由器就自动给你的设备分配一个局域网内唯一的ip
- 默认是开启自动分配的
- 不开启也可以,但是需要人工来保证你的ip是唯一的
- 如果与别人重了,两个人都得寄
昨天的IP和今天的很可能不一样~
1.3 NAT机制
它把所有的IP地址分为两大类:
- 内网IP: 【10.* 】或者【172.16.* ~ 172.31.* 】或者 【192.168.* 】
- 只要是这三种开头的,都被称为内网ip
- 外网IP:剩下的ip
- 多个设备一个外网IP,一个设备一个内网IP
- 不同外网IP的设备,可以有同一个内网IP
例子:
我们在现实中其实也不少见这种情况
- 例如在学校网购,如果只有一个快递驿站,那么所有学生老师的快递的地址都填的是学校的地址
- 学校的地址是唯一的,但是这个包裹的主人不一定唯一
即,内网设备如果要访问外网,会给它分配一个外网IP
- 这个外网IP并非某设备的专属,
- 而是这个内网中的所有设备都共用这一个外网IP~
在这样的放宽之下,IP就够用了~
什么是内网和外网:
- 局域网可以称之为内网
- 一个设备的局域网的内网IP
- 对于内网和外网的规模规范,没有明确,类似局域网和广域网的界限
- 在广域网内的外网ip(局域网在广域网中的位置),内网设备要向与外界交流,必然有一个外网IP,即所属局域网共用IP
控制台ipconfig:
- 内网IP
iP地址查询–手机号码查询归属地 | 邮政编码查询 | iP地址归属地查询 | 身份证号码验证在线查询网 (ip138.com)
- 这就是一个外网IP
- 共用IP
1.4 IP协议
1.4 IP协议工作过程
- 设备1要发消息给设备2:
- 构造IP数据报
-
经过路由器:
-
内网设备必须有外网IP才能发送给外网设备
-
源IP替换为路由器(NAT设备)的IP
-
- 设备2收到通过网络传输来的IP数据报:
- 也就是说,设备1所在局域网,也有其他设备用的是同一个外网IP
- 设备2无法分辨这两个数据报属于不同的设备的请求
-
设备2返回响应:
- 让路由器去处理,设备2按照数据报发送就好了~
- 路由器是知道替换关系的
端口号用来区分一个主机的不同程序,
配合内网IP去区分不同主机的不同程序,也完全可以
在NAT背景下如何通信:
- 外网设备 => 其他外网设备,不需要任何NAT,直接就能通信
- 内网设备 => 其他内网设备,不允许!
- 你的内网IP,不同局域网也可以有
- 外网设备 => 内网设备,不允许!
- 只能交给那个路由器,他秘密地交给对应的设备
- 好比说,你知道了内网设备的内网IP,那么这个IP不同局域网也能用(有很多),那么你怎么发送呢?
- 并且,你也不能通过这个内网IP获取这个内网设备的外网IP~
- 内网设备 => 外网设备,对应的内网设备的路由器
- 触发NAT机制进行ip替换,此时就会给这个网络数据报的源ip替换成路由器自己的ip
- 即,内网设备的数据报获取一个共用的外网ip
1.5 IPV6协议
从根本上解决IP不够用问题
- 前面的IP协议,其实是IPv4
- IPv4是传统的IP协议,使用4个字节,32位表示ip地址
- IPv6是更新了一些的IP协议,使用16个字节,128位来表示ip地址~
- 大了可不止4倍,而是296次方倍!!!
- 这个数字,给地球的每一粒砂子分配ip都是够用的~
- 电子产品 本质上是 Si,Si的来源就是砂子(SiO2)
IPv6早在2000时期提出,但是现在上网还是以IPv4为主
- IPv6,真正被用到的情况很少~
IPv6月IPv4并不兼容
- 一个IPv4路由器,要想支持动态分配和NAT,软件上升级下系统就行了(成本低)
- 一个IPv4路由器,要想支持IPv6,光升级软件没有用,还得升级硬件(成本很高)
- 旧的路由器得丢了换新的IPv6路由器
在我国,IPv6的普及率很高了(世界一流) => 70% +
- 已经准备就绪了,但是还没开启使用,就是我们一般的路由器支持IPv4和IPv6,但是IPv6默认是关闭的~
1.6 IP地址的组成
- 网络号
- 标识一个局域网
- 主机号
- 标识了一个局域网内部的主机
- 同一网段网络号一样,不同主机的主机号一定不一样
一个路由器有两个IP:
- WAN口IP
- LAN口IP
例子:
- 上面的局域网,192.168.1就是网络号,最后一个点后面就是主机号
- 下面的局域网,192.168.0就是网络号,最后一个点后面就是主机号
- 路由器1,连接两个局域网,这两个局域网就是“相邻”的局域网
- 这两个局域网的网络号不能重复!
网路号与主机号的划分:
-
IP地址分类(ABCDE)(淘汰了)
-
前缀:用来区分类别(A类B类…)
-
每个类别的网络号和主机号是固定的
-
本来就不富裕的IP地址,我还要浪费比特位去区分类别
-
主机号的位数太多没必要(一般不会有那么大的局域网去连接那么多台主机)
-
-
- 子网掩码(真实的划分方式)
命令行+ ipconfig /all:
子网掩码,也是一个32位整数
- 但是它的特点就是,左侧是1右侧是0,1和0的个数和为32!
- 255.255.255.0 => 11111111111111111111111100000000
- 255.252.0.0 => 11111111111111000000000000000000
子网掩码的
- 【1的那段】代表IP地址的网络号
- 【0的那段】代表IP地址的主机号
- 这样其实就可以据局域网实际情况调整主机号的“上限”
家用网络,子网掩码一般是255.255.255.0但是对于一些大型网络,就可能会更复杂~
- 网络管理员负责
1.7 特殊的IP地址
假定子网掩码为 255.255.255.0
- 主机号比特位为0的IP
192.168.0.0 => 这个称为网络号
- 局域网里不应该存在某个主机的主机号为0
- 主机号比特位全为1的IP
192.168.0.255 => 这个称为广播地址
- 往这个地址发送UDP数据报,此时这个数据报会被转发给这个局域网里的所有主机!
- TCP不支持广播,TCP要建立连接嘛~
例子(投屏):
- 手机投屏到电视机上
- 手机和电视机都下载了投屏软件
- 手机和电视机在同一个局域网内
- 手机发起投屏,有一个自动查找电视机的过程,而这个过程就是,将广播地址发送了数据报,哪个设备有回应,就可能是你的电视机
- 因此手机能获取电视机的IP地址
发送数据报给广播地址,是在我不能预先知道对方的地址的情况下,所需要采取的探测操作
- 127开头的IP
127.0.0.1(最常用) => 称之为 “环回IP”
- 127.1.1.1
- 127.1.1.10
- …
环回ip对应特殊的虚拟网卡io
- 传入或者传出环回ip的数据,走的就是这个虚拟网卡(这个过程没有io操作,是纯内存操作)
所以,这个ip的数据传输要比普通ip快~
- 主机号为1的IP
192.168.0.1 => 一般称之为 “网关IP”
区别于刚才三种,这一种是习惯约定,不是强制约定
- 可以手动改的,但是正常没人会去改~
网关 — 局域网的出入口~
2. 路由选择
机器之间的信息交流,具体要走哪条路?
- 这就是“网络层”对传输路径规划
互联网,存在大量的冗余
- 之前核战争的时候,为了防止爆炸导致传播中断,所以是有多条线传输数据的!
那么在这几条路径里,应该要走哪条呢?
- 地图软件是站在上帝视角,他知道整块地区的模样,只需要解决“带权图的最短路径”问题就行了
在网络上,网络环境更复杂,没这么容易
- 某个路由器,是无法把整个网络环境的模样记录下来的
- 路由器只能记录周围的情况(较小范围,认识邻居或者邻居的邻居)
- 路由器内部使用,路由表这种数据结构来记录邻居的信息~
实际的转发过程,是渐进式的,类似于 “问路 一样”逐渐接近最终目标的~
- 每到一个路由器,就规划一下接下来的路径
图示:
- 如果的“目的IP”在路由表里有,直接指明道路
- 如果没有,它会根据路由表给你规划一条合理的走向目的IP的路
- 路由表中的“下一跳表项”
- 指向更上一级的路由器
- 越上级的路由器,它的路由表就越大,记忆的就越多,功能也会越多(见多识广的路由器)
- 这个指向,就是到达终点的大致方向
对于路由表这种数据结构,如果不是路由器开发工程师,大概率涉及不到的。在这里不做研究~
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!网络层告一段落,接下来是数据链路层,这也距离程序员更远
敬请期待~