[Java EE] IP 协议 | NAT 机制 | 路由选择 | MAC 地址 | 域名解析服务

发布于:2024-10-18 ⋅ 阅读:(7) ⋅ 点赞:(0)

Author:MTingle
major:人工智能


Build your hopes like a tower!



目录

一. 初识 IP 协议

IP 协议报头:

二. IP 协议如何管理地址

NAT机制

路由选择

三. 数据链路层(以太网): MAC地址

四. 域名解析系统


一. 初识 IP 协议

IP 协议工作在网络层,其目标是为了在复杂的网络环境中确立一条合适的路径传输,  IP 协议主要完成的工作有两方面,地址管理和路由选择.

地址管理: 是使用一套地址体系来描述互联网上每个设备的位置.

路由选择: 是指一个数据包如何从网络的某个位置传输到另一个位置.

IP 协议报头

IP 协议的版本取值有两种,4和6( IPv4 和 IPv6 ),当前主流版本是 IPv4 ,首部长度单位是 4 个字节.

8位服务类型,实际上只有四位有效,这4位是彼此冲突的,其中只有1位为1,剩下的必须为0,表示当前 IP 所处模式,他们分别为最小延时,最大吞吐量,最高可靠性( IP 协议并非像 TCP 一样提供了强可靠性,但是内部也会有一些防止丢包的考量 ),最小成本(最小硬件开销).

16位总长度,描述一个 IP 数据报的长度,包含报头和载荷,但是这并不意味着我们的 IP 收到了 64kb 的限制, IP 协议可以通过 拆包/组包 的功能突破 64kb 的限制,运输数据包,即时数据报非常大,在 IP 这一层会自动拆成多个 IP 数据报,每个数据报会携带载荷的一部分.

包拆了之后该如何组包呢?

16位标识,可以说明哪些 IP 数据报的载荷应该组装在一起.

3位标志(只有两位有效),1位表示这次的 IP 数据报是否拆包了,还有一位表示结束标记.

13位片偏移,描述了这些包的先后顺序.

8位生存时间,单位是次数,而且是整数,一个 IP 数据报,每次经过一个路由器转发,TTL -1,如果这个数值减到0,此时就说明数据包被丢包了,TTL 除了可以验证是否丢包,还可以防止某个数据在网络上被无限转发下去, TTL 一般来说是 32/64 这样的整数,足够支撑当前网络传输.

8位协议,表示的是在传输层使用的是哪个协议.

16位校验和,只针对 IP 的首部校验,载荷部分的 TCP/UDP 都自带了校验和, IP 协议就不用管了.

32位源 IP 地址,32位目的 IP 地址,表示了发件人地址和收件人地址.

二. IP 协议如何管理地址

NAT机制

IP 协议本质上就是一个 32 位整数,为了方便,就会把 IP 表示成 点分十进制 的形式,通过三个点分成四部分,每个部分表示1个字节,每个部分的取值都是 0-255.

但是,在网络飞速发展的年代,32位的IP地址不够用了!如何解决 IP 地址不够用,就成了当时一个严峻问题.下面我们来解析 IP 协议是如何解决这个问题的.

1. 动态分配 IP 地址,全世界的设备也不是同一时刻一起上网的,可以更充分的利用现有 IP ,但这只是权宜之计,不能根本上的解决问题.

2. NAT 机制( 网络地址映射 ):先把 IP 地址分成两个大类:私网 IP / 局域网 IP ,公网 IP / 广域网 IP .

IP 地址是以 10* ,172.16-172.31* , 192.168* 这三类开头的地址为私网 IP ,剩下的就是公网 IP .

由于上述设定,就产生了一个重要的限制:

1. 公网设备访问公网设备,没有任何问题,可以直接访问.

2. 局域网设备访问另一个在同一个局域网下的设备,也没有任何问题.

3. 局域网访问不在同一个局域网的设备,不允许访问.

4. 局域网访问公网设备,就与需要对局域网设备的 IP 进行地址转换.

5.公网设备不允许主动访问局域网设备.

