「java实现quic」JAVA实现区域网监控电脑

博主:adminadmin 2023-03-18 21:49:07 515

本篇文章给大家谈谈java实现quic,以及JAVA实现区域网监控电脑对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java快速排序问题

调用QuictSort类的sort函数, 把返回值存放在arraya中

例如:int[] array = {24,8,1,44,13,34,11,64,23,98,43,25};

sort(array, 0, array.length);

在sort函数中,首先middle = pData[left] 为24,然后与8作比较. 因为8 24, 所以接着比较 1 24 ,一直比较下去, 直到第pData[i]个数的值 大于middle 停止比较。

然后用pData[j]于middle比较, 此时是用25 与middle比较,25 24 ,所以--j后接着比较...直到pData[j] = 23 时 退出循环

然后把44 与 23交换位置 。。。

然后。。。

我觉得这样说的你未必能看懂 你自己把程序调试一下,跟踪一下,很快就能知道快排的思路了。。。

quic 协议总结

client和server协商过程:

1. 客户端发送CHLO到服务端

2. 服务端回送的REJ信息给客户端,同时携带上原地址标识信息和服务端证书信息

3. 客户端再次发送CHLO到服务端

拥塞控制:

QUIC参考TCP的CUBIC拥塞控制算法,并在试探尝试其他拥塞控制算法

试探尝试新的拥塞控制算法:例如每个数据包的转发(包括原始数据包和重传包)都携带一个新的sequece序列化,这样可以避免TCP的重传模糊问题

QUIC-ACK会携带上接收数据包的时间以及发送ack的时间,这样有利于计算往返时延

QUIC-ACK相比TCP的SACK,跟容易实现包的重组,当有包丢失或者

FEC

通过FEC可以从一组FEC报文组中恢复网络传输中丢失的数据包,具体优化方案由发送端决定

连接复用

QUIC连接通过一个64位的连接标识符标识,该标识符由客户端产生。

QUIC的连接建立将版本协商与加密和传输握手交织在一起以减少连接建立延迟。我们将在下面首先描述版本协商。

连接建立延迟

灵活的拥塞控制

多路复用而不存在队首阻塞

认证和加密的首部和载荷

流和连接的流量控制

连接迁移

QUIC采用了两级密钥机制:初始密钥和会话密钥。初次连接时不加密,并协商初始密钥。初始密钥协商完毕后会

马上再协商会话密钥,这样可以保证密钥的前向安全性,之后可以在通信的过程中就实现对密钥的更新。接收方意

识到有新的密钥要更新时,会尝试用新旧两种密钥对数据进行解密,直到成功才会正式更新密钥,否则会一直保留

旧密钥有效。

  QUIC在握手过程中使用Diffie-Hellman算法协商初始密钥,初始密钥依赖于服务器存储的一组配置参数,该参数

会周期性的更新。初始密钥协商成功后,服务器会提供一个临时随机数,双方根据这个数再生成会话密钥。

0-RTT握手过程

    QUIC握手的过程是需要一次数据交互,0-RTT时延即可完成握手过程中的密钥协商,比TLS相比效率提高了5倍,且具有更高的安全性。

    QUIC在握手过程中使用Diffie-Hellman算法协商初始密钥,初始密钥依赖于服务器存储的一组配置参数,该参数会周期性的更新。

    初始密钥协商成功后,服务器会提供一个临时随机数,双方根据这个数再生成会话密钥。

    具体握手过程如下:

    (1) 客户端判断本地是否已有服务器的全部配置参数,如果有则直接跳转到(5),否则继续

    (2) 客户端向服务器发送inchoate client hello(CHLO)消息,请求服务器传输配置参数

    (3) 服务器收到CHLO,回复rejection(REJ)消息,其中包含服务器的部分配置参数

    (4) 客户端收到REJ,提取并存储服务器配置参数,跳回到(1)

    (5) 客户端向服务器发送full client hello消息,开始正式握手,消息中包括客户端选择的公开数。此时客户端根据获取的服务器配置参数和自己选择的公开数,可以计算出初始密钥。

    (6) 服务器收到full client hello,如果不同意连接就回复REJ,同(3);如果同意连接,根据客户端的公开数计算出初始密钥,回复server hello(SHLO)消息,SHLO用初始密钥加密,并且其中包含服务器选择的一个临时公开数。

    (7) 客户端收到服务器的回复,如果是REJ则情况同(4);如果是SHLO,则尝试用初始密钥解密,提取出临时公开数

    (8) 客户端和服务器根据临时公开数和初始密钥,各自基于SHA-256算法推导出会话密钥

    (9) 双方更换为使用会话密钥通信,初始密钥此时已无用,QUIC握手过程完毕。之后会话密钥更新的流程与以上过程类似,只是数据包中的某些字段略有不同。

