本文首发于 vivo互联网技术 微信公众号
链接:https://mp.weixin.qq.com/s/AkbAN4UZLDf841g1ZLFPBQ
作者:Wu Yue

本文系统性的讲述了 DNS 协议与 WebSocket 协议的重要细节。

一、DNS 

1、Linux dig命令

我们首先通过 Linux 下的dig命令来了解一下 DNS 是怎么做域名解析的。我们首先输入命令:

dig www.baidu.com

d80095078dfedd5885662ba1b03fc5e0.png

看下标注的红框,从左到右依次代表:

  • 域名的名称 也就是服务器名称
  • 网络类型,DNS 协议在设计的时候考虑到了其他网络类型,但是目前位置这个值还是写死的IN 你就理解成是互联网就可以了。这个值一般不变
  • 标识域名对应何种类型的地址,A 就代表ip的地址。

这里可能有人会问了,这个域名的后面为啥还有个“.”?我们输入的明明是 www.baidu.com 不是 www.baidu.com. 啊 。 

这里要提一下:

末尾的代表的就是根域名,每个域名都有根域名,所以通常我们会省略它

根域名的下一级叫顶级域名,比如我们熟知的.com与.net。

再下一级就是次级域名了,比如例子中的.baidu。这个次级域名只要你有钱是可以随便注册的。

最后这个www,这个代表三级域名。一般是用户在自己的域里面为服务器分配的名称。用户可以随便分他。 

所以可以看出来这里的域名是分级别的。能弄明白这点就能搞清楚为什么DNS的查询过程是分级查询了。

我们可以利用dig+trace命令来完整的还原一次分级查询的过程:

1b306857755fa6dfd037b1cd1d126592.png

你看通过命令的方式就能一目了然的理解DNS查询的过程了。这远比你在网上搜一些什么DNS是递归查询啊之类的要来的直观。这里有眼尖的小伙伴可能会问,这个CNAME是用来干嘛的?大家只要理解CNAME主要用来做CDN加速的即可。详细的可以去维基百科查询,那里说的很清楚,本文受限于篇幅就不在这个知识点上展开了。

2、WireShark学习理解DNS报文

这里注意因为 Wireshark的捕获过滤器无法设置DNS协议,又因为DNS是基于 UDP协议的,所以这里捕获过滤器我们就设置为 UDP就好。

6a1fa319c839480c28cf0c09ea0bbceb.png

然后就可以在一堆 UDP报文中找到我们想看的DNS报文了,我们在浏览器中输入www.airbnb.com:

108bed1423159462ac17998d8333c1e9.png

这里要注意左边有两个箭头,向右的箭头代表“请求”,向左的箭头就代表该“请求”的回复了。

6314ce75ca64261ab9b112db8a52aaae.png

81e3868177661d506d811b8fbc7cdf10.png

这些DNS报文经过 Wireshark的解析以后,格式已经帮我们分析好了,所以看起来很清晰。也很简单。这里我们不再详细分析DNS的二进制报文格式,有兴趣的可以自行查找相关资料。在我们上述展示的DNS报文抓包截图的时候,细心的同学已经发现了,我们DNS报文的查询地址是172.22.3.102。一般而言,大部分公司内部网络都会提供一个统一的DNS服务器,这个地址就是内部的DNS服务器地址了,有图为证:

3fe0eabeb748d184bf62e369ccaa5380.png

我们当然也可以使用其他DNS查询,比如使用著名的谷歌DNS

c5f66bb4af1034f09ff0648b2e198c3f.png

 

3、传统DNS服务查询的缺点

