【JavaEE】计网之IP协议+以太网+DNS

news2025/1/22 20:54:07

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE初阶

网络层重点协议——IP协议,在复杂的网络环境中确定一个合适的路径~

本篇文章我们来讲解什么是 IP协议及以太网,在IP协议中,有 地址管理 和 路由选择 两个方式,IP协议是位于 OSI模型 中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但 IP协议 是网络层传输所使用的最主流的一种协议。


目录

文章目录

一、IP协议-地址管理

1.1 IPv4报头介绍

1.2 动态分配IP地址(缓解)

1.3 NAT 机制

1.4 使用 IPv6

二、IP地址组成

2.1 分类

2.2 子网掩码

三、路由选择

四、数据链路层——以太网

4.1 ARP协议

五、DNS


一、IP协议-地址管理

在IP地址中,地址管理分配的每一个设备的 IP地址 是唯一的~~~

IP协议是位于OSI模型中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但IP协议是网络层传输所使用的最主流的一种协议。

有IPv4和IPv6两个版本, 目前IPv4在全球仍然是主流使用的协议, 但IPv6在中国已经基本普及了, 而且中国也是全球IPv6覆盖率最高的国家, 下面内容的介绍以IPv4为主。

1.1 IPv4报头介绍

IPv4协议格式如下:

本质上:IP地址,本质上是一个 32 位的整数,通常会把32位的整数,转换成点分十进制的表示方式~~

三个点,把这个整数分成 4 个部分,每个部分,一个字节,每个部分的取值范围 0 - 255

那么 32位 的整数,最多能表示:

  • 它可以表示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 机制

在 NAT 背景下如何通信?

外网设备 -> 外网设备,不需要任何 NAT,直接就能通信

内网设备 -> 其他内网设备,不允许!!

外网设备 -> 内网设备,不允许!!

内网设备 -> 外网设备,对于的内网设备的路由器,触发 NAT 机制进行ip 替换~~

NAT机制下,把所有的IP地址分为两大类:

1.内网IP(私有IP):【10.* 】或者【172.16.* ~ 172.31.* 】或者 【192.168.* 】

  • 只要是这三种开头的,都被称为内网ip

2.外网IP:剩下的IP地址(唯一)

外网IP是互联网中唯一的地址, 不会出现重复的情况, 分配外网IP的设备可以被互联网中其他的电脑直接访问到.

  • 多个设备一个外网IP,一个设备一个内网IP
  • 不同外网IP的设备,可以有同一个内网IP

例子:在网上购物,收货地址填写的是小区的地址,而小区里面有很多人,每个人用姓名和手机号区分,而进入内网IP 后 则是用端口号区分

如果某个内网里的设备想访问公网的设备, 就需要对应的NAT设备(路由器)把内网IP映射成公网IP, 从而完成网络访问;但是这个外网 IP 不是这个设备独占的,而是这个内网中所以的设备都共用这一个外网 IP 了~~一个外网 IP 代表一系列的设备了~~

反之, 公网的设备也是无法直接访问私网的设备的, 不同局域网的私网的设备没法直接相互访问.

两台主机在发送给路由器之前,主机的 源ip 是路由器的 内网ip,当主机去访问外网服务器时 IP地址会被路由器替换成 路由器自己的外网IP,站在服务器的角度看,主机的IP地址就是路由器的源IP,服务器返回的响应先发给路由器,路由器随后根据设备的端口号来区分响应发给哪个设备.

内网ip: 

 

 NAT机制能够有效解决IP地址不够用的问题, 但带来的副作用就是让网络环境更加复杂了…

1.4 使用 IPv6

IPv6 使用16字节表示IP地址,这可表示的IP地址个数就是一个天文数字了,可以把地球上的每一粒沙子都分配一个地址.

IPv6虽然看起来可以完美的解决问题, 但当今世界上仍然是以NAT+ IPV4+动态分配来进行网络组建的,除了国内, 世界上其他地方IPv6的覆盖率还是比较低的, 这是因为, lPv6和IPv4是不兼容的, 要想支持IPv6就需要大范围更换路由器等网络设备, 这个成本是极大的, 而国内环境主要是工信部给力啊.

二、IP地址组成