QUIC包含三种报文包类型:

协商Package、公用复位package、普通帧信息Package

Version Negotiation Packets and Public Reset Packets, and regular packets containing frames.

如果客户端的版本不被服务器接受,则将导致1-RTT的延迟。服务器将发送一个版本协商包给客户端。这个包将设置版本标记,并将包含服务器支持的版本的集合。

当客户端从服务器收到一个版本协商包,它将选择一个可接受的协议版本并使用这个版本重发所有包。

为了避免流ID冲突,流 ID 必须是偶数,如果流是由服务器初始化的话,如果流由客户端初始化则必须为奇数。

0不是一个有效的流 ID。流 1 被保留用来加密握手,它应该是第一个客户端初始化的流。当基于QUIC使用HTTP/2时,

流 3 被保留来为其它流传输压缩的首部,以确保首部的处理和传送可靠且有序。

各种帧格式参考:QUICWireLayoutSpecification.pdf

官方参考地址:

java快速排序,这个排序哪里出问题为什么在java上运行有错,vc++上成功

public static void quic(int b[],int low,int high)

{

if(low=high)//将这句提前判断就可以了,实际上vc++可能存在数组越界的可能但vc不会报错,当你再次调用这两句 quic(b,low,i-1);quic(b,i+1,high);时可能让low成为一个不存在的下表,所以当检查到这句时程序就会终止,java拥有比c++更加严格的检查机制,避免了程序中隐藏的一些错误,如内存泄露,数组越界,程序崩溃,野指针等导致程序崩溃或编译出错的一系列问题。

return ;

int i=low,j=high;

int t=b[low];

while(ij)

{

while(ijb[j]t)

j--;

b[i]=b[j];

while(ijb[i]t)

i++;

b[j]=b[i];

}

b[i]=t;

quic(b,low,i-1);

quic(b,i+1,high);

}

详解基于UDP的低延时网络传输层协议——QUIC

Quic 全称 quick udp internet connection [1],“快速 UDP 互联网连接”,(和英文 quick 谐音,简称“快”)是由 Google 提出的使用 udp 进行多路并发传输的协议。

Quic 相比现在广泛应用的 http2+tcp+tls 协议有如下优势 [2]:

减少了 TCP 三次握手及 TLS 握手时间;

改进的拥塞控制;

避免队头阻塞的多路复用;

连接迁移;

前向冗余纠错。

从上个世纪 90 年代互联网开始兴起一直到现在,大部分的互联网流量传输只使用了几个网络协议。使用 IPv4 进行路由,使用 TCP 进行连接层面的流量控制,使用 SSL/TLS 协议实现传输安全,使用 DNS 进行域名解析,使用 HTTP 进行应用数据的传输。

而且近三十年来,这几个协议的发展都非常缓慢。TCP 主要是拥塞控制算法的改进,SSL/TLS 基本上停留在原地,几个小版本的改动主要是密码套件的升级,TLS1.3[3] 是一个飞跃式的变化,但截止到今天,还没有正式发布。IPv4 虽然有一个大的进步,实现了 IPv6,DNS 也增加了一个安全的 DNSSEC,但和 IPv6 一样,部署进度较慢。