经过上述的分析看起来DNS的查询过程好像比较简单,但实际上DNS带来的性能或者安全问题很多很多。我们首先来还原一下完整的DNS查询过程(假设我们想访问csdn的网站):

  1. 浏览器输入一个域名地址,如果操作系统的DNS缓存中有这个域名的Ip地址 那么直接返回,没有的话 就去第二步。
  2. 操作系统会向 本系统设置的tcp/ip 参数中的DNS服务器地址 发出DNS查询报文。注意这个服务器我们通常叫他 本地DNS服务器。也就是上述我们截图中的172.22.3.102
  3. 如果本地DNS服务器的缓存中有这个域名对应的ip地址,那就直接返回,如果没有,继续下一步。
  4. 首先看DNS服务器的架构图: 4b9ff04cac05ea817c5e2f50dc32b949.png
  5. 也就是说当我们的本地DNS服务器缓存中没有该域名的ip地址的时候,本地DNS服务器就会直接向 根DNS(全世界只有13台)服务器去查询,然后根DNS服务器就会分析这个域名,告诉我们的本地DNS服务器 你应该去.net 这个DNS服务器去查询。然后.net这个DNS服务器又告诉本地DNS服务器 你应该去csdn.net 这个DNS服务器 去查询DNS地址。然后最终csdn的 DNS服务器就将正确的ip地址返回给我们的本地DNS,本地DNS再将这个值返回给我们的浏览器(这个过程其实你用前面的dig+trace命令可以更直观的体会到)。

通过上述的一次完整的DNS交互过程,我们可以至少得出三个结论:

  1. DNS服务器是可以做负载均衡的。当然前提条件是你这个域名得自己建一个DNS服务器。一般大厂都会自建。
  2. DNS的查询是一个递归的过程,弱网的情况,这个时间会变的很漫长。且DNS使用的是 UDP传输协议,弱网有直接查询失败的可能
  3. DNS的查询过程不可控,比如说本地DNS服务器完全可以返回一个错误的ip地址。比如你访问了一个京东的链接,然后返回给你的ip地址是拼多多的。

这还只是表面上看出来的传统DNS查询的缺点,实际上现在我们每天大部分的流量都来自于移动网络。移动网络中,传统DNS服务暴露出来的问题更多:

  1. 前文我们说过本地DNS服务器会缓存域名的ip,但这个缓存时效我们控制不了,全靠运营商的操守。有可能发生我们ip地址已经变化,但是本地DNS服务器返回的还是老ip的情况。
  2. 有些运营商为了节省运营商和运营商之间的流量计算成本,会偷偷的将一些静态页面缓存。当用户访问这些页面的时候 往往访问的是这些静态页面的缓存服务器的地址。此时不管我们的页面更新了多少内容,对于用户来说都是老的页面。
  3. 运营商在某些场景,例如人口集中的地铁站,演唱会,足球场附近等等,一旦发现自己的用户太多,本地DNS服务器压力巨大的时候,就会手动设置将本地DNS服务器向根域名服务器
  4. 查询 然后递归查询 DNS的过程 修改成:直接向另外一个运营商(假设这个运营商名字为B)的DNS服务器地址进行查询,B的DNS服务器就会返回一个B的地址,此时运营商A的用户访问的ip地址就是运营商B的ip了,这种跨运营商访问的场景速度会非常慢。
  5. 某些宽带提供方的NAT服务非常不稳定,大家都知道我们在家上网的时候 本机地址其实就是一个内网地址,我们之所以能访问外部的网络是因为这些宽带提供方提供了一层网关来负责NAT,这个NAT会将我们的内网地址转换成一个外网的地址,NAT之后的ip,某些权威DNS服务器就无法判断这个ip到底属于哪个运营商。也会带来跨运营商访问的问题。
  6. 除了自己的DNS服务器,其他公共DNS服务器的缓存时效都不可控,这对双机房部署,异地多活,多域名等策略都会有影响。
  7. 弱网环境下,因为DNS使用的传输协议是不可靠的 UDP,又因为DNS查询的过程是一个递归的过程,所以DNS查询在弱网环境下是有概率失败的

4、HTTPDNS

基于上述缺点,越来越多的大厂使用了HTTPDNS的这种技术(据腾讯的公开资料显示,15年腾讯每天的localDNS失败次数就达到了80w次,接入HTTPDNS以后,用户平均访问延迟下降超过10%,访问失败率下降了超过五分之一,用户访问体验的效果提升非常显著):

3169ad3bb25d1f3ce7869f3e5319909b.webp