在IPv4中, IP地址分为两个部分, 即网络号和主机号~

  • 网络号:标识网段,保证相互连接的两个网段具有不同的标识;
  • 主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

网络号能够描述当前的网段信息(标识一个局域网), 主机号区分了一个局域网中的主机;

要求在同一个局域网内, 网络号必须相同, 主机号不能相同, 两个相邻的局域网(同一台路由器连接), 网络号不能是相同的.

那么如何划分网络号和主机号呢?

2.1 分类


过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示(该图出 自
[TCPIP])

分 类范围适用网络网络数量主机最大连接数
A 类0.0.0.0 ~
127.255.255.255
大型网络12616777214
($2^{24}$-2)
B 类128.0.0.0 ~
191.255.255.255
中等规模网
约16000
65534($2^{16}$-2)
C 类192.0.0.0 ~
223.255.255.255
小型网络-254($2^8$-2)
D 类224.0.0.0 ~
239.255.255.255
E 类240.0.0.0 ~
247.255.255.255

这种分配了解就好,已经不常用了!!!

2.2 子网掩码

格式
(1)子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度.

  • 255.255.255.0 => 11111111111111111111111100000000
  • 255.252.0.0 => 11111111111111000000000000000000

下图是一个经典的局域网环境:

图中两个相邻的局域网的网络号是不能相同的, 属于一个局域网中的设备网络号都是相同的但主机号是不同的, 通过这样网络号和主机号这样的划分就可以进行组网了

 

一个路由器,有两个 ip 地址,分别是在不同的局域网中,一个路由器的作用就是把两个局域网连接起来~~

  1. WAN 口 ip
  2. LAN 口 ip

在上图中,此时这个路由器就把两个局域网连接到一起了,此时这两个局域网就称为“相邻"的局域网,这俩个局域网的网络号,是不能重复的!!!

但网络号的位数与主机号的位数并不是固定的, 在计算机网络, 有一个单独的概念叫做子网掩码, 它也是使用32比特位对应IP地址的每一位, 如果为1就表示这一位是网络号, 为0就表示主机号, 它是独立于IP地址的另一串数字来辅组记录的, 子网掩码不会混着排列, 左边为1表示网络号, 右边为0表示主机号.

对于家用设备来说, 子网掩码最常见的就是255.255.255.0了, 即11111111111111111111111100000000, 表示IP地址中左边24位构成网络号, 右边8位构成主机号.

 还有一些特殊的IP地址有着特殊的作用:

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网.
  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包.
  • 127.*的IP地址用于本机环回(loop back), 通常是127.0.0.1, 本机环回主要用于测试程序是否能正常工作, 是本机到本机的网络通信(系统内部为了性能, 不会走网络的方式传输), 对于开发网络通信的程序(即网络编程)而言, 常见的开发方式都是本机到本机的网络通信.
  • 主机号为1, 即IP地址段的第一个, 比如192.168.0.1, 通常是"网关IP(不绝对, 是可以配置的).
     

例子(投屏):广播地址

  1. 手机投屏到电视机上
  2. 手机和电视机都下载了投屏软件
  3. 手机和电视机在同一个局域网内
  4. 手机发起投屏,有一个自动查找电视机的过程,而这个过程就是,将广播地址发送了数据报,哪个设备有回应,就可能是你的电视机
  5. 因此手机能获取电视机的IP地址

三、路由选择

路由选择其实就是规划路径, 数据想要从一个设备到另一个设备, 需要先规划一条路出来, 然后数据沿着这条路进行传输, 传输到目标IP地址;

 

在网络上,网络环境更复杂,没这么容易

  • 某个路由器,是无法把整个网络环境的模样记录下来的
    • 路由器只能记录周围的情况(较小范围,认识邻居或者邻居的邻居)
  • 路由器内部使用,路由表这种数据结构来记录邻居的信息~

实际的转发过程,就类似于”问路“这样的过程,逐渐接近目标的

  1. 如果的“目的IP”在路由表里有,直接指明道路
  2. 如果没有,它会根据路由表给你规划一条合理的走向目的IP的路

四、数据链路层——以太网

数据链路层中使用的典型协议也有很多, 其中最知名常用的就是 "以太网"了, 考虑的是相邻两个节点(通过网线/光纤/无线直接相连的两个设备)之间的传输.