随着移动互联网快速发展以及物联网的逐步兴起,网络交互的场景越来越丰富,网络传输的内容也越来越庞大,用户对网络传输效率和 WEB 响应速度的要求也越来越高。

一方面是历史悠久使用广泛的古老协议,另外一方面用户的使用场景对传输性能的要求又越来越高。

如下几个由来已久的问题和矛盾就变得越来越突出:

协议历史悠久导致中间设备僵化;

依赖于操作系统的实现导致协议本身僵化;

建立连接的握手延迟大;

队头阻塞。

可能是 TCP 协议使用得太久,也非常可靠。所以我们很多中间设备,包括防火墙、NAT 网关,整流器等出现了一些约定俗成的动作。

比如有些防火墙只允许通过 80 和 443,不放通其他端口。NAT 网关在转换网络地址时重写传输层的头部,有可能导致双方无法使用新的传输格式。整流器和中间代理有时候出于安全的需要,会删除一些它们不认识的选项字段。

TCP 协议本来是支持端口、选项及特性的增加和修改。但是由于 TCP 协议和知名端口及选项使用的历史太悠久,中间设备已经依赖于这些潜规则,所以对这些内容的修改很容易遭到中间环节的干扰而失败。

而这些干扰,也导致很多在 TCP 协议上的优化变得小心谨慎,步履维艰。

TCP 是由操作系统在内核西方栈层面实现的,应用程序只能使用,不能直接修改。虽然应用程序的更新迭代非常快速和简单。但是 TCP 的迭代却非常缓慢,原因就是操作系统升级很麻烦。

现在移动终端更加流行,但是移动端部分用户的操作系统升级依然可能滞后数年时间。PC 端的系统升级滞后得更加严重,windows xp 现在还有大量用户在使用,尽管它已经存在快 20 年。

服务端系统不依赖用户升级,但是由于操作系统升级涉及到底层软件和运行库的更新,所以也比较保守和缓慢。

这也就意味着即使 TCP 有比较好的特性更新,也很难快速推广。比如 TCP Fast Open。它虽然 2013 年就被提出了,但是 Windows 很多系统版本依然不支持它。 即时通讯聊天软件开发可以咨询蔚可云。

不管是 HTTP1.0/1.1 还是 HTTPS,HTTP2,都使用了 TCP 进行传输。HTTPS 和 HTTP2 还需要使用 TLS 协议来进行安全传输。

这就出现了两个握手延迟:

1)TCP 三次握手导致的 TCP 连接建立的延迟;

2)TLS 完全握手需要至少 2 个 RTT 才能建立,简化握手需要 1 个 RTT 的握手延迟。

对于很多短连接场景,这样的握手延迟影响很大,且无法消除。

队头阻塞主要是 TCP 协议的可靠性机制引入的。TCP 使用序列号来标识数据的顺序,数据必须按照顺序处理,如果前面的数据丢失,后面的数据就算到达了也不会通知应用层来处理。

另外 TLS 协议层面也有一个队头阻塞,因为 TLS 协议都是按照 record 来处理数据的,如果一个 record 中丢失了数据,也会导致整个 record 无法正确处理。

概括来讲,TCP 和 TLS1.2 之前的协议存在着结构性的问题,如果继续在现有的 TCP、TLS 协议之上实现一个全新的应用层协议,依赖于操作系统、中间设备还有用户的支持。部署成本非常高,阻力非常大。

所以 QUIC 协议选择了 UDP,因为 UDP 本身没有连接的概念,不需要三次握手,优化了连接建立的握手延迟,同时在应用程序层面实现了 TCP 的可靠性,TLS 的安全性和 HTTP2 的并发性,只需要用户端和服务端的应用程序支持 QUIC 协议,完全避开了操作系统和中间设备的限制。

0RTT 建连可以说是 QUIC 相比 HTTP2 最大的性能优势。那什么是 0RTT 建连呢?

这里面有两层含义:

传输层 0RTT 就能建立连接;

