HTTP1.x/HTTP2.0/HTTP3.0演化

HTTP/1.0的短连接导致了频繁的TCP建立与断开,而HTTP/1.1引入了长连接和管道技术,但仍然存在队头阻塞问题。HTTP/2通过头部压缩、二进制格式、数据流和多路复用进行了性能提升,但仍存在TCP层的队头阻塞。HTTP/3则通过采用QUIC协议,基于UDP实现无队头阻塞、更快的连接建立和连接迁移,解决了HTTP/2的队头阻塞问题,提升了网络效率。

HTTP1.0存在的问题

早期 HTTP/1.0 采用短连接,性能上有一个很大的问题,那就是每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无谓的 TCP 连接建立和断开,增加了通信开销。

HTTP/1.1 的性能如何?

HTTP 协议是基于 TCP/IP,并且使用了「请求 - 应答」的通信模式,所以性能的关键就在这两点里。

1.长连接
为了解决HTTP/1.0 的短连接问题,HTTP/1.1 提出了长连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

当然,如果某个 HTTP 长连接超过一定时间没有任何数据交互,服务端就会主动断开这个连接。
2. 管道网络传输

HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能。
即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

举例来说,客户端需要请求两个资源。以前的做法是,在同一个 TCP 连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求。那么,管道机制则是允许浏览器同时发出 A 请求和 B 请求,但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。

如果服务端在处理 A 请求时耗时比较长,那么后续的请求的处理都会被阻塞住,这称为「队头堵塞」。
所以,HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞。

3.队头阻塞

「请求 - 应答」的模式加剧了 HTTP 的性能问题。

因为当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也就是「队头阻塞」,好比上班的路上塞车。

此外,HTTP/1.1 还有以下性能瓶颈:

  • 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  • 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
  • 没有请求优先级控制;
  • 请求只能从客户端开始,服务器只能被动响应。

HTTP/2 做了什么优化?

HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
在这里插入图片描述
那 HTTP/2 相比 HTTP/1.1 性能上的改进:

  1. 头部压缩

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。

这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

  1. 二进制格式

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。
HTTP/1 与 HTTP/2
这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。

  1. 数据流

HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。

在 HTTP/2 中每个请求或相应的所有数据包,称为一个数据流(Stream)。每个数据流都标记着一个独一无二的编号(Stream ID),不同 Stream 的帧是可以乱序发送的(因此可以并发不同的 Stream ),因为每个帧的头部会携带 Stream ID 信息,所以接收端可以通过 Stream ID 有序组装成 HTTP 消息

客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。
在这里插入图片描述
客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。

  1. 多路复用

HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。

移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率。

举例来说,在一个 TCP 连接里,服务器收到了客户端 A 和 B 的两个请求,如果发现 A 处理过程非常耗时,于是就回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分。

  1. 服务器推送

HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息。

比如,客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返,如下图左边部分:
在这里插入图片描述
如上图右边部分,在 HTTP/2 中,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。

HTTP/2 有什么缺陷?

HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。

HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。

举个例子,如下图:
img
图中发送方发送了很多个 packet,每个 packet 都有自己的序号,你可以认为是 TCP 的序列号,其中 packet 3 在网络中丢失了,即使 packet 4-6 被接收方收到后,由于内核中的 TCP 数据不是连续的,于是接收方的应用层就无法从内核中读取到,只有等到 packet 3 重传后,接收方的应用层才可以从内核中读取到数据,这就是 HTTP/2 的队头阻塞问题,是在 TCP 层面发生的。

所以,一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。

HTTP/3 做了哪些优化?

前面我们知道了 HTTP/1.1 和 HTTP/2 都有队头阻塞的问题:

  • HTTP/1.1 中的管道(
    pipeline)虽然解决了请求的队头阻塞,但是没有解决响应的队头阻塞,因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等相应完这个请求后,
    才能处理下一个请求,这属于 HTTP 层队头阻塞。
  • HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP
    请求,这属于 TCP 层队头阻塞。