以太网帧体格式如下:

  1. 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;(出厂写死的)
  2. 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
  3. 帧末尾是CRC校验码

目的地址, 源地址(6字节): 数据链路层的地址是MAC地址, 表示物理层地址, 这个地址和IP地址是完全独立的另一套地址体系, 每一个设备只有一个物理层地址, 在网卡等硬件设备出厂时这个地址就已经写死了(大部分), 使用6个字节来表示, 地址长度比IPv4长了6w多倍

把这个数据链路层数据帧,最大载荷长度,称为 MTU.以太网帧中的数据长度规定最小46字节,最大1500字节.

如果承载的数据,长度超过 MTU,就会在IP层进行分包~~使每个分出来的结果,都能在 MTU 之内~~

 

 

 

4.1 ARP协议

ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议

ARP协议的作用:

ARP协议建立了主机 ip地址 和 MAC地址 的映射关系

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址
     

五、DNS

DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统。

TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址
 

域名是一个字符串,如 www.baidu.com , hr.nowcoder.com


域名系统为一个树形结构的系统,包含多个根节点。其中:
1. 根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了数量。
2. 子节点主要由各级DNS服务器,或DNS缓存构成。

  • DNS域名服务器,即提供域名转换为IP地址的服务器。
  • 浏览器、主机系统、路由器中都保存有DNS缓存。
  • Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,
  • Mac/Linux系统的DNS缓存在 /etc/hosts 文件中

在早期的时候, 互联网上的服务器很少, 这域名和IP这样的映射关系只是使用一个hosts文件来维护, 每个用户只需要手动自己的hosts文件就可以了, 现在的电脑还是有这个文件的, 也可以使用. 

网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址,
如果电脑的DNS服务器配置不对, 或者是DNS服务器挂了, 就会出现一个典型的情况: 网络正常的情况下, QQ等应用程序可以用, 但是网页打不开了.

我们自己电脑的DNS服务器可以通过如下方式配置,首先打开设置中 “网络和Internet” 中的 “高级网络设置” , 点击 “更多网络适配器器选项”.

然后右击WLAN或者以太网, 选择属性.

 然后选择IPv4的的字段就可以进行配置了.

这里可以自己去配置DNS服务器的地址, 常用地址百度一下就行, 很多的, 也可以选择自动获取(从路由器中获取).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中基类和派生类的构造函数与析构函数的调用顺序分析

基类为B,派生类为C,直接上代码以及运行结果。 目录 思路分析 代码一 运行结果一 代码二:B(i)改为b(i) 运行结果二 代码三:加上B(i) 运行结果三 代码四:删掉C类定义的B对象b,删除b(i) 运行结果四 思路…

Linux使用全应用

一、CentOS安装Docker Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。 基础命令 搜索镜像:docker search mysql 下载镜像:docker p…

[架构之路-197]-《软考-系统分析师》- 关键技术 - 问题分析阶段重要的四个任务

目录 前言: 一、信息系统/软件产品的问题分析概述 二、信息系统/软件产品的问题/痛点分析四步骤 步骤1、问题领域分析:研究遇到问题的业务领域(诉求) 步骤2、 领域问题和机会分析:分析业务领域的问题、痛点、难点…

计算机网络学习 一 (计算机网络体系结构)

计算机网络 基本概念 计算机网络是一个将分散的,具有独立功能的计算机系统. 简单来说,计算机网络就是一些互连的,自治的计算机系统的集合 分类 广义上:是一个资源共享的系统. 资源共享上: 1.目的–资源共享 2.组成单元–分布在不同地理位置的多台独立的"自治计算机"…

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日)

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日) 编程题 第 1 题 问答题 二进制位数 十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。 十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。 请问十…

Linux高级---k8s之service服务

文章目录 一、service基本概念二、service类型三、service的使用1、实验环境准备2、ClusterIP类型的Service3、HeadLiness类型的Service4、NodePort类型的Service5、LoadBalancer类型的Service6、ExternalName类型的Service 一、service基本概念 在kubernetes中,pod…

【Java多线程编程】线程的六种状态

前言: 在我们进行多线程编程,脑海里会想到线程运行的状态到底是什么?因此我整理出这线程的状态这篇博文。线程的状态分为六种:新建状态(NEW)、就绪状态(RUNNABLE)、阻塞状态&#xf…

