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的路
路由表中的“下一跳表项”
指向更上一级的路由器
越上级的路由器,它的路由表就越大,记忆的就越多,功能也会越多(见多识广的路由器)
这个指向,就是到达终点的大致方向
对于路由表这种数据结构,如果不是路由器开发工程师,大概率涉及不到的。在这里不做研究~