HTTP/2 队头阻塞的问题是因为 TCP,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!

HTTP/1 ~ HTTP/3
UDP 发生是不管顺序,也不管丢包的,所以不会出现像 HTTP/2 队头阻塞的问题

大家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。

QUIC 有以下 3 个特点。

1、无队头阻塞

QUIC 协议也有类似 HTTP/2 Stream 与多路复用的概念,也是可以在同一条连接上并发传输多个 Stream,Stream 可以认为就是一条 HTTP 请求。

QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。

所以,QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响。
在这里插入图片描述
2、更快的连接建立

对于 HTTP/1 和 HTTP/2 协议,TCP 和 TLS 是分层的,分别属于内核实现的传输层、openssl 库实现的表示层,因此它们难以合并在一起,需要分批次来握手,先 TCP 握手,再 TLS 握手。

HTTP/3 在传输数据前虽然需要 QUIC 协议握手,这个握手过程只需要 1 RTT,握手的目的是为确认双方的「连接 ID」,连接迁移就是基于连接 ID 实现的。

但是 HTTP/3 的 QUIC 协议并不是与 TLS 分层,而是QUIC 内部包含了 TLS,它在自己的帧会携带 TLS 里的“记录”,再加上 QUIC 使用的是 TLS/1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与密钥协商,如下图:

TCP HTTPS(TLS/1.3) 和 QUIC HTTPS

甚至,在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果。

3、连接迁移

基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接,那么当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接。而建立连接的过程包含 TCP 三次握手和 TLS 四次握手的时延,以及 TCP 慢启动的减速过程,给用户的感觉就是网络突然卡顿了一下,因此连接的迁移成本是很高的。

而 QUIC 协议没有用四元组的方式来“绑定”连接,而是通过连接 ID来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。

所以, QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议。

img

QUIC 是新协议,对于很多网络设备,根本不知道什么是 QUIC,只会当做 UDP,这样会出现新的问题,因为有的网络设备是会丢掉 UDP 包的,而 QUIC 是基于UDP 实现的,那么如果网络设备无法识别这个是 QUIC 包,那么就会当作 UDP包,然后被丢弃。

所以,HTTP/3 现在普及的进度非常的缓慢,不知道未来 UDP 是否能够逆袭 TCP。

参考链接:3.1 HTTP 常见面试题