1-Linux环境安装JDK

Linux环境安装JDK 准备: ① Linux 环境 本文中Linux环境为 CentOS Linux 7 可使用以下命令查询 linux 系统版本: hostnamectl② 准备JDK包 进入官网 https://www.oracle.com/java/technologies/downloads/#java17下载对应jdk包 此处使用以前下载的旧…

Linux驱动编程(驱动程序基石)(下)

一、中断的线程化处理 复杂、耗时的事情,尽量使用内核线程来处理。上节视频介绍的工作队列用起来挺简单,但是它有一个缺点:工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有很多种,比如干脆…

String类的学习笔记(下):字符串拼接以及StringBuilder和StringBuffer的学习

本文介绍了String类对字符串进行拼接的方法 和拼接字符串的效率分析 以及能对字符串内容进行修改的StringBuilder和StringBuffer类其常用方法和区别 , 最后介绍了两个字符串经典面试题 StringBuilder和StringBuffer的学习 一.String类概括二.StringBuilder和StringBuffer1.字符…

是未来的超级计算机还是只是一场炒作?

随着科技的飞速发展和创新,量子计算技术逐渐成为了人们关注的热点话题。量子计算作为一种前沿的计算方式,具有超强的运算能力和突破性的创新潜力,因此备受瞩目。然而,随着各大公司和机构纷纷加入到这一领域的竞争中,一…

超详细github配置(仔细看,看完不会,你怪我)

github的重要性: 网络时代的程序员必备。 github的作用: 版本管理多人协作开源共享 常用方案: gitTortoiseGitgithub [Tortoise,程序员常称其为小乌龟,小海龟] 安装配置步骤 1.注册 GitHub: Where the world bu…

服务(第二十二篇)主从复制和读写分离

主从复制原理: 首先主节点会开启二进制日志,从节点会开启中继日志,从节点会开启io线程检测主节点是否有更新,如果更新了就会向主节点请求二进制事件,主会开启dump线程发送二进制事件,然后保存在从节点的中…

假如面试官让你十分钟完成双向循环链表

💌 博客内容:假如面试官让你十分钟完成双向循环链表,多一秒都不行 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信&…

大前端技能讲解:NodeJS、Npm、Es6、Webpack

文章目录 1. 基础概述2. Nodejs2.1 Nodejs 了解和快速入门2.2 Nodejs 实现 Httpserver 服务(实现请求响应)2.3 Nodejs 操作 MySQL 数据库 3. ES63.1 ES6 的概述3.2 ES6 的语法:let 和 const 命令3.3 ES6 的语法:模板字符串3.4 ES6…

基于SSM的在线电影购票系统设计与实现【附源码】

基于SSM的在线电影购票系统设计与实现 互联网的不断迅猛发展,每个行业都在寻找新的机会,都在从传统的人工方式向先进的信息化过度。随着人民生活水平的提高伴随的精神文化层次的享受,而现代互联网时代人们的重要精神消费之一是电影行业&…

NAS +AList实现云盘映射(本地硬盘扩容大法)

准备工具: 1)Alist的docker :xhofe/alist 2)RailDrive软件 安装: 1)安装alist的docker 注意一定要给读写权限,装载路径和我一样 端口一般和容器端口一致 环境变量 网络桥接就行 记得勾选自…

【Prompting】ChatGPT Prompt Engineering开发指南(1)

ChatGPT Prompt Engineering开发指南1 Prompting指南设置 提示原则策略1:使用分隔符清楚地指示输入的不同部分策略2:要求结构化输出策略3:让模型检查条件是否满足策略4: “Few-shot”提示 原则2:给模型时间“思考”策略1&#xff…

idea新建springboot项目并提交码云仓库

新建springboot项目 平常我们在使用联网方式新建springboot项目时总是会遇到连接失败等这种情况 IDEA创建项目,本质是从官网创建并下载项目,然后导入本地。 创建项目连接失败,一般是外国网站的原因导致连接超时,解决方式很简单&a…

C++linux高并发服务器项目实践 day11

Clinux高并发服务器项目实践 day11 线程同步互斥锁死锁读写锁读写锁相关操作函数 生产者消费者模型条件变量信号量 线程同步 线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量&…