一般一个路由器都会带有 2 个 IP 地址, LAN 口 IP 往往是一个局域网 IP , WAN 口 IP ,可能是局域网 IP ,也可能是公网 IP ,路由器的核心就是把这两个局域网连接起来.此处我们将模型简化,只考虑主机经一个路由器,把数据转入公网,最终到达了服务器: 

假设路由器的 WAN 口 IP 是5.6.7.8,这个时候,电脑上发出的数据,经这个路由器,想进一步往前转发,就会把 IP 报头中的源 IP 进行替换.经过上述替换,中间的源 IP 就被路由器修改了,改成了自己的 IP,当然,不是每一个路由器都会替换,局域网内的路由器会替换, 一旦这个数据包源 IP 变成了公网 IP ,就不会继续替换了.当这个包到达服务器后,服务器看到的 IP 就是5.6.7.8,就感知不到先前的 IP 了.

上述替换,本质上就是让一个公网 IP 能够对应到多个设备,从而起到节省 IP 地址的效果. 那么当数据需要返回时, IP 会怎么处理呢?

路由器在进行 NAT 地址转换的时候,会将此次的通讯的相关信息(替换之前的 IP ,替换之后的 IP ,服务器  IP ,源端口,目的端口)记录在表中,返回响应数据时,源 IP ,目的 IP 是反过来的.路由器通过查表,就能找到对应的表项,就能把目的 IP 还原成之前的局域网 IP .路由器收到响应之后,就可以查询,传输层中的目的端口,端口号可以用用来区分主机的不同进程,当然也可以用来区分不同主机的不同进程,客户端分配的端口号是系统随机分配的,两个主机之间的端口,大概率不相同.

若局域网中的两个设备,端口分配相同呢?此时路由器也会对端口号进行映射( NAT 也可能会修改传输层的报头,此时路由器就不是一个纯粹工作在网络层的设备,也会涉及到传输层的内容)

大部分情况下,局域网内不同设备访问的不是同一个网站,这个时候直接通过服务器 IP 就能够区分.

少数情况下,如果访问的是同一个服务器,就可以按照端口号进行区分.

极少数情况下,碰巧访问的是同一个服务器并且端口相同,就可以在路由器这边自动映射成不同的端口号,仍然能够区分. 

当前互联网就是 动态分配 + NAT相结合产生的方案.

IPv6的产生则从根本上提供了解决方案,增加了 IP 地址的个数,IPv4用四个字节表示 IP 地址,而 IPv6 用16个字节表示 IP 地址.,但是 IPv6 和 IPv4 的报头结构是不兼容的,所以目前还未启动 IPv6 进行通信.

网段划分

网段划分的产生为我们进行组网提供了便利,我们把一个 IP 地址分为两个部分: 网络号 + 主机号,我们的机器如果在同一个局域网中,网络号都是相同的,主机号则是不同的.家用宽带来说,一般我们默认前三个字节是网络号,主机号的范围就表示局域网中可以有多少个设备.

路由器的其中一个功能是 DHCP ,自动帮我们将局域网设备中的 IP 都分配好.当设备连接上路由器时,路由器会自动分配,因此同一个设备,每次连到路由器得到的 IP 是可能不同的.

如果一个局域网中,网络号和主机号都相同,则个时候是无法上网的,如果局域网中的设备,网络号和路由器的网络号不相同,也是无法上网的,两个"相邻"的局域网,网络号不能相同(一个路由器连接的两个网络,称为"相邻")

 一些特殊的的 IP 地址

127.0.0.1 环回 IP ,表示自己本机.一般可以用于测试.127* 开头的 IP 都是环回 IP .

如果某个 IP 的主机号全为 0 ,表示这个 IP 比较特殊,不能分配给某个主机.

如果某个 IP 的主机号为全 1 (二进制比特位),表示"广播地址".广播表示的是一对多的传输,这里的多指的是所有人,单播表示一对一,组播表示一对多(整体的一部分),广播表示一对多(整体所有).广播的一个典型应用场景就是:手机电脑投屏,点击投屏,手机就会在局域网中广播一个查询数据,~看哪些设备有回应,根据收到的回应,就知道 IP 为哪个的设备是能够支持投屏的.

路由选择

路由选择: 网络结构十分复杂,每个路由器都无法掌握全局信息,只能掌握一部分局部信息,此时路由器根据这些信息会给我们规划出一条路线,此为"较优解",举个例子:假如我们要从甲地前往乙地,我们找人进行问路.

1)出门,先问问 À=>坐上 336 公交车,你往南走.

2)问 B =>坐到运动公园下车,换地铁二号线.

3)问 C=>坐二号线坐到倒数第二站, 航天城.

4)问 D =>沿着这条街往南走走到下一个路口,一直往西走,走两条街左右就差不多到了.

5)问 E=>E 就说了,沿着这个路口稍微往北走一点就到了.

每一次问路,都会让我们离目标更近,最终到达目的地,路由器转发数据包的过程就与之类似,摸着石头过河,数据报中包含的"目的 IP "字段就是要问路的目标,每个路由器都对于网络环境以及他们相邻的设备情况有一些了解(路由器内部的存在一个数据结构--路由表,路由表中存在:目的 IP 网段,对应的网络接口,特殊的表项,更上层的路由器等等),此时,就可以根据他的了解告诉我们下一步往哪走.

三. 数据链路层(以太网): MAC地址

数据链路层引入了另一套地址体系,称为 "mac地址" / 物理地址, mac 和 IP 是两套独立的地址体系, IP 地址侧重于全局的转发,从起点到终点这整个转发过程,通过 IP 地址负责完成(查询路由表,通过 IP 地址), MAC 地址侧重于局部的转发,两个相邻设备之间的转发,一个电脑上连一个路由器,这就是相邻设备,一般开发中, MAC 地址用的比较少,而 IP 地址用的比较多, MAC 地址按照16进制的方式来表示,字节之间通过 - 来分割.

MAC 地址表示的范围比 IPv4 大得多,当前 MAC 地址和主机网卡一对一绑定. IP 地址很多时候是动态分配的,而 MAC 地址则是静态分配,网卡刚出的时候, MAC 地址就已经写死了,由于 MAC 地址有这样的特性,通常就会将 MAC 地址来作为你机器的身份识别.例如某些外挂只能在某个设备使用,其实就是根据 MAC 地址来进行绑定的.

1.西安->北京
源IP 西安, 目的IP 安广;
源mac 西安,目的mac 北京;

2.北京->长春
源IP 西安, 目的IP 安广;
源mac 北京,目的mac 长春;

3.长春->白城
源IP 西安, 目的IP 安广;
源mac 长春,目的mac 白城:

4.白城->安广
源IP 西安, 目的IP安广;
源mac 白城,目的mac 安广;

这两套地址体系,我们如果将他们合并成一套,分别在两个报头中使用,也是可以的.

四. 域名解析系统

域名,一串可读性更好的单词,域名解析系统可以将域名转换成对应的 IP 地址,再根据 IP 地址来找寻网络设备的位置.例如,阿b的域名就是:

在很早之前,引入了一个 hosts 文件,内部的内容就是行文本,每一行都有 IP 和 域名 ,每次访问某个域名都会进行查询,找到对应的 IP ,当今, hosts 文件仍然是有效的,只不过一般情况为空,因为随着互联网的发展,域名和服务器越来越多了,维护 hosts 文件变得十分麻烦,于是就有人搭建了一组服务器,来提供域名解析服务,hosts的内容就储存到服务器当中了,当某个主机需要访问某个域名,就可以先查询一下 域名解析服务器 (DNS 服务器),查询到的结果就是域名对应的 IP ,根据 IP 进行访问即可.

但是,全世界这么多人在上网,大家都去访问 DNS ,服务器能否抗住如此大的的请求量呢?

DNS服务器并非只有一份,而是有很多份,最开始的这一套 DNS服务器 ,我们称为 根域名服务器 ,这里面的内容是最全的,各个国家的网络运营商再根据根域名服务器的内容,搭建出"镜像服务器",网民上网时,一般就是访问附近运营商搭建的镜像DNS服务器.

搭建域名服务器时,还会根据域名进行分级管理,一级域名,二级域名,三级域名......这样就可以确保每个服务器管理的数据都不多.