当前位置: 首页 > news >正文

【网络】-- 网络基础

(本文是网络的宏观的概念铺垫)

目录

计算机网络背景

网络发展

认识 "协议"

网络协议初识

协议分层

OSI七层模型

TCP/IP 五层(或四层)模型

报头

以太网

碰撞

路由器

IP地址和MAC地址

IP地址与MAC地址总结

IP地址

MAC地址


计算机网络背景

网络发展

        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:

独立模式:计算机之间相互独立。

        如:有三个人,每个人做的不同的事物,但是是需要协作的完成。

        而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据内容放入到光盘中等,才能交给下一个人。传输具有人为操作,这样效率就会十分的低下,所以在这样的需求下,也就有了网络。

网络互联:多台计算机连接在一起, 完成数据共享。

         于是想到了将,三人的计算机链接到一个主计算机上,于是前一个人完成,将数据推送到主计算机上,然后下一个人来获取。于是便提高了效率,这就是初步的网络雏形。

局域网LAN:计算机数量更多了, 通过交换机和路由器连接在一起。

        后来随着协作人数的增加,计算机数量的大量增加,于是多台计算机直接通过交换机和路由器连接在一起。

广域网WAN:将远隔千里的计算机都连在一起。

        每一个协作群体都有一个局域网,但是有时候需要协作群体之间进行协作,于是有了广域网WAN,将远隔千里的计算机都连在一起。

        局域网与广域网,只是为了在学术上而区分出来的,但是从技术的角度。其二者只是一个相对的概念,无非就是主机数变的更多了,并没有明显的局域网和广域网的区别。但是由于不同场景下的描述问题,所以这个概念也是重要的。

        局域网与广域网:看网络规模

认识 "协议"

        "协议" 本质上就是一种约定。通过这种约定,来让我们在某些通信场景当中,达到更快速的进行通讯的目的。

#问:为什么需要协议这个东西?

        主要原因是因为,如果我们加了网络,两台主机的通讯的距离就变得非常得长了,主机A想向主机B发送数据。数据也是有类别的,如有一些数据就是单纯的数据:用户信息,有一些数据具有特殊的含义,比如说有一些数据是想让目标主机进行数据的删除、控制对方的主机等,所以说数据是具有类型的。

        就如同文件:文件 = 文件中数据和代码(内容) + 文件的属性信息,其本质上在计算机的体现是都是0、1。但是需要我们在认知的时候,我们需要知道数据是具有类别的,所以因为数据是具有不同类别的,所以对应不同类别的数据,需具有不同的处理方式。

        为了能够快速的让两个相隔千里之外的计算机,能够区分出数据是哪些类别,每一种特别类型种的某一些特别的数据的含义,所以就需要通过以提前约定好的方式来减少双方通讯成本的问题。 

        计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。

理解"协议"的一个小故事:

        假如一天用手机打电话变的很贵很贵,然后我们出门在外,需要向家里进行告知自己情况的时候。

我们与家里的父母规定:

  • 电话响一声:我们过的和好,不用担心,也就是报平安。
  • 电话响二声:我们的资金不够了,需要一些资金。
  • 电话响三声:我们有紧急事情,需要进行电话的沟通。

        我们通过在离家之前与家里人进行了约定之后,这种电话响几声的约定就是所谓的达成的"协议"。之所以立这么一个协议就是因为这样可以减少我们的成本(也就是此故事当中的电话费)。

        如果我们没有进行约定,那么如报平安就需要进行口头上的一大堆话,对于都是报平安行为,这就是浪费资源的、效率很低的。如果我们提前约定好,那么我们只需要发一个很简单的数据,对方就能立即的知道我们表达的是什么。(对方可以按照最短的预期做出行为 —— 通讯更高效

#问:是不是只需要通信的两台主机, 约定好协议就可以了?

        并不是这样的,就比如不同语言的人,约定后使用"1"来表示干什么事情,但是由于二者的语言不一样,所以就导致了,虽然传递的是同一个约定的"协议",但是对方却不能理解。

        如此,虽然本质上的"约定"是成立了,但是表达(发送)层面上根本无法识别对方的含义。

  • 计算机生产厂商有很多。
  • 计算机操作系统, 也有很多。
  • 计算机网络硬件设备, 还是有很多。

#问:如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?

        所以,约定了一个共同的标准,大家都来遵守,这就是网络协议(软件维护) —— 也就是行业标准。(硬件标准、软件协议二者缺一不可)

Note:

        只要网络存在,网络就是一个一定具有:硬件上有标准、软件上有协议的一个结合体,才能正常的进行,于是才能在全球将网络的范围扩大。

网络协议初识

协议是由软件来维护的约定:

        1、计算机内部是可以存在多种协议的,所以操作系统需要对多种协议进行管理 —— 先描述,再组织。所以,所有的协议(约定)在操作系统内核内核层面上,就是结构体对象

        2、协议的本质就是软件,软件是可以进行"分层"的。

软件分层:

        C++中,所写的各种类,所写好的类就可以在main函数中进行创建对象,然后使用类当中的方法,这就是一种软件分层。main函数里的创建对象就叫做使用对象,编写类的时候,类内部就叫做方法的具体实现,所以就相当于将方法的实现使用的这两层,就叫做软件层。

        Linux中的一切皆文件,Linux内核为了维护文件看待方式的通用性,所以将所有的文件都看作对应的struct_file对象,即使用内部包含的指针,来指向底层的不同的方法。这也叫做软件层。

        多态的继承关系,有基类、有派生类,每一层继承的体系就是可以理解为一个软件层


Note:
        软件是可以被分层的。

        3、所以软件在设计的时候,就是被层状的划分的!

协议分层

现实生活中的分层(打电话):

        在技术层面上:A与C并不是直接的在沟通交流,而是A通过将说话的声音交给了手机,然后A的手机再和C的手机进行通讯,然后C的手机通过将A手机发过来的信息进行解码,然后转换为语音,播放给C。

日常的打电话就是一种分层的概念:

  • 人的语言层:利用语言的沟通。
  • 底层:是两部手机通过它们的"语言"在互相通讯。

所以,可以说人打电话至少是两层协议(两层通讯的机制)

        而当有两个外国人使用手机打电话的时候,相当于将上层协议切了,切成由汉语体系变为英语体系。这个时候并不影响下层协议,于是双方依旧可以使用电话进行通讯

        然而,如果将底层的手机通讯变为了无线电通讯,或者,再如何的交换,都不会影响上层语言的沟通。

(从此我们可以理解一个问题)

#问:为什么要划分为层状结构?

  • 场景复杂

        比如说两个人很闲(咸鱼),就坐在一起,但是说话还需要人来传达(这是不合理的)。 比如说两个人很忙(老板),需要沟通一些事,以为太忙碌了,所以让助手进行信息的传达(这就是合理的)

  • 功能解耦 —— 每一层解决不同的问题,便于人们进行各种维护。

        人打电话,电话与人的关注不同,人想着传达什么信息,电话想着这么传递信息。这其中人和电话关注的点是不同的,但是必须是人和电话,共同来完成打电话这么一个行为 —— 所以软件分层的时候,就让同层对应的角色,关注于自己本层的功能。不同层的关注不同的,然后通过接口式的互相调用。

        便于维护:电话出问题就修电话,与上层无关。

由于层状结构的优点,所以网络协议也是层状的。

        通讯的复杂,本质上是和距离成正相关的!

#问:复杂体现在哪里?——  正是协议栈要解决的问题。

  • 通讯范畴:
  1. 丢包 —— 发出的数据对方没有收到。
  2. 定位问题 —— 如何找到对应的主机。
  3. 解决下一跳主机的问题 —— 主机信息传递中,所经路由器。

        所以,只要大方向上完成以上三个问题,最后数据才能够被对方接收到。于是对于这各种问题,在软件分层当中一一解决。但是还有一个问题,就是可以这些信息是干什么的?所以我们需要表明目的 —— 数据处理

  • 应用范畴:
  1. 如何处理数据 —— 将收到的信息做处理。

Note:

        所以单纯的将对应的数据,从A主机运送到B主机,我们需要以下的层数:

        这个对应的层数划分,就是对应的5层协议,分别叫做:应用层传输层网络层数据链路层物理层。将基于这样的分层的方式,在现在的应用层的场景当中一般叫做:基于TCP / IP协议定制好的层状协议。

        协议:既包含上层应用怎么写,又包括操作系统怎么做,这就叫做网络协议。

        所以,网络通讯时:实际上我们用的是传输层向上提供的系统调用,然后我们通过系统调用完成网络通讯。

融汇贯通的理解:

        所以网络编程,依旧是系统编程,因为我们用的依旧是操作系统。所以学习网络也就是学习操作系统。

        其中,以此五层的通讯方式称为TCP / IP协议。而传输层中最重要的协议就是TCP,网络层中最重要的协议就是IP,所以这种协议叫做TCP / IP。原因就在于这两种协议在操作系统中实现,是两个最重要的通讯范畴的核心协议,于是整个协议以TCP / IP来进行命名了。


        然而事实上,在当初的整个网络协议定制的标准化组织,在定义协议的时候并不是严格按照我们上面说所的方案来定的,其是按照自己的方案定出来的,我们称之为:OSI七层模型。

OSI七层模型

  • OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范。
  • 把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器,交换机。
  • OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输。
  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

        其中下四层和之间所说的TCP / IP协议完全一样,然而上面的三层被压缩成一层,叫做应用层。

融会贯通的理解:

        首先,是先有OSI的7层模型。后有,TCP / IP的5层模型。它们二者之间就和蓝图具体实现的关系一样。

        OSI(理想状态)定出来的7层模型标准(不一定就是定标准的人,来写代码实现标准),所以实现的时候,因为应用层比较复杂,没有办法在操作系统实现,采取了将上三层变为一层,交给用户自己来解决。

TCP/IP 五层(或四层)模型

        TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
        TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
  • 物理层:负责光 / 电信号的传递方式。比如:现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wififi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)、调制解调器(Modem)工作在物理层,第一个用于信号放大,第二个数字信号与模拟信号互相转化等。
  • 数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。数据链路层就是对应的局域网(局域网工作的位置)
  • 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)路由器(Router)工作在网路层。
  • 传输层:负责两台主机之间的数据传输。如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。可以说工作的是:发送数据的主机自己。
  • 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

        物理层属于硬件层,所以考虑知道的不用过多。因此很多时候也可以称为 TCP/IP四层模型。

一般而言:
(以下不是全面的,是最基本的)
  • 对于一台主机,从操作系统内核实现了从传输层到网络层的功能,然后再到数据链路层实现(驱动层)
  • 对于一台路由器,它实现了从网络层到物理层。
  • 对于一台交换机,它实现了从数据链路层到物理层。
  • 对于集线器,它只实现了物理层。

补充:

        但是并不绝对。很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容(比如:端口转发)。

        同一个网段内的两台主机进行文件传输,每一个网络分层,也就是软件分成都有其的功能。 每一层都有其代表性的协议:

        为了将上述图讲清,而需要引入的概念。

#问:如果两台主机在同一个局域网之下,那这两个主机能不能直接通讯?

        能够通讯,并且还会通讯的很顺畅。数据在局域网当中通讯时,我们的数据是可以直接在局域网当中,两台主机是可以直接通讯的。就如同玩游戏时联机的局域网。

我们的数据,并不能凭空的从对应的应用层到对方的应用层:

  • 从逻辑上讲:我们认为应用层和对方的应用层在直接通信。
  • 从物理上讲:对应的应用层是无法将其的数据,发送到对方的应用层。

所以,学习网络要站在物理结构上。

 每层都要有自己的协议定制方案,每层协议都要有自己的协议报头:

  • 从上到下交付数据的时候,要添加报头。
  • 从下到上递交数据的时候,要去掉报头。

报头

#问:什么是协议报头?

         一个故事帮助理解:就如同我们在网购之后,商家将货物的寄出,不可能将我们所购买的商品放在盒子里,就直接给顺丰,而是需要填对应的快递发货单

        然后将快递发货单贴到对应的包裹上,我们在拿到包裹也就可以确认信息,然后信息就没有用了,直接扔掉。

快递发货单是给顺丰,我们完全可以不看。于是可以将这个行为,想象成两层的模型:

  • 卖家
  • 买家

        最关心的是:我要买,你要卖。但是对应的卖家要将商品给我们,需要将商品向下交付的时候,就要让顺丰结合卖家将单子填好,填好的单子,既不给卖家看,也不给买家看,是给顺丰看的。这样顺丰才知道,是谁发,是谁收。于是买家收货的时候收到单子 = 收到报文。这个时候我们所收到的东西多了一个"报文",不是关心的,多出来的单子 = 报头

        协议报头:当上层把数据交给下层时,下层也是有自己的协议的,那么下层需要做的就是将上层给予的数据,结合它那一层所对应的报头,给其多添加一部分的报头的数据。以供对方的同层协议未来的解报头,来对数据进行读取 —— 直说:同层当中收到一个数据之后,在数据之外多出来的部分 = 报头。

        报头的意义:发送方和接受方互相传递属性字段的非常重要的概念。

        对应的层,就可以通过对应的该层的报头知晓有效载荷对应哪一层,并将有效载荷交给上层。同样的每一层依次的识别对应的报头,然后依次的传递有效载荷,依次的交付。以此,自底向上的好处就是,对方发送"你好",接收方收到"你好"。

总结:

  • 封装的本质:添加报头
  • 解报的本质:去掉报头 && 展开分析

可以将封装的时候理解为压栈,解报的时候理解为出栈。

融汇贯通的理解:

        之所以其能够完美的执行,是因为:对应的协议层只能够协议通行。所以在每一层之下,每一层都认为自己在与对方进行逻辑上的沟通。

以太网

#:两台主机如何在局域网下通讯。 

        我们用以太网链接的这两个对应的主机,对应的就叫做的局域网,我们可以将这个以太网的横线,想象成网线,以太网是局域网的一种,它的通讯的原理可以简易的想象成:

        就如同一个班级在进行点名,老师A进行一一的点名,当点同学F的时候,老师A点名的这个行为,学生B、C、D、E是都听到了的(在坐的所有人都是听到的),但是只有学生F答了一声到。而学生F向老师A说的时候,同样的学生B、C、D、E也是都听到了的(在坐的所有人都是听到的)。所以,可以说A和B是在进行众目睽睽之下进行定向的通讯

        而之所以学生B、C、D、E,并未做出反应,是因为老师A并未喊道他们,而他们之所以能知道喊的不是他们就是因为他们也听到了的(接收到了的)

局域网通讯实际上:

        发出数据的主机在全部局域网中,进行"大声"("开麦")。与同学一样,每一台主机都是具有自己的"名字"的。也就是说,其实每一台主机都是接收到信息的,但是它会将主机名进行对比,发现叫的不是自身,于是就会将报头对应的数据直接进行抛弃,所以只会有对应的主机拿到对应的数据,进而进行向上交付,从而拿到地址。

碰撞

        如果有一天:B、D进行正常的交流,A一看不开兴的,居然不带他,于是他开始捣乱,我们知道网线的传输其实就是物理的光电信号,于是会不会导致A发出的信号将B发出的信号出现杂糅?于是信息就出现无法识别,这就叫做 —— 局域网内数据通讯时,发生了碰撞问题。(就如同课上有人聊天,导致无法听清老师讲课)。

碰撞问题的处理:
       局域网里的主机是可能进行对应的,叫做碰撞避免,说白了就是出现碰撞就等一等
,然后等一段时间后再进行从发(课上需要聊天的同学等到下课聊)

融汇贯通的理解:

        所以,有趣上可以说:我们如果想黑掉一个局域网,去对应的局域网里乱说话就可以了,发一堆垃圾数据,来影响大家无法正常通讯(就是攻击)

对于发一堆垃圾数据,我们是需要通过一定的方式绕过以太网驱动程序 —— 不要乱搞!!要就玩自己的局域网

局域网中表示主机的唯一性:MAC地址 —— 每台主机对应的名字,是由48位的二进制数构成的,查看的时候一般是以十六进制进行显示。MAC地址是一个写入到网卡的地址,在我们的笔记本出厂的时候网卡的MAC地址就确定了(全球唯一)(并不排除有一些虚拟策略能够帮我们虚拟化出很多的网卡、MAC地址)

        我们可以使用对应的ifconfig命令,查看Linux下的网络设备设置。

总结:

  1. 主机发送数据:向下封装。
  2. 主机交互数据:自底向上进行交付。
  3. 主机网络中通信:采用局域网通讯原理。

#问:不在同一个局域网之下的主机,是如何进行通讯的?

        这个时候我们就需要一个关键的点:路由器。 

路由器

  • 三个设备:主机、路由器、主机。
  • 两个局域网:使用局域网进行连接。

        左侧主机,想将数据交给右侧主机的时候,需要进行封装,然后并不能将数据直接通过网络交给右侧主机(一个使用以太网,一个使用令牌环网)。

        左侧主机左侧主机发送信息,必须经过设备路由器,因为两个主机不在同一个局域网,所以没法直接通讯,左侧主机因为和路由器同局域网,所以只能交给路由器。同样的路由器也是一个主机,所以其能够将数据发送,交给与其处于同一个局域网的右侧主机

        路由器:通过路由器的间接的方式,实现不同局域网的主机之间的通讯。

        在如上面的,不同局域网下的主机进行通讯的问题。A主机向让B主机接收到他所发的信息,拿到B主机的MAC地址是没有任何用处的,因为无法直接向B主机通讯(不在同一个网)。这个时候A主机只能够使用B主机的IP地址

#问:A主机是怎么拿到的B主机的IP地址?

        这个IP地址是有"人"给A主机的。如:访问网页的地址,就是通过分析它而得到的对应的IP地址。

IP地址和MAC地址

就如同我们唐僧的取经路:

  • 唐僧的出发地到目的地:东土大唐 -> 西天。
  • 唐僧的长途跋涉途中:东土大唐 -> …… -> 车迟国 -> 黑风岭 -> …… ->西天。

  • 源IP -> 目的IP:是永远都不会改变的。
  • 源MAC -> 目的MAC:会根据当前所处的位置,不断的进行变化。

目的MAC是受目的IP的影响的,以此到达目地的IP。

(下面的MAC是不同的)

Note:

        在IP层及其往上层的协议看来,数据都是一样的,差异化主要体现在IP层以下的最底层。在使用TCP / IP协议的网络中,IP及其向上的协议,看到的报文都是一样的。

        于是,通过IP协议的存在,向中间的路由器向上交付的时候"托一层", 路由器向下交付的时候"穿一层",使得在不同子网中有着适配的功能。底层网络的差异化,通过IP协议的存在而产生了对应的虚拟化策略,以此让上层看到的同层数据都是一样的,利用MAC地址的差别实现恒定不变的IP地址实现

用于理解的草图:

  • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)
  • 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理。

        下图为数据分用的过程。

        接收方,接收到了底层的对应的数据帧,以太网驱动程序要在对应的数据帧中,根据相关以太网首部,能够解析出其对应的有效载荷,应该交给上层的哪一个协议。

IP地址与MAC地址总结

IP地址

IP协议有两个版本,IPv4和IPv6。
  • IP地址是在IP协议中,用来标识网络中不同主机的地址。
  • 对于IPv4来说,IP地址是一个4字节,32位的整数。
  • 我们通常也使用 "点分十进制" 的字符串表示IP地址,例如 192.168.0.1。用点分割的每一个数字表示一个字节,范围是 0 - 255。

MAC地址

  • MAC地址用来识别数据链路层中相连的节点。
  • 长度为48位, 及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)

相关文章:

【网络】-- 网络基础

(本文是网络的宏观的概念铺垫) 目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP 五层(或四层)模型 报头 以太网 碰撞 路由器 IP地址和MAC地址 IP地址与MAC地址总结 IP地址 MAC地址 计算机…...

二、Redis安装配置(云服务器、vmware本地虚拟机)

一、自己购买服务器 自己购买阿里云、青牛云、腾讯云或华为云服务器, 自带CentoOS或者Ubuntu环境,直接开干 二、Vmware本地虚拟机安装 1、VMWare虚拟机的安装,不讲解,默认懂 2、如何查看自己的linux是32位还是64位 getconf L…...

【学习Docker(七)】详细讲解Jenkins部署SpringCloud微服务项目,Docker-compose启动

Jenkins部署SpringCloud微服务项目,Docker-compose启动 座右铭:《坚持有效输出,创造价值无限》 本文介绍使用Jenkins部署SpringCloud微服务项目,Docker-compose启动。 之前写过安装Jenkins的过程,这里就不写安装细节了…...

时机将至,名创优品或将再掀起一波消费热浪

北京时间2月28日,名创优品发布2023财年中报,财报显示,2023财年第二季度营收规模有所收窄,但净利润、毛利率、门店数量均实现了不错的增长,总体表现可圈可点。 (资料来源:富途牛牛) …...

深圳大学计软《面向对象的程序设计》实验8 静态与友元

A. 旅馆旅客管理(静态成员) 题目描述 编写程序,实现某旅馆的客人住宿记录功能。 定义一个Customer类,要求输入客人的姓名,创建一个Customer对象。类声明如下: 调用类的Display函数输出客人ID&#xff…...

【基础算法】单链表的OJ练习(2) # 链表的中间结点 # 链表中倒数第k个结点 #

文章目录前言链表的中间结点链表中倒数第k个结点写在最后前言 对于单链表的OJ练习&#xff0c;需要深刻理解做题的思路&#xff0c;这样我们才能够在任何场景都能够熟练的解答有关链表的问题。 关于OJ练习&#xff08;1&#xff09;&#xff1a;-> 传送门 <-&#xff0c…...

vue路由文件拆分管理

随着项目的原来越大&#xff0c;路由越来越多&#xff0c;我们的路由也会越来越多&#xff0c;如果都集中在一个文件中&#xff0c;会很冗杂文件很长。这时候我们可以将路由文件拆分&#xff0c;可读、方便管理。多人合作添加路由也能更多的避免代码冲突 代码拆分目录如图&…...

实例解析Java反射

反射是大多数语言里都必不不可少的组成部分&#xff0c;对象可以通过反射获取他的类&#xff0c;类可以通过反射拿到所有方法&#xff08;包括私有&#xff09;&#xff0c;拿到的方法可以调用&#xff0c;总之通过“反射”&#xff0c;我们可以将Java这种静态语言附加上动态特…...

Android 9适配经验总结

目录四大组件适配Activity启动方式适配Service启动方式适配前台服务需要添加权限限制静态广播的接收限制ContentResolver数据更新操作权限与安全相关主要适配点运行时动态权限申请默认不支持 http 请求SharedPreferences 适配四大组件适配 Android 应用的开发离不开 Android 四…...

定时任务调度方案——Xxl-Job

定时任务调度方案 随着系统规模的发展&#xff0c;项目的组织结构以及架构越来越复杂&#xff0c;业务覆盖的范围越来越广&#xff0c;定时任务数量日益增多&#xff0c;任务也变得越来越复杂&#xff0c;尤其是为了满足在用户体量日历增大时&#xff0c;系统能够稳定运行&…...

操作系统引导

操作系统是一种程序&#xff0c;程序以数据的形式存放在硬盘中&#xff0c;而硬盘通常分为多个区&#xff0c;一个计算机中又有多个或多种外部设备。 操作系统引导指的是计算机利用CPU运行特定程序&#xff0c;通过程序识别硬盘&#xff0c;识别硬盘分区&#xff0c;识别硬盘分…...

[C#] 多线程单例子,分为阻塞型和分阻塞型, 在unity里的应用

在单例中使用多线程时&#xff0c;需要注意以下几点&#xff1a; 线程安全&#xff1a;在多线程环境下&#xff0c;单例对象可能被多个线程同时访问&#xff0c;因此需要确保单例的线程安全&#xff0c;避免出现数据竞争等问题。 对象创建&#xff1a;如果在单例对象的构造函数…...

使用MAT进行内存分析,并找到OOM问题

前言 在处理一次现场问题时&#xff0c;发现服务还在运行&#xff0c;但是出现假死情况&#xff0c;后通过分析GC日志以及使用MAT分析确定问题是内存溢出OutOfMemery(OOM)&#xff1b;这里只记录MAT分析学习过程,最近工作忙&#xff0c;补记录。 GC日志分析 首先&#xff0c;如…...

初识Python

目录初识Python1.Python简介Python的优缺点Python的应用领域2.安装Python解释器Windows环境Linux环境macOS环境3.运行Python程序确认Python的版本编写Python源代码运行程序代码中的注释4.Python开发工具IDLE - 自带的集成开发工具IPython - 更好的交互式编程工具Sublime Text -…...

tmux终端复用软件

一、安装[rootpool-100-1-1-159 test]# yum install tmux [rootpool-100-1-1-159 test]# yum search tmux Repository extras is listed more than once in the configuration Last metadata expiration check: 0:33:52 ago on Fri 03 Mar 2023 09:10:34 AM CST.Name Exactly M…...

IO详解(文件,流对象,一些练习)

目录 文件 文件概念 文件的路径 路径有俩种表示风格 文件类型 如何区分文本文件还是二进制文件? java对文件的操作 File类中的一些方法 流对象 流对象的简单概念 java标准库的流对象 1.字节流,(操作二进制数据的) 2.字符流 (操作文本数据的) 流对象最核心的四个…...

SpringCloud全家桶— — 【1】eureka、ribbon、nacos、feign、gateway

SpringCloud全家桶— — 组件搭建 1 Eureka 1.1 Eureka-server 创建eureka-server的SpringBoot项目 ①导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId…...

【线程安全篇】

线程安全之原子性问题 x &#xff0c;在字节码文件中对应多个指令&#xff0c;多个线程在运行多个指令时&#xff0c;就存在原子性、可见性问题 赋值 多线程场景下&#xff0c;一个指令如果包含多个字节码指令&#xff0c;那么就不再是原子操作。因为赋值的同时&#xff0c…...

错误:EfficientDet网络出现“No boxes to NMS“并且mAP:0.0的解决方案

近日&#xff0c;在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候&#xff0c;出现了如下错误&#xff1a; 其中项目开源地址是&#xff1a;https://github.com/toandaominh1997/EfficientDet.Pytorch 上面截图中的1和2代表我的类别名称。读者可…...

python的opencv操作记录13——区域生长及分水岭算法

文章目录图像区域基本算法——形态学运算腐蚀与膨胀开运算与闭运算opencv中的形态学运算距离计算——distanceTransform函数连通域连通的定义计算连通域——connectedComponents连通域实验基于区域的分割区域生长算法自定义一个最简单区域生长算法实现区域分割一般区域分割open…...

一文看懂网上下单的手机流量卡为什么归属都是随机的!

最近很多网上下单的小伙伴们心中似乎都有一个疑问。那就是网上很多手机卡、流量卡都不能自选号码和归属地&#xff0c;就算能自选号码&#xff0c;归属地也是随机的而且很多都不会跟你说具体的城市&#xff0c;这是为什么呢&#xff1f;莫非其中有什么不可告人的秘密吗?小伙伴…...

python Pytest生成alluer测试报告的完整教程

1.下载allure包到本地&#xff0c;解压 网上很多资料&#xff0c;这边不提供了 2.配置环境变量 将上面解压后bin文件的路径复制&#xff0c;添加到环境变量Path下 3.验证环境变量配置是否功 在cmd中输入allure&#xff0c;回车 。查看allure是否成功&#xff1a; 4.pyc…...

4-spring篇

ApplicationContext refresh的流程 12个步骤 prepareRefresh 这一步创建和准备了Environment对象&#xff0c;并赋值给了ApplicationContext的成员变量 要理解Environment对象的作用 obtainFreshBeanFactory ApplicationContext 里面有一个成员变量&#xff0c;Beanfactory b…...

提升 Web 应用程序的性能:如何使用 JavaScript 编写缓存服务

缓存是一种重要的优化技术&#xff0c;用于加速数据访问和降低服务器负载。缓存存储经常访问的数据&#xff0c;以便在需要时可以快速检索。在本文中&#xff0c;我们将探索如何使用简单的数据结构在 JavaScript 中编写缓存服务。 编码缓存服务的第一步是定义将用于访问缓存的…...

供应商绩效管理指南:挑战、考核指标与管理工具

管理和优化供应商绩效既关键又具有挑战性。要知道价格并不是一切&#xff0c;如果你的供应商在商定的价格范围内向你开具发票&#xff0c;但服务达不到标准或货物不合格&#xff0c;你也无法达到节约成本的目标。 供应商绩效管理可以深入了解供应商可能带来的风险&#xff0c…...

干货文稿|详解深度半监督学习

分享嘉宾 | 范越文稿整理 | William嘉宾介绍Introduction to Semi-Supervised Learning传统机器学习中的主流学习方法分为监督学习&#xff0c;无监督学习和半监督学习。这里存在一个是问题是为什么需要做半监督学习&#xff1f;首先是希望减少标注成本&#xff0c;因为目前可以…...

信箱|邮箱系统

技术&#xff1a;Java、JSP等摘要&#xff1a;在经济全球化和信息技术飞速发展的今天&#xff0c;通过邮件收发进行信息传递已经成为主流。目前&#xff0c;基于B/S&#xff08;Browser/Server&#xff09;模式的MIS&#xff08;Management information system&#xff09;日益…...

JS数组拓展

1、Array.from Array.from 方法用于将两类对象转为真正的数组&#xff1a; 类似数组的对象,所谓类似数组的对象&#xff0c;本质特征只有一点&#xff0c;即必须有length属性。 因此&#xff0c;任何有length属性的对象&#xff0c;都可以通过Array.from方法转为数组 和 可遍历…...

一道很考验数据结构与算法的功底的笔试题:用JAVA设计一个缓存结构

我在上周的笔试中遇到了这样一道题目&#xff0c;觉得有难度而且很考验数据结构与算法的功底&#xff0c;因此Mark一下。 需求说明 设计并实现一个缓存数据结构: 该数据结构具有以下功能&#xff1a; get(key) 如果指定的key存在于缓存中&#xff0c;则返回与该键关联的值&am…...

(10)C#传智:命名空间、String/StringBuilder、指针、继承New(第10天)

内容开始多了&#xff0c;慢品慢尝才有滋味。 一、命名空间namespace 用于解决类重名问题&#xff0c;可以看作类的文件夹. 若代码与被使用的类&#xff0c;与当前的namespace相同&#xff0c;则不需要using. 若namespace不同时&#xff0c;调用的方法&#xff1a…...

宣威网站建设公司/怎么做一个自己的网站

刘爱贵的个人主页 ----人是要有点理想的 [我的空间] -- 算法收藏 | 我的软件 | 程序人生 | 无题 | 相册 | 留言薄 | SOHU Blog | 关于我 [GNU/LINUX] -- GNU/LINUX | UNIX编程艺术 | UNIX/LINUX哲学思想 | 用GNU/LINUX工作[其他东东] -- 管理十大经典理论 | 羽球飘飘 | 人生哲理…...

做智慧教室的网站/竞价托管

使用Guice&#xff0c;需要添加第三方的包&#xff08;guice-3.0.jar和javax.inject.jar&#xff09; 链接&#xff1a;http://pan.baidu.com/s/1nuMjYOT 密码&#xff1a;1soo 将包导入MyEclipse或eclipse的方法&#xff1a;http://jingyan.baidu.com/article/6079ad0e7e4de12…...

微网站制作需要多少钱/软文广告

问题描述看完电影后&#xff0c;乐乐回家玩起了积木。 他已经搭好了n堆积木&#xff0c;他想通过调整积木&#xff0c;使得其中有连续W堆积木具有相同的高度&#xff0c;同时他希望高度恰好为H。 乐乐的积木都这了&#xff0c;也就是说不能添加新的积木&#xff0c;只能移动现有…...

网站设计合同范本/2023年九月份新闻

报名号姓名生源省市专业191033522000094蔡礼阳广东省综合评价-(101)电子与计算机工程(中外合作办学)191033522000480曹淞广东省综合评价-(101)电子与计算机工程(中外合作办学)191033522000684曾成广东省综合评价-(101)电子与计算机工程(中外合作办学)191033522000350曾维翰广东…...

马鞍山网站建设设计/东莞seoseo关键词排名优化

一般情况下&#xff0c;我们使用的是nvidia -smi 来监控&#xff0c;但不美观且信息冗余&#xff0c;此处使用gpustat来监控&#xff0c;可直接安装&#xff1a;pip install gpustat 然后我们输入gpustat即可得到&#xff1a; 但此时无法实时获取&#xff0c;使用以下命令即可…...

网站做中英版/怎么做电商

2019独角兽企业重金招聘Python工程师标准>>> 参考了很多资料&#xff0c;说说自己对viewport的理解 viewport分visual viewport和layout viewport&#xff0c;visual viewport可以理解为移动设备屏幕的可视区域&#xff0c;visual viewport的大小可以理解为就是品目…...