【Java】网络编程-地址管理-IP协议后序-NAT机制-以太网MAC机制

🌈个人主页努力学编程'

个人推荐
c语言从初阶到进阶
JavaEE详解
数据结构

学好数据结构,刷题刻不容缓点击一起刷题

🌙心灵鸡汤总有人要赢,为什么不能是我呢

🐴🐴🐴地址管理

🐎🐎🐎网段划分

我们将IP地址划分为两个部分,网络号和主机号.

  • 网络号:保证两个不同的网段有不同的标识.
  • 主机号:在同一个网段中,我们为了区分不同的主机,这里引入主机号.


这里给大家强调几个有关IP地址在通信的过程中需要注意的过程

  • 不同的子网的作用就是将网络相同的主机放到一起.
  • 如果在子网中新增一个主机,则这台主机的网络号必须和子网中的网络号一致,但是主机号必须和子网中的主机号不同,我们就可以通过合理的设置网络号和主机号来构成唯一的IP地址.

这里在给大家一种很久之前的关于网络划分的方案,把所有的IP地址分为五类,如图:


当然这种划分网络号的形式,可以说只存在于教科书中了,我们在日常开发的过程中,使用的是上面所说的网络号,主机号的方式管理IP地址.

🐎🐎🐎特殊的IP地址

  • 将IP地址中的所有的主机地址全部设置为零,就成了网络号,代表这个局域网.
  • 将IP地址中的主机号全部设置为1,就成了广播地址,用于给同一个链路中互相连接的所有主机发送数据报.

这里给大家插一段,关于广播地址的一些知识,首先由于广播地址是一个虚拟的地址,没有具体的地址值,所以它的实现是基于UDP实现的,在具体应用中,其实就是我们平常在家里使用的投影过程,首先是使用手机,连接和家里客厅里的电视同一个网络,然后手机借助家里的路由器,向连接家里这个网络的所有的设备发送一个数据包,这个数据包的传递过程就是利用广播的形式传递点的,然后可以支持传递的设备就会响应一个可以连接的数据包,这样就完成了投屏中搜索设备的整个过程.

  • 127.*的IP地址用于本机回环(loop back)测试,通常我们使用的是127.0.0.1

🐎🐎🐎IP地址的数量限制

我们知道,IP地址(IPv4)是一个4字节,32位的正整数.那么一共就有42亿9千万左右,而TCP/IP协议规定,每个主机都需要有一个IP地址.

按照这样的逻辑,我们就只有43亿台主机能接入网络吗?

实际上,由于我们上面所说的一些特殊IP地址的原因,数量远不止43亿
相对的我们这里提出了三种解决方法:

  • 动态分配IP地址: 当设备接入网络的时候,我们才给他分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,都是有多个IP地址.
  • NAT地址:这个点比较重要,我们后面着重来讲.
  • IPv6:IPv6相对于IPv4来说极大的扩大了IP的数量,16个字节,128位来表示一个IP地址,使用IPv6就不用在考虑IP不够用的情况,因为它的数量足以给地球中的每一粒沙子分配一个IP,而计算机的主要硬件材料是硅,而硅就是用沙子做的,所以IP的数量是一定够的,由于它的IPv4是不兼容的,所以IPv6现在还没有大量普及.

🐎🐎🐎私有IP地址和公网IP地址

如果⼀个组织内部组建局域⽹,IP地址只⽤于局域⽹内的通信,⽽不直接连到Internet上,理论上 使⽤任意

的IP地址都可以,但是RFC 1918规定了⽤于组建局域⽹的私有IP地址

• 10.,前8位是⽹络号,共16,777,216个地址
• 172.16.到172.31.,前12位是⽹络号,共1,048,576个地址
• 192.168.
,前16位是⽹络号,共65,536个地址

包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公⽹IP);

一个路由器是可以配置两个IP地址的,一个叫WAN口IP,另一个叫LAN口IP(子网IP).

路由器LAN口连接的主机,都从属于当前这个路由器的子网中.

不同的路由器,子网IP其实都是一样的,(通常都是192.168.1.1).子网内的主机IP不能重复,但是每个子网之间的IP地址是可以重复的.

每一个家用路由器其实都是运行商路由器子网的一个节点,这样的运行商路由器可以有很多级,最外层的运行商路由器,WAN口IP就是一个公网IP.

如果我们希望自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以再阿里云/腾讯云上进行购买.

NAT机制:

这里给大家就介绍一下一台主机访问一个外部的服务器的时候的整个过程.由于我们在网络通信的时候,内网中的设备是没法访问公网中的服务器的,所以我们一般在发送请求之后给运行商路由器之后,中间会有一个机制叫NAT,它的作用就是给我们发送的这个数据包重新分配一个I公网的P地址,这样就可以访问外部的服务器,等到收到服务器收到响应之后,站在服务器的角度,它只是知道IP为运行商的机器给他发送了一个请求,对于后面的主机IP是一无所知的,所以发送响应的数据也是发送给了运营商这个IP,然后在运营商路由器里呜呼了一个类似于 "路由表" 的东西,这个东西的作用,就是将路由器IP和主机IP做了一个映射关系,等到我们收到数据之后,根据路由表找到发送请求的主机,然后将数据发送给对应的主机,完成整个通信过程.

🐎🐎🐎路由选择:

我们知道在真实的网络通信中,线路是非常复杂的,那么我们在网络通信的时候,到底是如何选择通信的线路的呢?

这里的过程就类似于 "跳一跳" 即 "问路" 的过程.

IP数据包的传输过程就类似于问路的过程.

  • 当IP数据包,到达路由器之后,路由器会先查看其目的IP;
  • 如果目的IP可以到达,直接将数据发送给目的IP.否则发送给另一个路由器
  • 重复这个过程,直到到达IP地址.


注意:

网络中,路由器的寻找,是不能直接寻找最优解的,我们只能找到所谓的 "较优解" 因为一台路由器是无法知道整个网络的结构的,它只能直到它附近的路由器的信息,所以我们寻找 "最优解" 的这个过程是启发式的,试探性的,逐渐知道最终的目标.

🐎🐎🐎数据链路层

对于数据链路层,就越来越接近底层了,离程序员越来越远了,这里着重关注一下其中的以太网协议就好,以太这个概念本身是物理上面的概念,用来描述光在真空中传播的一种介质,但是后面证明这个概念是不存在的,我们计算机就把这个概念拿来用了.

以太网横跨数据链路层和物理层,平时我们使用的有线网络就是以太网.

这里有一个非常重要的概念叫MAC地址(存在于目的地址和源地址是网卡出厂的时候固化的).

MAC地址和IP地址都是为了区分网络上的不同设备.

其实在开始的时候,开发MAC和开发IP地址的是同一伙人,独立各自提出的.

只是IP地址设置的是4个字节,MAC地址设置的是6个字节,现在4个字节明显不够用了,但是6个字节的MAC地址还是勉强够用的,我们刚才也说了,MAC地址是在出厂的时候,在网卡固化的时候设置的,所以理论上每个主机都有一个唯一的MAC地址.

基于这个原因,MAC地址就有了利另一个用处,可以用来识别主机的唯一的标记.

这里就让我想起了 "卖外挂" 商家,为了不让买家把外挂卖给被人或者到处传播,就会在外挂中加一个识别买家主机的程序,只有和买家的主机的MAC地址一致,才能使用外挂系统.所以理论上,我们其实是可以手动修改主机 的MAC地址的,只要修改成买家的MAC地址,就可以成功安装外挂了~~.

MAC的用处:

对于IP地址来说,是支持整个数据的转发过程的.而MAC是支持两个相邻的节点数据之间的转发.

这里给大家举一个栗子:

我要从未央区到周至,大致有这样几个过程:

未央区.西安北站.杨凌.周至

从IP地址的角度我们要对整个过程进行规划:

未央区->西安北站->杨凌->周至

具体每个过程我们需要从一个地方到另一个地方~~

  1. 未央区->西安北站
    源IP:未央区
    目的IP:周至
    源MAC:未央区
    目的MAC:西安北站
    2.西安北站->杨凌
    源IP:未央区
    目的IP:周至
    源MAC:西安北站
    目的MAC:杨凌
    3.杨凌->周至
    源IP:未央区
    目的IP:周至
    源MAC:杨凌
    目的MAC:周至

计算机中也是一样IP地址负责记录整个过程中的路线,而MAC地址则是记录每次走的每一步对应的路线.

我们上面针对以太网数据帧可以了解到其最大长度是1500字节,此处的1500也称为MTU(和硬件相关联的)针对不同的数据链路层协议,对应的MTU是不同的.

这里的 ARP 协议是为了给了每个路由器一个"转发表"这个表中就记录了IP地址->MAC地址的映射.

我们在发数据的时候,先根据目的IP,确定接下来往哪里走,直到下一跳的IP(查路由表),然后根据下一跳的IP,查转发表,直到IP对应的 MAC / 端口是哪个.

相关推荐
num_killer2 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode2 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐2 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲3 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红3 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥3 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v3 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地3 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209253 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei3 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot