计算机网络(十) —— IP协议详解,理解运营商和全球网络
目录
一,关于IP
1.1 什么是IP协议
1.2 前置认识
二,IP报头字段详解
三,网段划分
3.1 IP地址的构成
3.2 网段划分
3.3 子网划分
3.4 IP地址不足问题
四,公网IP和私有IP
五,理解运营商和全球网络
六,路由
七,IP报文的分片与组装
一,关于IP
1.1 什么是IP协议
场景:我数学成绩很好,10次考试6次满分,然后大家都在传,说我有“数学考满分的能力”,那么我一定能做到吗? --> 不一定,只是有很大的概率考满分
问题:如何保证我每次都考满分?
解答:
- 我有很大的概率考满分,如果没考满分,就重新考;
- 这样就能保证每次都考满分。老师是给我安排考试的人(提供策略),我是真正“执行考试”的人,没考到满分就重新考,这相当于超时重传
- 然后老师提供策略,就相当于Tcp,所以Tcp在网络中更多的是:“提供可靠性策略”,真正去考试的是“我”,我就是 --> IP协议。
IP协议的本质工作:提供一种能力,将数据从A主机跨网络送到B主机。
用户需要的是:提供一种能力,将数据“可靠地”将数据从A主机跨网络送到B主机;按照现在的网络,将数据成功送过去的概率很高,但不是100%,所以传输层提供策略,下层提供能力,两者结合就能保证“我”每次都能考满分。
1.2 前置认识
数据发送的过程中会经过很多路由器,就好比我们网络基础1的旅游的例子
- 要对所有的主机进行标识,用源ip和目的ip来标识源主机和目的主机;IP分为私有IP和共有IP
- 旅游的例子,我们要先去故宫,得先去北京:“去目标城市,去目标地点”;唐僧要去西天的大雷音寺,拜见佛祖求取真经:“西天就是目标城市,大雷音寺就是目标地点,但是到了目标地点还不够,还得通过端口找到佛祖这个进程,然后交数据”
IP地址 = 目标网络 + 目标主机
任何一个主机都是在某个子网上的,由这个子网的路由器连接,发送数据后要先到达主机B所在的的子网网络(先到达目标网络),然后想办法将报文交给主机B(交给目标主机) --> 依据:路由器的转发机制。(会跨越很多子网)
我们处在一个精心设计的世界中,你有身份证号,上学时有学号,上班时有工号,但是我们学号不是单纯的数据,是有格式的:学号 = 年纪编号 + 学院编号 + 专业编号 + 班级编号 + 学号03
场景:
- 我捡到一个校园卡,只有学号432008,大部分人不知道这个学号上对应的学院编号是多少,我只知道这是个学号,但这肯定是其它学院学生的,因为这个学号开头和我不一样!
- 然后我每个学院都去问一遍,这个归还校园卡的过程本质是“查找”,查找的本质就是“排除”,一个一个学院去问效率太低。
- 那么每个学院都有学生会主席,每个学生会主席都给自家学院建了一个群,然后每个主席又相互建了一个主席群,而且学生会主席肯定知道其它学院的编号,然后我艾特主席,把卡照片发给他,然后主席再把照片发主席群里去
- 然后主席艾特了以下电气学院的主席,然后电气主席说这是我们学院的学号,然后电气主席再把照片发到他的电气学院群里去艾特小美,然后交换联系方式,最后物归原主
上面一顿操作下来,让整个校园卡归还过程快速合理,一开始我说不是我学院的,排除了我这个学院的所有人,然后主席找到了电气主席本质是排除了其它学院,就加速了归还过程。
查找的本质是“排除”,所以建立群的方式,是提升了淘汰的效率,以前一次淘汰一个人,现在是淘汰一群人
我们把我自己的学院编号叫做源IP地址,把要归还的校园卡的学校叫做目的IP,我的群叫做局域网主机,把主席叫做局域网出口路由器,把主席群叫做公网,像这样一个一个群,就能提高效率,因为一次可以排除很多东西
IP协议意义:构建网络的时候,为我们将来定位一台主机,提供基础保证。
二,IP报头字段详解
两个老问题:
- 报头和有效载荷如何分离?
- 如何将有效载荷交付给上层?
①4位首部长度
- 真实报头长度 = 4位首部长度(假设是x) * 4,范围为[0000, 1111],换成十进制就是[0, 15]
- 标准报头长度为20字节,那么x就是5,首部长度就是[5, 15],就是[20, 60]字节之间,这和Tcp是一模一样的
②16位总长度
- 代表报文总长度,所以报文长度 = 固定长度报头 + 自描述字段,
- 有效载荷长度 = 总长度 - 固定长度报头,就能将有效载荷和报头分离
③4位版本
- 这个是固定死的,对于IPv4来说就是4
- 但是现在有个问题,ip地址是32位,也就是42亿个,现在入网设备太多了,面临着“IP地址不足”的问题
- 解决方法有很多,NAT,还有IPv6,其中IPv6相当于新的协议了,它用128位来标识,IPv6和IPv4不兼容,IPv6我国最强大,主要用在国内内网,IPv4主要用在公网,这个我们后面讲运营商在讲,现在默认认为是4
④8位服务类型
- 丢包问题是无法解决的,这4个选项是为了在进行数据包转发时,给路由器提供转发依据的,提高可靠性,了解一下即可
- 3位优先权字段(已经弃用),4位TOS字段, 和1位保留字段(必须置为0)。4位 TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于 ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要
⑤8位生存时间(TTL)
- 数据每经过一个路由器就是一次转发,但是网络太大了可能出bug,而且接收方可能会挂掉无法接收数据,那么IP报文会被无限转发,这种报文称为流离报文
- 所以我们给每个报文设置一个生存时间,表示该报文在转发的时候能经过的路由器的跳数,每经过一个路由器,生存时间就 -=1,如果为0时,路由器直接丢弃报文
⑥8位协议
- 指的就是我们要把IP的有效载荷交付给上层的哪一个协议
- 下层分离报头和有效载荷后,根据8位协议将有效载荷交付给上层的指定协议
⑦32位源IP和32位目的IP
- 我们以前在进行socket套接字编码的时候,要求填充 ip + port,现在可以认为:我们在应用层要把点分十进制的ip字符串转化成4字节的ip是为了填充报头的这两个内容的,而32位源IP和32位目的IP是提供给路由器让它进行路径选择的
- Tcp只存在操作系统上,在各路由器中是没有Tcp层的
- 只有通信双方主机具有Tcp层,因为所有路由器只工作在网络层。(路由器可能有Tcp,但是不用)
⑧16位标识,3位标志和13位片偏移后面讲
三,网段划分
3.1 IP地址的构成
IP地址分为两部分:网络号和主机号
- 网络号:保证相互连接的两个网段具有不同的标识
- 主机号:同一段网络内,主机之间具有相同的网络号,但是必须具有不同的主机号
这就好比我们学号的班级加个人编号一样,一个班级内的同学前面的数字是一样的,这叫做同一个网段,后面两个数字或者三个数字不一样,这就是主机号不能相同
- 路由器本质也是一个特定子网的主机,所以路由器它自己也要配置IP地址和主机号
- 路由器实现转发,那么路由器要连接至少两个局域网/子网,所以路由器也一定要配置多个IP地址和主机号 --> 原因:路由器有多张网卡
- 路由器一般是一个子网中的第一台设备,它的IP地址一般都是“网络号.1”
- 路由器的核心功能是IP报文的转发,但是路由器的功能不仅仅如此,比如构建局域网/子网,子网中的主机的IP就是路由器分配的,这个后面公网IP和私有IP再将讲
- 内网IP:如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复;并且路由器里面也有操作系统的,所以路由器会对子网IP做管理(DHCP协议)
DHCP协议:全称 Dynamic Host Configuration Protocol,动态主机配置协议
- DHCP通常用于大型网络环境中,主要工作就是集中地址管理,分配IP地址,使网络中的主机动态获得IP地址,Gateway地址,DNS服务器地址等信息,能够提升地址的使用效率
- DHCP是基于UDP的,一般的路由器都有DHCP,所以路由器也可以看作是DHCP服务器
- 我们连接校园网或者WiFi时,都会要求输入密码,这其实就是路由器在验证你的身份,验证通过后,路由器就会给你动态分配一个IP地址,然后我们就可以进行各种上网动作了
3.2 网段划分
故事:网络开始兴起的时候是32位的IP,可以标识2^32差不多42亿,用完就没了,所以我们可以认为IP地址是一种有限的资源,就意味着各个国家是要竞争IP的
IP分为网路地址和主机地址,曾经提出的划分这两个地址的方式,是把IP地址分为5类,称之为分类划分法:
各IP地址的取值范围如下:
- A类:0.0.0.0 到 127.255.255.255
- B类:128.0.0.0 到 191.255.255.255
- C类:192.0.0.0 到 223.255.255.255
- D类:224.0.0.0 到 239.255.255.255
- E类: 240.0.0.0 到 247.255.255.255
但是随着网络发展,这种划分方式问题很快出现:
- 大多数组织都申请的B类网络地址,导致B类网络地址很快就被分完了
- 所以A类浪费了大量的地址,而且每一个子网中的主机号也很难全部用完,例如,申请一个B类地址,理论上一个B类子网能构建6万5千多个主机IP,A类的更多,但是实际上一个子网不会有这么多主机,因此大量的IP被浪费掉了
- 所以网络的研究员针对性地提出了一种划分方案:CIDR
3.3 子网划分
注意:该方法是针对上面五种IP的类类型提出的,因为可以看到有些IP地主机号太多了,实际情况下不需要这么多主机,所以需要将主机号减少,减少IP的主机数,就能划分出更多子网,减少IP地址浪费
CIDR,全称Classless Interdomain Routing:
- 在分类划分法的基础之上,引入一个额外的子网掩码,来区分网络号和主机号,这个掩码也是一个32位正整数,用”0“和”1“表示,通常用一串”0“来结尾
- 将IP地址和当前网络地子网掩码进行”按位与“,得到的结果就是当前所在网络的网络号
有了CIDR之后,一个网络就被更细粒度地划分成了一个个更小地子网,这样IP地主机号就越来越小,就可以减少IP地址被大量浪费,下面是具体步骤:
- 比如在某个子网中,将IP地2前24位作为网络号,那么该网络地子网掩码地32个比特位中前24位就是1,后面8位就是0,每8位以点隔开,最后就是255.255.255.0
- 假设子网中有一台主机192.128.128.0,那么将这个IP与掩码进行“按位与(&)”计算后,就是192.168.128.0,就是这个子网对应地网络号
- 子网掩码,可以对32位IP进行任意划分,为了书写方便,我们一般把子网掩码这样表示:192.168.128.0 /24,“/24“ 表示整个IP地址当中前24个比特位位1,后面8个为0
特殊的IP地址:
有些IP具有特殊用途,不能作为主机地IP地址:
- IP地主机地址为0,就是网络号,代表这个局域网
- 将主机号设为1,就成为了“广播地址”,用于给一个链路中相互连接地所有主机发送数据包
- 127.*地IP地址通常用于本机环回测试,通常是127.0.0.1
3.4 IP地址不足问题
CIDR虽然一定程度上缓解了IP地址浪费的问题,但是没有增加IP地址的绝对上限,仍然不是很够用,所以有下面三种解决方法:
- 动态地址分配:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,简单来说就是路由器发放和回收IP,在校园网中,我们在宿舍,教室和图书馆接入的校园网,每次的IP都是不相同(共享IP,你要用就给你,不用或用完了还给我)
- NAT技术,后面介绍
- IPv6:不是IPv4的升级版,是真正变革性的技术,与IPv4毫不相干,是两种不同的协议,用128字节表示一个地址,但是IPv6还没有普及
四,公网IP和私有IP
如果一个组织内部组件局域网,在这个局域网内,IP地址只用于局域网内地通信,而不直接连接到公网上,理论上使用任何IP都可以,但是为了规范,RFC 1918 规定了用于组件局域网地私有IP地址:
- 10.* ,前8位是序列号,共16777216个地址
- 172.16.*到172.31.*,前12位是网络号,共1048576个地址
- 192.168.*,前16位是网络号,共65536个地址
包含在上面三个范围中地,都成为私有IP,其余地都是公网IP,我们连接云服务器时,连接的这个IP就是云服务器地公网IP:
同时,我们也可以通过ifconfig这个命令来查看我们这台机器私有IP:
在我们Windows的cmd控制台上输入ipconfig命令,也可以看到大量以192.168开头的私有IP:
在我们的使用生涯中,我们从一开始使用的IP其实都是私有IP,在云服务器中才接触到公网IP
问题:数据是如何发送到服务器的?
解答:路由器上有两种网络接口,分别是LAN口IP,WAN口IP:
- LAN口(Local Area Network):表示连接本地网络的端口,主要与局域网中的交换机,集线器或PC主机相连,LAN口IP也叫做子网IP
- WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网,WAN口IP也叫做外网IP
我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:
- 不同的路由器,子网IP其实是一样的(通常都是192.168.1.1),子网内主机IP不能重复,但是不同子网的IP地址可以重复
- 我们的家里的路由器连接的一定是运营商的IP,所以我们家里的路由器与运营商其实是构建成一个子网的,所以我们家里路由器的WAN口IP也是运营商路由器的内网IP
- 所以我们的报文出去的时候,它会做一种策略:会将源IP替换成每一个路由器的WAN口IP;所以上面我们的请求从家用路由器出去后,dst不变仍为122.77.241.3,WAN口IP会被替换成10.1.1.2也就是家用路由器的WAN口IP,然后交给运营商路由器
- 然后运营商路由器再次替换src为运营商路由器的WAN口IP,这样依次转发,最后到达对方主机时,dst不变,src就变成了对方路由器的WAN口IP --> 这种不断替换私有IP的过程我们叫做 —— NAT技术
- IP资源不够,所以用这种策略,用公网IP构建网络的话,IP资源是远远不够的,所以就介入到上面这种模式,可以极大减少主机数,私有IP全由路由器维护,所以互联网 = 私有IP + 共有IP,前者主要给底层路由器的主机用,后者主要给路由器用
问题:为什么私有IP不能出现在公网中?
解答:
- 不同局域网中主机的IP可能是相同的,所以私有IP不能标识唯一的一台主机,所以私有IP不能出现在公网中
- 而且也因为IP地址不足的问题,我们不能让主机直接使用公网IP,私有IP的重复也意味着我们可以在不同的局域网中使用相同的IP地址,环节二IP不足
五,理解运营商和全球网络
问题:我们是怎么上网的?
解答:
- 有运营商的工作人员拉网线,然后光纤入户。需要两个设备,一个是调制解调器(猫),路由器,一般是两个盒子。
- 光纤里面有很多玻璃丝,用来传输光信号或者高低电平,然后光纤插到解调器上,解调器的作用是模拟信号转数字,数字信号转模拟,计算机只认识01序列,所以解调器将模拟信号转化成数字信号后转给家用路由器
- 但是光拉网线不行,还得“交钱”,然后就会给你家路由器一个账号和密码之后,路由器才能上网。
- 同时,路由器还有一个功能就是构建局域网,然后我们的wifi就可以看到了路由器名字了,但是我怕别人来蹭网,于是在除了运营商的账号密码外,还有一个路由器账号和密码,所以路由器里面存在着两套账号密码
关于运营商:
- 在上网前有一个步骤非常重要:网络基础设施建设,基础设施建设好了,网民就多了,接着就会孵化出大大小小的互联网公司,然后提供更多工作岗位,推动经济发展
- 但是这个基础建设,是非常耗时耗力的,而且回报周期很长,所以一般的私人企业不愿意做这种活儿,所以咱们国内的那三个公司肯定也不愿意做,但是我们国家“要求”你这么做,同时国家也会大力扶持国企进行基础设施建设,“强迫”运营商去建设
- 在20年前,手机的流量费是非常贵的,下个图片可能5毛钱就没了,所以基础设施搞好,还要降流量费,这样才会有更多人进来
- 而且你不仅要城里的人能上网,还得要村里的人也能上网,所以需要很多基层的工作人员下基层安装维护设备,就是来你家里安装网线的人
- 如果运营商没钱了,国家就来给补给,所以有一个强大的国家,才会有我们国家如此丰富的网络基础设施,让人随时随地都可以上网
关于全球网络:
- IP地址是一份大的资源, 在分配的时候不是按国家大小来分配的,一般是按照国家组织地区人口综合评估来分发的IP个数的
- 各个国家是有自己的国际路由器的,这个路由器彼此都是连接的,就类似于我们前面的学生会主席,我们国家的子网掩码是0000 0010 0000 0000 0000 0000 0000 0000,也就是前8位0000 0010
- 前面8个比特位就不用了,然后每个省也有自己的省路由器,34个省,2^6,然后我们就可以拿着前面的6个比特位来进行编号,然后6+8=14,所以子网掩码就是14位,之后国际路由器也就可以和我们的国内路由器进行通信了
- 然后每个省有很多市,然后再次分配4个比特位进行编号,到了市路由器之后,子网就变成了14+4=18了。
- 然后这个地区的ip开头就都是同样的的,假设西安是0000 0010这是国际掩码,然后0000 10这是省路由器掩码,然后00 10这是市编码,后面就是主机号了
- 一共是0000 0010 0000 1000 1000 0000 0000 0000,换成点分十进制就是2.8.128.5
- 当一个外国人要想访问2.8.128.5时,先转化为0000 0010.0000 1000.1000 0000,最后一个就是5 --> 0000 0101 ,先发现不是他国内的IP,然后把请求交给美国国际路由器,然后扔到群里面,艾特中国路由器,然后中国路由器再把请求在国内的省路由器群里面艾特了西安,然后到了西安后,西安再问,最后找到2.6.126.5的主机,进行访问
- 而当请求到了我们国内路由器,之后的所有工作都是由运营商做的
六,路由
主机A要把数据发给主机B,是要先根据目标IP,经过路由完成转发,实际是一跳一跳转发的
我们可以查看当前主机的路由表:
IP数据包的传输过程中会遇到很多路由器,每当数据包到一个路由器后,路由器会查看该数据的目的IP地址,并告知数据下一跳该往哪跳
问题:查路由表是怎么查的呢?
解答:拿着目标主机的IP地址,按位与&上路由表中的子网掩码,然后和Destination做对比,如果比对不成功,如果不是就直接对比下一个掩码和Destination,如果对比成功,那么表示目标网络正确,就通过eth0把数据发送出去
我们查路由器表,会有下面四种结果:
- 路由器不知道下一跳要去哪(这种情况基本不会发生,如果发生就是该路由器没配置好,算法设计有问题。)
- 给你转到下一跳
- 路由器不清楚,但是会给我们转入默认路由
- 已经到达目标局域网的入口路由器
对于转入默认路由,一般是“同网段的另一台路由器”,但是一个子网一般只有一个路由器,所以我们连接的路由器一般都是子网IP对应的1号路由器,如果我判断一个报文的目的IP不是我这个子网的,所以直接交给下一跳
七,IP报文的分片与组装
实际上在一台主机上,报文并没有通过网络层直接发出去,而是继续交给了自己的下一层协议(数据链路层,属于网卡的驱动层,还有物理层),数据链路再去转发给路由器或者同一个网段的主机。
但是数据链路层,无法一次发送过大的报文,所以就要求上层不能给我交付过大的报文。
ifconfig命令可以查看当前协议栈的一些信息,其中上面红框框的 mtu 表示当前的数据链路层的MAC帧一次最多发送1500字节的数据,这个数据包括IP的报头和IP的有效载荷
但是,如果一个报文超过1500字节,但是又数据链路层又不得不发,这时候就会对报文进行分片, 而且既然有分片,那么必定有组装,所以就要求IP报头里包含分片组装的相关信息:
- 其中16位标识就是IP报文的编号,分片之后的IP报文编号是相同的
- 对于3位标志位字段,第二位为0,标识允许切片,第三位用来结束标记,表示当前是否是最后一个小片,是的话为0,不是为1
- 对于13位偏移,假设一个报文都分成了很多片,这个偏移量表示这个小片在原来的大报文里的偏移量,用于组装报文
- 对于分片后的每个IP报文,都会重新添加IP报头的
问题:如何组装的?
解答:
- 先确保将所有的分片全都聚在一起(相通的标识)
- 然后通过片偏移排序(完成组装),去掉报头然后拼接
问题:我如何知道一个IP报文是分片报文呢?
解答:
- 只要我收到了后面的切片部分,那么片偏移一定不为0,如果片偏移为0,我们还有个三位标识符的结束标识,简单来说,如果一个IP报文不是分片的,那么片偏移=0,更多分片=0,一个不为0那么就是分片的
- 总结:片偏移 != 0 || 更多分片 == 1,只要符合任意一个条件,就说明这个IP是被分片的
问题:如何知道切片报文是否丢失?
解答:丢失报文有丢失,那么一般是三种情况:1,丢第一个 2,丢中间的 3,丢最后一个
- 如果丢了第一个,如果根据片偏移排序时没有一个报文的片偏移是0的,就能甄别出来
- 如果丢最后一个,收到的报文没有任何一个更多分片结束标记为0,那么就认为丢最后一个
- 对于丢中间,在进行排序时,第一个报文长度就是下一个报文的片偏移,假设三个1500长度的报文,第一个片偏移是0,排完序后第二个直接就是3000了,但是我们两个报文片偏移加起来才1500,那么我可以认为第二个报文丢了,识别出丢中间
问题:建不建议分片呢?
解答:不建议。因为在IP当中,如果有任意一个分片丢失导致组装失败,那么在Tcp看来就相当于整个报文丢失了,会进行全部重发,所以分片可能会增加丢包概率,降低传输效率
相关文章:

计算机网络(十) —— IP协议详解,理解运营商和全球网络
目录 一,关于IP 1.1 什么是IP协议 1.2 前置认识 二,IP报头字段详解 三,网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四,公网IP和私有IP 五,理解运营商和全球网络 六ÿ…...

速速收藏!这些2024年上映的AI电影与短剧,申请加入你的国庆假期宅家计划!
2024年上映的AI电影 01 科幻惊悚电影《致命AI Afraid》 导演:克里斯韦兹上映日期:2024-08-30(美国)片长:84分钟剧情简介:Curtis一家被选中去测试一种革新性的居家设备:数字家庭助手AIA,包括各种感应设备和摄像头等,…...
23.2 prometheus为k8s做的4大适配工作
本节重点介绍 : k8s监控中的4大采集类型总结prometheus为k8s监控做的4大适配工作 k8s关注指标分析 在监控每个细分的领域时,我们都要先思考下到底需要关注哪些方面的指标。k8s中组件复杂,我们主要专注的无外乎四大块指标:容器基础资源指标…...

1、如何查看电脑已经连接上的wifi的密码?
在电脑桌面右下角的如下位置:双击打开查看当前连接上的wifi的名字:ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后,按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后,按一下回车&…...
循环链表和双向链表
一、 带尾指针的循环链表的合并 算法步骤: p存表头结点——pTa->next;Tb表头连接到Ta表尾——Ta->nextTb->next->next;释放Tb表头结点——delate Tb->next;修改指针——Tb->nextp; LinkList Connect(LinkList Ta,LinkList Tb){pTa->next; …...

【Linux庖丁解牛】—Linux基本指令(中)!
🌈个人主页:秋风起,再归来~🔥系列专栏: Linux庖丁解牛 🔖克心守己,律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…...

【电路笔记】-运算放大器微分器
运算放大器微分器 文章目录 运算放大器微分器1、概述2、运算放大器微分器的表示2.1 理想微分器2.2 输出公式2.3 交流分析3、实际微分器3.1 理想配置的局限性3.2 带串联电阻的伪微分器3.3 具有并联电容器的伪微分器4、总结1、概述 在我们之前关于积分器运算放大器的文章中,我们…...

【Unity踩坑】使用内购时获取Google Play license key
在Unity中使用了IAP(内购)后,需要设置Google Play license key。 这个key需要在Google Play Console中(https://play.google.com/console),找到相应的应用,在左侧“创收设置”里可以找到license…...
华为OD机试真题-数组拼接-2024年OD统一考试(E卷)
最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述 现在有多组整数数…...

【Android 14源码分析】Activity启动流程-2
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...

ubuntu 18.04 cuda 11.01 gpgpu-sim 裸机编译
1,环境 ubuntu 18.04 x86_64 cuda 11.01 gpgpu-sim master commit 90ec3399763d7c8512cfe7dc193473086c38ca38 2,预备环境 一个比较新的 ubuntu 18.04,为了迎合 cuda 11.01 的版本需求 安装如下软件: sudo apt-get instal…...

【Kubernetes】常见面试题汇总(五十二)
目录 116. K8S 集群服务暴露失败? 117.外网无法访问 K8S 集群提供的服务? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-…...

o1-preview 在 IMO 2024 第一题的实测表现
相关博客:Learning to Reason with LLMs 以及 Introducing OpenAI o1-preview 测试了 IMO 2024 的第一题,OpenAI-o1-preview 的解题过程包括两部分:思考和推理。 正确答案是全体偶数,o1-preview 的 **思考方向正确,推…...
iOS--RunLoop原理
前言 曾经在写项目的时候遇到过这么一个问题。: 项目中添加了一个tableview,然后还有一个计时器,当滑动tableview的时候会阻塞计时器,你得执行这么一段代码后,计时器才能正常运行。 RunLoop.current.add(timer, for…...

并查集——从LeetCode题海中总结常见套路
目录 并查集定义 LeetCode128.最长连续序列 先去重再sort: 改进去重的方法: 参考: 并查集定义 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查…...
深入理解作用域【JavaScript】
一、作用域的内部原理 JavaScript 的作用域机制是理解变量如何被访问和存储的重要概念。下面详细介绍作用域的内部原理,包括编译、执行、查询、嵌套和异常处理这五个步骤。 1. 编译 在 JavaScript 的执行过程中,首要的步骤是编译。尽管JavaScript是解…...
微信小程序实战教程:如何使用map组件实现地图功能
在微信小程序中,map组件是一个非常实用的功能,它可以帮助我们快速实现地图展示、定位、标注等操作。本文将详细介绍如何在微信小程序中使用map组件,带你轻松掌握地图开发技能。 一、map组件概述 map组件是微信小程序官方提供的一个地图组件…...

张雪峰谈人工智能技术应用专业的就业前景!
一、张雪峰谈人工智能技术应用专业 在教育咨询领域,张雪峰老师以其深入浅出的讲解和前瞻性的视角,为广大学子提供了宝贵的专业选择建议。对于人工智能技术应用专业,张雪峰老师通常给予高度评价,认为这是一个充满无限可能且就业前…...

机器学习课程学习周报十五
机器学习课程学习周报十五 文章目录 机器学习课程学习周报十五摘要Abstract一、机器学习部分1. 统计推断与贝叶斯推断2. GMM和EM算法补充3. 马尔可夫链蒙特卡罗法3.1 蒙特卡罗法3.2 马尔可夫链3.3 Diffusion模型中的马尔可夫链 总结 摘要 本周的学习涵盖了统计推断和贝叶斯推断…...
rabbitMq------客户端模块
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消费者模块信道管理模块管理的字段提供的接口 信道内存管理连接管理类 前言 在RabbitMQ中,提供服务的是信道,因此在客⼾端的实现中&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...