JavaEE:网络原理——协议(网络层+数据链路层)

网络层:IP协议

IP协议报头

其中取值只有两种,分别是4和6,分别对应IPv4和IPv6

IP报头,单位是4个字节,可变长

 type of service,表示当前IP协议所处的工作模式
实际上只有四位是有效的。而且这4为是彼此冲突的,只有1位为1,其他3位为0

4位工作模式分别为

最小延时:吃饭吃得快

最大吞吐量:吃饭吃的多 != 快

最高可靠性:减少丢包的概率

最小成本:硬件设备的开销

描述了一个IP数据包的长度(报头+载荷)

虽然IP自身有长度限制,但是IP也提供了拆包/组包这样的功能。当TCP载荷很大,超过了64KB,到了IP这一层就可以拆成多个IP数据报,每个数据报拿一部分载荷

上述的拆包过程是系统内核自动完成的,程序员通过软件代码无法干预到

其实IP的拆包并不是完全因为64K的限制,而是在数据链路层还有限制

16位标识:描述哪些IP数据报的载荷应该往一起组装

3位标志:只有两位有效,其中1位表示这次的IP数据是否拆包了,还有1位是结束标记

13位片偏移:描述包与包之间的先后顺序

单位是次数,存储的是一个整数,一个IP数据报,每次经过一个路由器转发,TTL就-1。如果TTL为0了,说明快要丢包了

TTL一般来说采用32或者64这样的整数,足以支持当前的网络传输,也能防止某个数据在网络上不停地转发下去

32位整数够用吗?

其实是够的。参考六度空间理论:世界上任何两个人想互相认识,只需要最多6位朋友的介绍

在计算机中,每个路由就代表一位朋友,即使互联网很复杂,要访问到世界的每一个角落,最多只需要2^5=32 / 2^6=64次就足够了

表示在传输层使用哪个协议

针对IP首部进行校验,不管载荷

表示发件人地址和收件人地址


IP协议主要完成的工作:

1.地址管理

IP地址本质上是一个32位整数。为了方便一般把IP表示成点分十进制的方式,通过三个点分成4个部分,每个部分一个字节,每个部分的取值都是0~255

IP地址的意义:区分网络上的不同设备,让每台网络设备都有一个唯一的IP地址。


虽然表示的数据范围很大,但还是有不够用的情况,那怎么办?

①动态分配IP地址。

全世界的设备不是同一时刻都在上网,没上网的设备就可以把原来的IP地址让出来给准备上网的设备


②NAT机制(网络地址映射)

本质:不增加IP地址,让IP地址复用,提高IP的利用率

把IP地址分成两大类

1)私网IP/局域网IP,后面三类IP地址10.*,172.16.*~172.31.*,192.168.*都属于死亡IP

2)公网IP/广域网IP,除了上面三类IP地址剩下的都是公网IP

现在要求公网上的设备对应的公网IP都必须是唯一的,但是私网/局域网上的设备使用私网IP,只要保证单个局域网内部的IP不重复即可。不同的局域网之间的IP允许重复

重要的限制:

1)在不同的局域网中,其中一个局域网的设备访问另一个局域网的设备是不被允许的

2)局域网设备访问公网设备就需要对局域网设备的IP进行地址转换

3)公网设备不允许主动访问局域网设备


构造一个IP数据报,源IP是192.168.2.10,目的IP是1.2.3.4

现在假设这个路由器的WAN口IP是5.6.7.8,这时候从电脑发出的数据经过路由器如果要进一步转发就需要路由器把IP报头中的源IP进行替换

现在的IP数据报长这样

此时这个数据包到达服务器之后服务器看到的IP就是5.6.7.8,无法看到之前的IP


替换的意义?

本质上是让一个公网IP可以对应到多个设备,从而起到节省IP的效果

现在假设有两台主机,主机1的IP地址为192.168.1.10,主机2的IP地址为192.168.1.20,路由器WAN口IP同上,现在主机1给服务器发送数据包