# 基本参数 units real dimension 3 boundary p p f # Z方向固定边界 atom_style full # 全性能(适配EAM势) timestep 1.0 neighbor 3.0 bin neigh_modify delay 0 every 5 check yes # 先定义模拟盒区域(命名为box) region box block 0 60 0 60 0 150 units box # 建模(四种原子铜,铜离子,氧,氢,氯离子,一种键氧氢,一种角氢氧氢,相当于全局定义) create_box 6 box bond/types 2 angle/types 1 extra/bond/per/atom 2 extra/angle/per/atom 1 extra/special/per/atom 2 # 定义晶格 lattice fcc 3.615 orient x 1 -1 0 orient y 1 1 -2 orient z 1 1 1 # 定义原子质量(铜、铜离子、氧、氢) mass 1 63.55 # 铜原子(赝电子) mass 2 63.55 # 铜离子正电(类型2) mass 3 15.9994 # 氧原子(类型3,取自SPCE参数) mass 4 1.008 # 氢原子(类型4,取自SPCE参数) mass 5 35.453 # 氯离子 mass 6 1.0 # 赝电子 # 创建区域 # 孔区域 region kong1 cylinder z 15 15 10 0 40 units box region kong2 cylinder z 15 45 10 0 40 units box region kong3 cylinder z 45 15 10 0 40 units box region kong4 cylinder z 45 45 10 0 40 units box # 固定层 region guding-x block INF INF INF INF 0 5 units box region guding-s block INF INF INF INF 145 150 units box # 恒温层 region hengwen-x block INF INF INF INF 5 20 units box region hengwen-s block INF INF INF INF 135 145 units box # 牛顿层 region niudun-x block INF INF INF INF 20 40 units box region niudun-s block INF INF INF INF 120 135 units box # 沉积层(溶液层)边界条件一定要在盒子内,不然因为周期性会引起计数错误 region chenji block 3 57 3 57 50 110 units box # 铜离子、氯离子插入层 region tonglizi block 3 57 3 57 90 115 units box # 基板 region jiban-x block 0 60 0 60 0 40 units box region jiban-s block 0 60 0 60 120 150 units box # 加入铜原子与赝电子(先在完整区域创建,包含孔区域) create_atoms 1 region jiban-x create_atoms 6 region niudun-x create_atoms 1 region jiban-s create_atoms 6 region niudun-s # 删除孔区域内的原子 delete_atoms region kong1 delete_atoms region kong2 delete_atoms region kong3 delete_atoms region kong4 # 设置电荷 set type 1 charge +1.0 #铜负 set type 2 charge +2.0 #铜正 set type 3 charge -0.8476 #氧 set type 4 charge +0.4238 #氢 set type 5 charge -1.0 #氯 set type 6 charge -1.0 #赝电子 #定义组 group tongyuanzi type 1 group yandianzi type 6 # -------------------------- 非键势与长程静电(必须在create_bonds前定义!) -------------------------- # 非键势类型:LJ截断势+短程(赝键需要)Coulomb(Colombo 2018文献:PPPM方法) pair_style lj/cut/coul/cut 10.0 # LJ截断半径10.0 Å(Geada 2018推荐) # # 长程静电:PPPM高精度设置(1e-6,Geada 2018感应电荷计算要求) # kspace_style pppm 1e-6 slab # slab适配z固定边界 # kspace_modify slab 3.0 mesh 60 60 40 order 5 # 保留你的网格和阶数设置 # -------------------------- 非键参数(严格匹配Colombo 20211/Geada 2018) -------------------------- # 2. 可极化单元(Cu核心+赝电子,Geada 2018表1) pair_coeff 1 1 3.03 2.608 # Cu核心-Cu核心:ε=3.03,σ=2.608 Å pair_coeff 6 6 0.20 2.608 # 赝电子-赝电子:ε=0.20,σ=2.608 Å pair_coeff 1 6 0.78 2.608 # 混合规则:ε=√(3.03×0.20)≈0.78,σ=2.608 Å # 3. Cu²⁺相关参数(Colombo 20211) pair_coeff 2 2 0.0427 1.841 # Cu²⁺-Cu²⁺:ε=0.0427,σ=1.841 Å(文献原值) pair_coeff 1 2 0.36 2.225 # Cu核心-Cu²⁺:σ=(2.608+1.841)/22.225,ε=√(3.03×0.0427)≈0.36 # 4. SPC/E水模型(固定参数,不可修改) pair_coeff 3 3 0.1553 3.166 # 氧-氧:SPC/E标准 pair_coeff 3 4 0.0 0.0 # 氧-氢:排除非键(键作用已通过bond_style描述) pair_coeff 4 4 0.0 0.0 # 氢-氢:排除非键 pair_coeff * 4 0.0 0.0 # 所有原子与氢:排除非键(仅保留O-H键作用) # 5. Cu/赝电子与水的相互作用(混合规则) pair_coeff 1 3 0.68 2.887 # Cu核心-氧:ε=√(3.03×0.1553)≈0.68,σ=2.887 Å pair_coeff 6 3 0.18 2.887 # 赝电子-氧:ε=√(0.20×0.1553)≈0.18,σ=2.887 Å(修正原0.22) pair_coeff 2 3 0.08 2.504 # Cu²⁺-氧:σ=(1.841+3.166)/22.504,ε=√(0.0420.1553)≈0.08 # 6. Cl⁻相关参数(Colombo 20211) pair_coeff 5 5 0.150 4.045 # Cl⁻-Cl⁻:ε=0.150,σ=4.045 Å(文献原值) pair_coeff 1 5 0.67 3.327 # Cu核心-Cl⁻:σ=(2.608+4.045)/23.327,ε=√(3.03×0.150)≈0.67 pair_coeff 2 5 0.08 2.943 # Cu²⁺-Cl⁻:σ=(1.841+4.045)/22.943,ε=√(0.0420.150)≈0.08 pair_coeff 3 5 0.17 3.606 # 氧-Cl⁻:σ=(3.166+4.045)/23.606,ε=√(0.1553×0.150)≈0.17 # -------------------------- 水分子非键排除(SPC/E模型必需) -------------------------- special_bonds lj 0 0 1 # LJ作用:排除1-2(O-H)、1-3(H-O-H) special_bonds coul 0 0 1 # Coulomb作用:排除1-21-3(修正原全角标点问题) # 键设置 bond_style harmonic bond_coeff 1 450.0 0.96 # O-H键 (SPCE) bond_coeff 2 50.0 0.0 # 键设置(谐波键势) # 角设置(水分子) angle_style harmonic angle_coeff 1 55.0 109.47 # H-O-H角 (SPCE) #16成键核心步骤 create_bonds many tongyuanzi yandianzi 2 0 0.2 # 定义水分子,水分子数(此处有些原子过于接近) molecule water water.data #随机添加水分子 create_atoms 0 random 200 99 chenji mol water 100 units box overlap 5 maxtry 500 #随机添加铜离子 create_atoms 2 random 100 99 chenji units box overlap 5 maxtry 500 #随机添加氯离子 create_atoms 5 random 200 99 chenji units box overlap 5 maxtry 500 #保存初始模型文件 write_data moxingjianli.data # 设置电荷 set type 1 charge +1.0 #铜负 set type 2 charge +2.0 #铜正 set type 3 charge -0.8476 #氧 set type 4 charge +0.4238 #氢 set type 5 charge -1.0 #氯 set type 6 charge -1.0 #赝电子 # 从类型1中筛选出位于各区域的原子 group guding1 region guding-s #固定组 group guding2 region guding-x #固定组 group hengwen1 region hengwen-s #恒温组 group hengwen2 region hengwen-x #恒温组 group niudun1 region niudun-s #牛顿组 group niudun2 region niudun-x #牛顿组 #合并 group gudingall union guding1 guding2 group hengwenall union hengwen1 hengwen2 group niudunall union niudun1 niudun2 # 其他组定义 group metal union gudingall hengwenall niudunall #基底组 group water type 3 4 #水 group tong1 type 1 #铜原子 group tong2 type 2 #铜正组 group lv type 5 #氯离子组 group xunidianzi type 6 #赝电子组 group ions union tong2 lv #离子组 group yupinghen union niudunall hengwenall ions #预平衡组 group all_atoms union metal water ions #全原子组 group kongzhi union ions water hengwenall niudunall #非固定铜层 group rongye union water ions #溶液层 group tongcen union niudunall hengwenall # 添加动态墙 # 加反射墙阻止原子从z轴出界 fix 1 rongye wall/lj93 zlo 0.0 0.5 3.0 2.0 units box pbc no # zlo墙在固定层上方 fix 2 rongye wall/lj93 zhi 150.0 1.0 3.0 2.0 units box pbc no # zhi墙远离基板 # -------------------------- 非键势与长程静电(必须在create_bonds前定义!) -------------------------- # 非键势类型:LJ截断势+长程Coulomb(Colombo 2018文献:PPPM方法) pair_style lj/cut/coul/long 10.0 # LJ截断半径10.0 Å(Geada 2018推荐) # 长程静电:PPPM高精度设置(1e-6,Geada 2018感应电荷计算要求) kspace_style pppm 1e-6 slab # slab适配z固定边界 kspace_modify slab 3.0 mesh 60 60 40 order 5 # 保留你的网格和阶数设置 # -------------------------- 非键参数(严格匹配Colombo 20211/Geada 2018) -------------------------- # 2. 可极化单元(Cu核心+赝电子,Geada 2018表1) pair_coeff 1 1 3.03 2.608 # Cu核心-Cu核心:ε=3.03,σ=2.608 Å pair_coeff 6 6 0.20 2.608 # 赝电子-赝电子:ε=0.20,σ=2.608 Å pair_coeff 1 6 0.78 2.608 # 混合规则:ε=√(3.03×0.20)≈0.78,σ=2.608 Å # 3. Cu²⁺相关参数(Colombo 20211) pair_coeff 2 2 0.0427 1.841 # Cu²⁺-Cu²⁺:ε=0.0427,σ=1.841 Å(文献原值) pair_coeff 1 2 0.36 2.225 # Cu核心-Cu²⁺:σ=(2.608+1.841)/22.225,ε=√(3.03×0.0427)≈0.36 # 4. SPC/E水模型(固定参数,不可修改) pair_coeff 3 3 0.1553 3.166 # 氧-氧:SPC/E标准 pair_coeff 3 4 0.0 0.0 # 氧-氢:排除非键(键作用已通过bond_style描述) pair_coeff 4 4 0.0 0.0 # 氢-氢:排除非键 pair_coeff * 4 0.0 0.0 # 所有原子与氢:排除非键(仅保留O-H键作用) # 5. Cu/赝电子与水的相互作用(混合规则) pair_coeff 1 3 0.68 2.887 # Cu核心-氧:ε=√(3.03×0.1553)≈0.68,σ=2.887 Å pair_coeff 6 3 0.18 2.887 # 赝电子-氧:ε=√(0.20×0.1553)≈0.18,σ=2.887 Å(修正原0.22) pair_coeff 2 3 0.08 2.504 # Cu²⁺-氧:σ=(1.841+3.166)/22.504,ε=√(0.0420.1553)≈0.08 # 6. Cl⁻相关参数(Colombo 20211) pair_coeff 5 5 0.150 4.045 # Cl⁻-Cl⁻:ε=0.150,σ=4.045 Å(文献原值) pair_coeff 1 5 0.67 3.327 # Cu核心-Cl⁻:σ=(2.608+4.045)/23.327,ε=√(3.03×0.150)≈0.67 pair_coeff 2 5 0.08 2.943 # Cu²⁺-Cl⁻:σ=(1.841+4.045)/22.943,ε=√(0.0420.150)≈0.08 pair_coeff 3 5 0.17 3.606 # 氧-Cl⁻:σ=(3.166+4.045)/23.606,ε=√(0.1553×0.150)≈0.17 # -------------------------- 水分子非键排除(SPC/E模型必需) -------------------------- special_bonds lj 0 0 1 # LJ作用:排除1-2(O-H)、1-3(H-O-H) special_bonds coul 0 0 1 # Coulomb作用:排除1-21-3(修正原全角标点问题) #预先条件设置 # 固定层:固定位置 fix 3 gudingall setforce 0.0 0.0 0.0 # spce水的刚性约束,设置为刚体 fix 4 water rigid/nvt molecule temp 300.0 300.0 0.6 # 能量最小化 minimize 1e-3 1e-2 200000 400000 minimize 1e-5 1e-4 200000 400000 minimize 1e-8 1e-10 100000 200000 #restart文件保存,用于续算 write_restart after_minimize.equil Per MPI rank memory allocation (min/avg/max) = 106.3 | 106.3 | 106.3 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 nan 288.00353 nan nan ERROR on proc 0: Out of range atoms - cannot compute PPPM For more information see https://docs.lammps.org/err0004 (src/KSPACE/pppm.cpp:1833) job aborted: [ranks] message [0] application aborted aborting MPI_COMM_WORLD (comm=0x44000000), error 1, comm rank 0 PS F:\lammps\Cu_cheng_ji\chun_tong\wan_zheng>
09-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值