这种技术的原理其实挺简单的,无非就是让我们的手机App 发起一个HTTP请求(这个请求地址多数使用ip直连,如果使用域名那么依然针对此请求依然有传统DNS的问题),这个请求可以携带用户所在的运营商,地理位置,精确到省市,然后服务器根据这些信息 返回一个最佳的ip地址给App,然后App将这个域名-ip的映射关系设置到我们的okhttp中。这样手机中的大部分请求就会直接使用我们HTTP服务器返回的ip地址而不是运营商的地址了。

注意这里我说的是大部分请求而不是全部请求的原因是,对于Android系统来说,webview的DNS查询过程代码全部在c层,且版本和版本之间有一定差异,这部分的hook过程极为艰难,截止到这篇文章编写的时候,笔者依旧没有查询到公开的能够hook webview DNS的源码,而iOS这点做的显然就比Android好一些,对于iOS来说webview的HTTP就是一个正常的HTTP request 与原生的代码并没有任何区别。对于Android客户端来说,接入HTTPDNS也不是一件特别容易的事。即使现在拥有了okhttp。

方案一:

通过okhttp的拦截器,在发出请求之前将我们的url中的域名直接替换成ip,再手动往header中添加host头部信息。缺点:如果url是https的,ip直连会出现证书校验的问题。另外因为请求的时候 我们直接用的ip 但是 服务端返回的set cookie头部信息却带上的域名,这里也要额外处理。优点:因为是拦截器的实现机制,所以很容易做开关进行降级处理。

方案二:

通过okhttp的DNS直接接管。

public class HttpDNS implements DNS {private static final DNS SYSTEM = DNS.SYSTEM;@Overridepublic List<InetAddress> lookup(String hostname) throws UnknownHostException {//假设这个DNShelper可以返回我们httpDNS查询的结果String ip = DNSHelper.getIpByHost(hostname);if (ip != null && !ip.equals("")) {List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));return inetAddresses;}return SYSTEM.lookup(hostname);}
}//然后让okhttp使用我们的DNS实现就好OkHttpClient client = new OkHttpClient.Builder().DNS(new HttpDNS()).build();

这种方案就不存在拦截器哪种缺点,因为本质上这种方案和系统的DNS查询方案并无二致,无非系统的是 UDP去localDNS找,我们的是用HTTP去 HTTP服务器上找。这种方案可以解决方案一的所有缺点,但是有一个问题就是一旦这个HTTPDNS返回的结果有问题,那么很难降级。且okhttp的DNS查询也是有一层缓存的,一旦我们的HTTP DNS服务器返回的地址有误,那么在一定时间范围内后续针对这个域名的访问都会有问题。

前面我们说过Android自身webview的机制导致HTTPDNS很难在webview中起到作用,但是仍旧有一些方法可以尽量规避掉webview中loacalDNS速度慢的缺点。例如我们可以在html中设置预加载静态资源的DNS请求,而不用等到真正请求这些资源的时候才会查找DNS。

<!--域名预解析-->
<meta http-equiv="x-DNS-prefetch-control" content="on" >
<link rel="DNS-prefetch" href="//vivo.com.cn" >

考虑到实际上webview和App自身代码使用的DNS缓存都是操作系统中的同一块存储区域,我们也可以统计出我们常用web页面中频繁请求的url的域名,在App一启动的时机,就提前访问这些域名,这样等到热点web页面在加载的时候,如果操作系统DNS缓存已经有了对应的ip,则可以省略一次DNS的查询。

5、DNS真的是基于UDP协议的吗?

其实DNS协议真的不是完全基于UDP协议的,DNS的协议里面其实有主DNS服务器和辅DNS服务器的概念,辅DNS服务器在启动的时候会主动去主DNS服务器上拉取最新的该区域DNS信息。这个拉取的过程采用的就是TCP协议,而不是UDP协议。也就是协议文档中说的zone transfer。

这里有人可能会想到,为什么不用UDP协议来完成这个过程,因为UDP协议最大只能传送512个byte的数据,而辅DNS要拉取该区域的DNS信息很容易就超过这个最大报文数量的限制,所以这里采用的就是TCP协议来完成拉取数据的操作。

二、WebSocket

1、有 HTTP 轮询为什么还需要 WebSocket 技术?

很多人不明白为什么一定要用 WebSocket,明明我轮询HTTP请求一样可以完成需求。这句话本身并不错,可以用 WebSocket 的地方确实全部都可以用轮询HTTP请求来替代。但是其背后的效率却天差地别。

我们可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。在以前 HTTP 协议中所谓的 keep-alive 长连接是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的轮询是指从客户端不断主动的向服务器发 HTTP 请求查询是否有新数据。这种模式有三个缺点:

  • 除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。
  • 因为HTTP是无状态的,每次请求服务端都要通过客户端传递来的参数来查询这个请求到底是谁的,例如每次都要查询一下这个userId下面有多少存款,买过几部手机等等,对服务器的宝贵的计算资源是一种浪费。
  • 轮询的时间间隔不好设置,设置高了,用户的界面响应不及时,设置的太低,又怕流量消耗大,服务器扛不住。

当然轮询也有优点就是实现成本极低,几乎不需要客户端和服务端有额外的开发成本。WebSocket在首次使用的时候还是需要做一些基础设施改造的(例如nginx相应的配置)。WebSocket的实现成本:虽然说现代服务器编程中默认都提供了WebSocket的实现,但是我们知道考虑到扩展性等因素,我们通常都不会直接和源服务器打交道,而是和代理服务器打交道。对WebSocket来说同样如此,所以这里对于首次实现WebSocket的团队是有一定技术成本。

上图是一个简单的服务器架构图,客户端发出去的请求经过一台专门做负载均衡的代理服务器以后将这些请求逐一转发到对应的源服务器上。而对于WebSocket来说 情况则变的稍微有点复杂:

相比纯 HTTP 来说,WebSocket通常会增加一层专门的消息分发系统提高消息的处理效率。通常是Kafka或者是RabbitMQ。

2、Wireshark解析WebSocket报文

首先 来看一下WebSocket的帧格式。我们首先设置一下 Wireshark的捕获器:

设置一下我们想要捕获的域名和端口号。注意WebSocket是可以复用HTTP端口号的。http://demos.kaazing.com 这个网址是一个专门用来体验WebSocket技术的网址。我们以这网站为例。

可以看出来这里我们操作步骤一共是 connect,然后发消息,服务器返回我们发送的消息,最后我们主动断开连接。

WebSocket是一个基于帧的协议,所以这里我们着重分析一下WebSocket的帧格式,每个帧头部的 第4-第7个 bit位,这4个bit 代表的就是Opcode,比较重要的就是几个值:

  • 2:代表这是二进制帧,
  • 1:代表这是一个文本帧,
  • 8:代表关闭帧。

 

 

3、WebSocket连接的建立过程

这里有人就要问了,既然WebSocket是能保证长连接(tcp)的,那么这条长连接是由谁发起的?看下图:

这个抓包结果显示的说明了WebSocket下面使用的tcp连接是交给HTTP1.1来发起的。来详细看一下,这里我用箭头标注的都是必须要设置的HTTP头部信息,否则是无法完成WebSocket连接的建立的。

此外我们还需要注意Sec-WebSocket-Accept,和Sec-WebSocket-Key 这2个头部信息。

客户端生成一个随机数以后用base64加密以后放到Sec-WebSocket-Key头部信息中,然后服务器接受到这个信息,用这个值与rfc中规定的一个魔法字符串:“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”拼起来,然后再使用sha-1加密 再经过base64 以后计算出来的值 放到Sec-WebSocket-Accept头部中返回给客户端。

这么做的原因是带来一些基础的保障,前面我们说过WebSocket连接的建立是依托HTTP消息的,为了防止这个WebSocket连接的建立是调用者无心误触发或者其他异常情况,所以这里有一次额外的数据校验的过程。

4、WebSocket连接的断开过程

看完连接,我们再看一下断开连接,与WebSocket的连接不同,WebSocket的断开连接是有明确步骤的,需要先断开WebSocket的连接,然后才是tcp的断开连接。

可以看出来,断开连接的步骤是客户端先发了一个断开连接的帧,然后服务端再给客户端发一个确认断开WebSocket连接的帧。最后就是tcp的四次挥手了,保证了tcp连接的彻底断开。

另外HTTP 1.1中保持长连接的方法其实就是一个定时器,定时器大概时间为60s,如果60s都没有HTTP消息,那么这个tcp连接就断掉了。WebSocket虽然也是利用了HTTP 1.1的消息来保证tcp的连接,但是保证这条tcp连接不被断开的方法却又不是定时器了,与mqtt xmpp等协议类似,WebSocket保持长连接的方法也是利用了心跳包。

在RFC协议中,规定了opcode 为0x9 0xA的帧为心跳帧,但是往往 这个关于心跳包的协议却很少有人遵守,很多时候人们选择间隔一段时间发送一个任意帧(当然这个任意帧的内容需要客户端和服务端提前约定好)来保证心跳包的建立。比如前文中我们拿来做例子的 http://demos.kaazing.com 网站,他的心跳包就没有遵守协议 而是:

图中可以看出来这个心跳包大概是30s发送一次,而且并没有使用rfc中约定好的0x9或者0xA的所谓ping pong的心跳帧,而是就用了最简单的文本帧来表示。

 

上图所示,左边的就是WebSocket 服务端发起的心跳包,opcode的值还是text文本帧的意思,只不过文本的内容很特殊。右边就是WebSocket客户端回复的心跳包。

5、WebSocket的代理缓存污染

这里要注意的是 Wireshark抓包的时候,最右边有一个masked的标识,这通常代表这一个WebSocket的帧是由客户端发送给服务端的,这是一个掩码的标识。在WebSocket协议中只要是客户端发起的消息,都必须经过这个随机的masking-key的掩码计算之后才能传输。这是为了解决代理缓存污染的问题。

注意这里问题的核心是实现不当的代理服务器,所谓实现不当的代理服务器就是指没有完整实现好WebSocket协议的代理服务器。而不是真正意义上恶意的代理服务器,恶意的代理服务器,用mask帧的技术是无法避免的。

所谓mask掩码技术就是指浏览器在发送WebSocket帧的时候必须生成一个随机的mask-key,在帧的二进制中将传输的内容与这个mask-key做异或操作。得出来的值才可以在网络中传输。

当我们的服务器接收到这个WebSocket帧以后就可以用这个mask-key来反异或,从而就可以得出真正的内容了,这是最低成本实现检测WebSocket帧是否遭到篡改的方案。例如:我们用WebSocket 传输一个 文本帧,内容为字符串vivo,vivo的ascii码的16进制为:76 69 76 6f。而这个消息,这次浏览器生成的mask-key 为 23 68 c0 a3。

我们将这2个值进行异或操作:

可以得到值为55 01 b6 cc。然后看一下抓包的帧内容里面是不是这个值:

 

深入理解 web 协议(一)- http 包体传输

更多内容敬请关注vivo 互联网技术微信公众号

注:转载文章请先与微信号:Labs2020联系

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

相关文章

  1. 震惊,某男子在吹空调之后竟然出现了这样的状态

    人生短短急个球&#xff0c;不死不罢休…… 恭喜各位大佬&#xff0c;进入了9月金秋&#xff0c;相信很多人都会有各种并发症出现了&#xff0c;其中&#xff0c;最多的是因为空调引起的各种感冒 在2020年9月12日&#xff0c;我由于要更改一个系统BUG&#xff0c;晚上开着空调改…...

    2024/5/3 14:35:15
  2. html网页渲染过程

    整个渲染的过程其实就是将URL对应的各种资源&#xff0c;通过浏览器渲染引擎的解析&#xff0c;输出可视化的图像。 渲染模块&#xff1a; 从图中可以看出&#xff0c;一个渲染引擎大致包括HTML解释器、CSS解释器、布局和JavaScript引擎。 HTML解释器&#xff1a;解释HTML语言…...

    2024/4/21 17:14:23
  3. 大数据ftp软件,2步完成大数据ftp软件的连接与命令操作

    ftp软件是什么软件&#xff0c;可能有人会回答说不知道&#xff0c;因为一般只有从事网站管理的工作者会使用的多一点。但不是每个人生来就会的&#xff0c;所以刚开始肯定都会学习怎么使用ftp软件。这篇文章就来告诉大家大数据ftp软件大数据ftp软件该如何进行连接&#xff0c;…...

    2024/4/21 4:17:19
  4. 解压文件win10自动删除

    解压文件&#xff0c;包含一个破解软件&#xff0c;被win10自动删除&#xff0c;复制也会提示“无法完成操作&#xff0c;因为文件包含病毒或潜在的垃圾软件” 解决办法&#xff1a;找到病毒和威胁防护&#xff0c;找到被隔离的威胁&#xff0c;操作允许在设备上即可。...

    2024/5/3 14:29:25
  5. Arduino2560 代码程序控制100kw激光的设计和实现

    记得有篇报道中&#xff0c;有个记者说到大功率激光要从传统光学来&#xff0c;初步想法有了&#xff0c;等元器件回来&#xff0c;立即安装调试&#xff0c;资金不够了&#xff0c;先合成10个10w的激光源100w&#xff0c;实验如能成功&#xff0c;后期筹集资金合成500-1000个,…...

    2024/4/23 19:45:25
  6. SEC专员:SEC对Unikrn ICO的执法行动或扼杀创新

    美国证券交易委员会&#xff08;SEC&#xff09;专员Hester Peirce周二表示&#xff0c;她不同意SEC此前宣布的与Unikrn就其ICO达成的和解协议。Peirce在异议声明中指出&#xff0c;Unikrn未被指控有任何欺诈行为&#xff0c;而且诉讼本身仅针对违反注册的行为。Peirce称&#…...

    2024/4/23 9:59:18
  7. linux虚拟机FTP服务器原理+配置+与win主机互相传输文件

    1.1 FTP服务器的工作原理 FTP&#xff08;File Transfer Protocol&#xff09;文件传输协议&#xff0c;用于网络上的控制文件的双向传输。用户可以向FTP服务器上传或从FTP服务器下载文件&#xff0c;用户端和服务器的操作系统不受限制。 RFC 959中对FTP模型及工作模式做了以下…...

    2024/4/23 12:23:01
  8. 南京软博会圆满落幕!都市圈带你一起重温精彩瞬间

    中国(南京)国际软件产品和信息服务交易博览会(简称“南京软博会”)由江苏省人民政府主办、南京市人民政府和江苏省工业和信息厅共同承办&#xff0c;目前已举办了十五届&#xff0c;是中国规模最大、国际化程度最高、最具影响力的国际ICT展会之ー&#xff0c;多次被评为“中国十…...

    2024/4/23 8:56:38
  9. 学Python就能做好数据分析?万能语言背后是一片韭菜地

    “会python的大学生&#xff0c;找工作有多赚&#xff1f;“ “python到底是什么鬼&#xff0c;学姐靠他拿了5个offer" “数据分析还在用Excel&#xff1f;学会python效率高10倍&#xff01;“ ...... 这样的标题你一定见过&#xff0c;“python数据分析“的公众号或者…...

    2024/4/23 18:39:25
  10. 2020-9-15 吴恩达-结构化ML项目-w1 机器学习策略(1)(课后作业)

    原文如下 Peacetopia城中的鸟类研究–案例学习 1.问题描述 本案例来自真实的产品应用。为了保密&#xff0c;所以细节上做了一些修改。 你是Peacetopia城中的一名著名的研究员。Peacetopia人有一个共同特征&#xff1a;他们害怕鸟类。为了保护他们&#xff0c;你必须构建…...

    2024/4/23 14:03:00
  11. abbex 区块链学院如何交易之 第四章 规则二:正确加码才能获利

    第四章 规则二&#xff1a;正确加码才能获利 Abbex 7 个月前 更新于 学会加码&#xff01;获暴利的捷径只此一途。你必须按照规则二操作&#xff1a;毫无例外并且正确地对你的盈利仓位加码。 阿瑟&#xff1a;幽灵&#xff0c;你是想继续讲解规则一&#xff0c;还是开始谈论…...

    2024/4/26 4:41:49
  12. Vue常见的性能优化

    Vue常见的性能优化1、路由懒加载2、keep-alive缓存页面3、使用 v-show 复用 DOM4、v-for 遍历避免同时使用 v-if5、长列表性能优化5.1、去响应化5.2、去响应化6、事件销毁7、图片懒加载8、第三方插件按需引入9、无状态的组件标记为函数式组件10、子组件分割11、变量本地化12、S…...

    2024/5/2 7:59:04
  13. Hyperledger Fabric 获取提案hash(proposal_hash)的方法

    应某甲方要求&#xff0c;需要在给他们开发的Hyperledger Fabric联盟链应用中&#xff0c;在查看链上数据的某个小需求里面&#xff0c;需要参照fabric区块链浏览器的方式给他们提供交易hash和proposal提案hash。其中交易hash在智能合约链码中可通过账本API的GetTxId()方法获取…...

    2024/4/23 17:02:56
  14. IDEA Unable to import maven project: See logs for details (maven的坑)

    系统重装之后&#xff0c;Idea的配置是之前就认为没什么问题&#xff0c;就没去过多注意&#xff0c;但是后来发现建SpringBoot项目默认的版本太高&#xff0c;pom.xml每次都会报错&#xff0c;因为是maven本地库没有相应的包&#xff0c;我就手动设置一下版本&#xff0c;混过…...

    2024/4/23 15:17:19
  15. 五、LinkedList、LinkedHashMap、LRU

    1.LinkedList 本质&#xff1a;双向链表。效率&#xff1a;与ArrayList相比&#xff0c;插入和删除速度快&#xff0c;随机访问速度慢。 继承和实现&#xff1a;继承AbstractList抽象类&#xff0c;实现Deque接口(有队列和栈) 成员变量&#xff1a;size、first、last 2.Lin…...

    2024/4/23 8:46:22
  16. 蚁剑的安装

    蚁剑的安装...

    2024/4/22 23:52:51
  17. JMeter性能测试,入门篇

    1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇&…...

    2024/4/23 12:02:23
  18. Scapy的基础学习和使用

    scapy基本使用 参考 什么是scapy Scapy是一个强大的&#xff0c;用Python编写的交互式数据包处理程序&#xff0c;它能让用户发送、嗅探、解析&#xff0c;以及伪造网络报文&#xff0c;从而用来侦测、扫描和向网络发动攻击。Scapy可以轻松地处理扫描(scanning)、路由跟踪(t…...

    2024/5/3 10:53:52
  19. 使用海康工业相机的心路历程(一)

    加入新公司做项目。之前做的项目里面用到的视觉产品还都是国外的品牌&#xff0c;比如basler。不得不说国外的视觉产品的稳定性和易用性真的好。第一次接触到国内的工业相机&#xff0c;公司选择了海康威视这个品牌。在做第一次测试时&#xff0c;对国产工业相机&#xff0c;会…...

    2024/4/23 7:51:44
  20. arthas分析接口耗时

    1 登陆服务器&#xff0c;安装arthas wget https://alibaba.github.io/arthas/arthas-boot.jar 2 启动arthas java -jar arthas-boot.jar 3 选择检测线程&#xff0c;回车 4 监听具体方法 trace <类的包全名> <检测方法>example: trace com.xueqiu.service.xqtong.…...

    2024/4/23 14:49:00

最新文章

  1. FP16、BF16、INT8、INT4精度模型加载所需显存以及硬件适配的分析

    大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

    2024/5/3 21:32:37
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 自我介绍的HTML 页面(入门)

    一.前情提要 1.主要是代码示例&#xff0c;具体内容需自己填充 2.代码后是详解 二.代码实例和解析 代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>自我介绍页面</title>…...

    2024/5/1 8:14:09
  4. __dirname 在ES模块中的使用

    前言 ECMAScript模块是 JavaScript 的新标准格式。在Node.js中越来越多的库逐渐从从CommonJS转移到ES模块 注&#xff1a;这里是指“真”ES 模块并不是指代码中 Node.js 中使用 import 写法但是实际被 tsc 转成 commonJS 的形式 但是Node.js ES 开发中此前有一个棘手的问题是获…...

    2024/5/3 10:58:45
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/3 11:50:27
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/3 16:00:51
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/3 11:10:49
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/3 21:22:01
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/3 13:26:06
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/3 16:23:03
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/3 1:55:09
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/3 14:57:24
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/2 23:47:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/2 18:46:52
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/3 7:43:42
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57