服务器返回的响应数据报经过路由器,路由器查通信信息记录表找到对应的表项,此时就把目的IP还原成之前的局域网IP。变成这样

如果局域网的各个设备访问的都是不同的服务器,路由器就可以很简单的通过服务器IP地址来区分当前进行的是哪次替换


如果同一个局域网内多个设备都要访问同一个服务器?

实际上路由器查的表还包含源端口和目的端口,端口号既可以区分同个主机的不同进程,也可以去区分不同主机的不同进程。由于客户端分配的端口号是随机的,所以两个主机之间的端口大概率是不一样的,路由器也可以用不一样的端口区分哪次替换

那如果恰好分配到相同的端口号呢?

NAT可能会修改传输层的报头,路由器会把相同的源端口号进行替换(映射),替换成主机之间互不相同的端口号,比如:

服务器收到数据之后会记录对端的信息,目的IP:5.6.7.8,目的端口:10001


网段划分

为了进行组网,把一个IP地址分成两个部分:网络号 + 主机号

网络号标识当前网段/局域网,主机号是当前局域网该主机的身份标识

前半部分 192.168是网络号;后半部分72.1是主机号

如果一个局域网中网络号和主机号相同,或者局域网中的设备网络号和路由器的网络号不同(这个主机无法通过路由器访问外网,也无法访问局域网中其他设备),都是无法上网

两个相邻的局域网,网络号不能相同(相邻?一个路由器连接的两个网络就是相邻的)

子网掩码

子网掩码可以用二进制表示成 1111 1111 1111 1111 1111 0000 0000 0000,这里有个特点,就是左半部分全是1,右半部分全是0,有明显的分割,不会1和0混着的。位置为1的部分就是网络号,为0的部分就是主机号。

我没有手动配置IP地址,为什么还能上网而且没遇到冲突的情况呢?

路由器的一种功能DHCP,能够自动帮你把局域网的设备IP都分配好。这样的分配,每次连到服务器(也就是重启电脑)后,得到的IP可能会不同

网关:局域网网络数据的进出口(一般是路由器),后面填的就是路由器的IP(LAN口的IP)


特殊IP地址

127.0.0.1 环回IP,表示自己本机(一般用来进行测试)

127.*开头的都是环回IP

某个IP主机号全都是0(二进制比特位),表示这个网段,这个IP比较特殊,不能分配给某个主机

如果某个IP的主机号为全1,表示广播地址,也不能分配给某个主机

广播?表示一对多这样的传输,往广播地址上发(UDP)消息,局域网中所有设备都能收到

单播:一对一