加密层 0RTT 就能建立加密连接。

TCP 的拥塞控制实际上包含了四个算法:慢启动,拥塞避免,快速重传,快速恢复 [22]。

QUIC 协议当前默认使用了 TCP 协议的 Cubic 拥塞控制算法 [6],同时也支持 CubicBytes, Reno, RenoBytes, BBR, PCC 等拥塞控制算法。

从拥塞算法本身来看,QUIC 只是按照 TCP 协议重新实现了一遍,那么 QUIC 协议到底改进在哪些方面呢?主要有如下几点。

【可插拔】:

什么叫可插拔呢?就是能够非常灵活地生效,变更和停止。体现在如下方面:

1)应用程序层面就能实现不同的拥塞控制算法,不需要操作系统,不需要内核支持。这是一个飞跃,因为传统的 TCP

拥塞控制,必须要端到端的网络协议栈支持,才能实现控制效果。而内核和操作系统的部署成本非常高,升级周期很长,这在产品快速迭代,网络爆炸式增长的今天,显然有点满足不了需求;

2)即使是单个应用程序的不同连接也能支持配置不同的拥塞控制。就算是一台服务器,接入的用户网络环境也千差万别,结合大数据及人工智能处理,我们能为各个用户提供不同的但又更加精准更加有效的拥塞控制。比如 BBR 适合,Cubic 适合;

3)应用程序不需要停机和升级就能实现拥塞控制的变更,我们在服务端只需要修改一下配置,reload 一下,完全不需要停止服务就能实现拥塞控制的切换。

STGW 在配置层面进行了优化,我们可以针对不同业务,不同网络制式,甚至不同的 RTT,使用不同的拥塞控制算法。

【单调递增的 Packet Number】:

TCP 为了保证可靠性,使用了基于字节序号的 Sequence Number 及 Ack 来确认消息的有序到达。

QUIC 同样是一个可靠的协议,它使用 Packet Number 代替了 TCP 的 sequence number,并且每个 Packet Number 都严格递增,也就是说就算 Packet N 丢失了,重传的 Packet N 的 Packet Number 已经不是 N,而是一个比 N 大的值。而 TCP 呢,重传 segment 的 sequence number 和原始的 segment 的 Sequence Number 保持不变,也正是由于这个特性,引入了 Tcp 重传的歧义问题。

QUIC 的流量控制 [22] 类似 HTTP2,即在 Connection 和 Stream 级别提供了两种流量控制。为什么需要两类流量控制呢?主要是因为 QUIC 支持多路复用。

Stream 可以认为就是一条 HTTP 请求。

Connection 可以类比一条 TCP 连接。多路复用意味着在一条 Connetion 上会同时存在多条 Stream。既需要对单个 Stream 进行控制,又需要针对所有 Stream 进行总体控制。

QUIC 实现流量控制的原理比较简单:

通过 window_update 帧告诉对端自己可以接收的字节数,这样发送方就不会发送超过这个数量的数据。

通过 BlockFrame 告诉对端由于流量控制被阻塞了,无法发送数据。

QUIC 的流量控制和 TCP 有点区别,TCP 为了保证可靠性,窗口左边沿向右滑动时的长度取决于已经确认的字节数。如果中间出现丢包,就算接收到了更大序号的 Segment,窗口也无法超过这个序列号。

但 QUIC 不同,就算此前有些 packet 没有接收到,它的滑动只取决于接收到的最大偏移字节数。

QUIC 的多路复用和 HTTP2 类似。在一条 QUIC 连接上可以并发发送多个 HTTP 请求 (stream)。但是 QUIC 的多路复用相比 HTTP2 有一个很大的优势。

QUIC 一个连接上的多个 stream 之间没有依赖。这样假如 stream2 丢了一个 udp packet,也只会影响 stream2 的处理。不会影响 stream2 之前及之后的 stream 的处理。

这也就在很大程度上缓解甚至消除了队头阻塞的影响。

关于java实现quic和JAVA实现区域网监控电脑的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。