组播:一对多(这里的表示整体的一部分

广播:一对多(这里的表示整体)

广播的典型应用:手机投屏/电视投屏

投屏一般有一个要求:必须在同一个局域网中。手机如何知道有哪些设备支持投屏的呢?

通过广播完成,点击投屏,手机就会在局域网中广播一个查询数据包,看看有哪些设备回应。根据收到的回应就知道IP为哪个的设备能支持投屏。

接下来选择对应设备,就可以让手机和该设备进行通信,投屏的过程是直接传输数据的过程

所以除去全0和全1,路由器最多能分配254个IP地址,但是实际上路由器会有一个配置项,表示分配的IP地址的范围,也就是说,实际上分配的IP会更少


③IPv6

本质:增加IP地址的个数

IPv4使用4个字节表示IP地址,就有2^32个地址

IPv6使用16个字节表示IP地址,就有2^128个地址

IPv6的报头结构和IPv4是不兼容的,引入IPv6就意味着要更换成支持IPv6的设备


2.路由选择

路由选择就是规划路径。由于网络结构比较复杂,每个路由器只能掌握局部信息,无法掌握全局的信息,所以此时规划出来的路线只能是一个较优解

路由器的路线规划是一种探索是/启发式/渐进式的路线规划,通俗来说就是走一步看一步

数据包中包含了目的IP的字段,由于每个路由器内部有一个数据结构称为路由表,所以他们对于网络环境(相邻其他设备)是有一定的了解的,此时就可以根据路由器的路由表告诉数据包从路由器的哪个口出。

当然有可能你查询的目的IP在路由表里面找不到,他会默认让数据包走向更上层的路由器


数据链路层

以太网

横跨数据链路层和物理层,让硬件和软件相互配合

 MAC地址

在数据链路层中引入另外一套地址体系,称为MAC地址或者物理地址,注意和IP地址是不一样的

IP地址侧重于全局转发,数据包从起点到终点整个转发过程由IP地址负责完成

MAC地址侧重于局部转发,只负责数据包在两个相邻设备之间的转发

MAC通常按照十六进制的方式表示,字节之间用横线(-)或者冒号(:)来分割

MAC地址表示的范围比IPv4地址很多,所以当前MAC地址都是和主机一对一绑定的。而且MAC地址是静态分配的,在出厂的时候就写死了(MAC地址就可以作为机器的身份标识,例子:外挂)


 数据帧格式

这里一般叫数据帧,和数据包是一样的

标识了载荷数据的类型

意味着以太网数据帧是一个能够携带业务数据的报文

以太网数据帧载荷部分有长度要求,最短46字节(ARP的长度),最长是1500字节(硬件限制)

ARP和RARP是两个横跨了网络层和数据链路层的协议

ARP能够让路由器/交换机建立一个内部的结构,让IP地址映射到MAC地址,这个结构称为转发表,只是描述一个设备和哪些设备是连接着的

RARP是让路由器/交换机建立内部的结构,让MAC地址映射到IP地址(不重要)


DNS:域名解析系统

我们一般使用IP地址来描述网络设备的位置,但是我们一般在搜索栏里面输入的是www.bilibili.com这类的网站,而DNS就是用来把这一连串单词解析成IP地址的

全球那么多人上网,DNS服务器不得崩溃了?

DNS服务器并非是唯一的,而是有很多份。最开始的一套DNS服务器称为根域名服务器,里面的内容最全。后来每个国家根据里面的内容搭建镜像服务器,现在全世界有无数个镜像服务器

并且,搭建域名服务器的时候还会对域名进行分级管理,分成一级域名,二级域名等,这样可以让每个服务器管理的数据不多

8.8.8.8是谷歌搞的DNS镜像服务器,一般是不会挂的

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

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

相关文章

GEE实践应用|热岛效应(一)地表温度计算

目录 1.学习目标 2.理论介绍 3.从MODIS获得地表温度 4.从Landsat卫星获得地表温度 1.学习目标 ①了解如何使用GEE计算地表温度 2.理论介绍 城市化涉及用建筑物、道路和停车场等建筑结构取代自然景观。这种土地覆盖的改变也改变了土地表面的特性。这些变化的范围从表面反射和…

SpringBoot Redis的使用

官方文档: 官方文档:Spring Data Redis :: Spring Data Redis 和jedis一样,SpringBoot Redis 也可以让我在Java代码中使用redis,同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…

【微服务】Sentinel(流量控制)

文章目录 1.基本介绍1.Sentinel是什么2.Sentinel主要特性3.Sentinel核心功能1.流量控制2.熔断降级3.消息削峰填谷 4.Sentinel两个组成部分 2.Sentinel控制台显示1.需求分析2.下载3.运行1.进入cmd2.输入java -jar sentinel-dashboard-1.8.0.jar3.查看默认端口8080 4.访问1.账号和…

【八股】泛型

泛型存在的意义&#xff1f; 为了使相同的代码适用于多种数据类型&#xff0c;也就是代码复用。 参数类型上下限限制 <?> 无限制 <? extends E> 声明了类型的上界&#xff0c;表示参数类型可以是他或他的子类。 <? super E> 声明了类型的下界&#xf…

C++多线程:创建多个线程与数据共享安全问题(四)

1、创建多个线程 多线程的调度由操作系统负责&#xff0c;线程执行的先后没有严格的顺序完全看操作系统和CPU的心情。 #include <iostream> #include <vector> #include <thread>void thread_print(int num) {std::cout << "线程编号 " &…

视频无水印爬虫采集工具|抖音视频批量下载软件|可导出视频分享链接

全新视频无水印爬虫采集工具&#xff0c;助力您快速获取所需视频&#xff01; 视频无水印爬虫采集工具&#xff0c;为用户提供了强大的视频采集和下载功能。它可以批量提取关键词相关的视频&#xff0c;同时支持单独视频的提取和下载&#xff0c;操作简便&#xff0c;使用方便。…

数字兆欧表操作规程你知道多少?南电电力来告诉你!

一、数字兆欧表操作规程   数字兆欧表是一种现代化电子仪表&#xff0c;用于测量电气设备的绝缘电阻。其操作规程的目的是确保测量结果的准确性&#xff0c;并保证操作人员的安全。以下是主要的操作规程&#xff1a;   1.安全操作&#xff0c;断电与放电&#xff1a;在测量…

【MySQL探索之旅】MySQL数据表的增删查改——约束

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

ctf-36C3解析

一、环境 unbentu 这道题给了docker环境&#xff0c;gethub上面自己找 一个好用的linux全局切换梯子proxychains 二、开始解析 2.1初始 2.2编译 docker build . 2.3代理设置完毕 我试了一下代理还是不行&#xff0c;我们换源尝试一下 RUN sed -i s/deb.debian.org/mirro…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中&#xff0c;我们用Go的标准库来实现了服务器&#xff0c;JSON渲染重构为辅助函数&#xff0c;使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑&#xff0c;这是所有编写无依赖HTTP服务器的人都会遇到的问题&#xff0c;除非服务器只处理一到…

Redis桌面客户端

3.4.Redis桌面客户端 安装完成Redis&#xff0c;我们就可以操作Redis&#xff0c;实现数据的CRUD了。这需要用到Redis客户端&#xff0c;包括&#xff1a; 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1…

面向对象特征一:封装性

9.1 为什么需要封装&#xff1f; 我要用洗衣机&#xff0c;只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗&#xff1f;有必要 碰电动机吗&#xff1f; 我要开车&#xff0c;我不需要懂离合、油门、制动等原理和维修也可以驾驶。 客观世界里每一个事物…

乐维更改IP地址

1.1 系统IP调整 vim /etc/sysconfig/network-scripts/ifcfg-ens1921.2 Web相关服务IP变更 1.2.1 编辑/itops/nginx/html/lwjkapp/.env文件,更改ZABBIXSERVER、ZABBIXRPCURL、DB_HOST中的IP 1.2.2 进入/itops/nginx/html/lwjk_app/目录下,执行php bin/manager process-conso…

(免费分享)基于微信小程序电影院购票系统带论文

基于小程序的电影院购票管理系统【含报告】&#xff1a;前端 vue、elementui、小程序&#xff0c;后端 maven、springboot、springmvc、spring、mybatis&#xff0c;角色分为管理员、用户&#xff1b;集成小程序浏览电影&#xff0c;购票等功能于一体的系统。 目录 摘要 I Ab…

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点&#xff1a; 1.调试不能直接查看stl变量&#xff0c;会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内&#xff0c;要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了&#xff0c;不会结束程序 5.目前F2跳至断点…

elasticsearch 8.12+kibana 8.12

准备工作&#xff1a;1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件 从而不用重启项目 依赖、工具类 这边就不写了 因为项目用的是 Json 类型的配置文件 所以下文 主要是对json文件进行实现 别的文件大同小异 先说扯淡的东西 在nacos 的配置文件中 dataId 这两种声明 是…

华为流量整形配置

组网需求 如图1所示&#xff0c;企业网内部LAN侧的语音、视频和数据业务通过Switch连接到RouterA的Eth2/0/0上&#xff0c;并通过RouterA的GE3/0/0连接到WAN侧网络。 不同业务的报文在LAN侧使用802.1p优先级进行标识&#xff0c;在RouterA上根据报文的802.1p优先级入队列&…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么&#xff1f;2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…