Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTTP/2优先级&;使用Jetty进行依赖性测试_Java_Http_Jetty_Http2 - Fatal编程技术网

Java HTTP/2优先级&;使用Jetty进行依赖性测试

Java HTTP/2优先级&;使用Jetty进行依赖性测试,java,http,jetty,http2,Java,Http,Jetty,Http2,优先级和相关性: 在这里我做了一个简单的测试。但结果似乎不太好。 我尝试在同一个连接的for循环中发出100个请求(请求url是相同的,我想知道这部分是否会影响结果) 如果索引是i,那么我的请求流_id是i,而依赖流_id是100+i。如果我们的假设是正确的,那么请求永远不会得到响应,因为101到200之间没有流id 但是结果表明,设置依赖项和不设置依赖项没有区别。我一个接一个地得到了响应数据帧,没有超时或等待。 以及其他一些相关的测试,其出发点是让依赖于其他流的流先被发送,然后依赖于其他流。但

优先级和相关性:

在这里我做了一个简单的测试。但结果似乎不太好。 我尝试在同一个连接的for循环中发出100个请求(请求url是相同的,我想知道这部分是否会影响结果)

如果索引是i,那么我的请求流_id是i,而依赖流_id是100+i。如果我们的假设是正确的,那么请求永远不会得到响应,因为101到200之间没有流id

但是结果表明,设置依赖项和不设置依赖项没有区别。我一个接一个地得到了响应数据帧,没有超时或等待。 以及其他一些相关的测试,其出发点是让依赖于其他流的流先被发送,然后依赖于其他流。但结果是一样的。 我仍在思考结果的原因。有人能帮我吗?非常感谢

代码如下:

public void run() throws Exception
{
    host = "google.com";
    port = 443;
    //client init
    HTTP2Client client = new HTTP2Client();
    SslContextFactory sslContextFactory = new SslContextFactory(true);
    client.addBean(sslContextFactory);
    client.start();       

    //connect init
    FuturePromise<Session> sessionPromise = new FuturePromise<>();
    client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
    Session session = sessionPromise.get(10, TimeUnit.SECONDS);

    //headers init
    HttpFields requestFields = new HttpFields();
    requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);

    final Phaser phaser = new Phaser(2);

    //multiple request in one connection
    for(int i=0;i<100;i++)
    {
        MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
        PriorityFrame testPriorityFrame = new PriorityFrame(i, 100+i, 4, true);
        HeadersFrame headersFrame = new HeadersFrame(0, metaData, testPriorityFrame, true);

        //listen header/data/push frame
    session.newStream(headersFrame, new Promise.Adapter<Stream>(), new Stream.Listener.Adapter()
    {
        @Override
        public void onHeaders(Stream stream, HeadersFrame frame)
        {
            System.err.println(frame+"headId:"+frame.getStreamId());
            if (frame.isEndStream())
                phaser.arrive();
        }

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback)
        {
            System.err.println(frame +"streamid:"+ frame.getStreamId());
            callback.succeeded();
            if (frame.isEndStream())
                phaser.arrive();
        }

        @Override
        public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
        {
            System.err.println(frame+"pushid:"+frame.getStreamId());
            phaser.register();
            return this;
        }


    });
    }
    phaser.awaitAdvanceInterruptibly(phaser.arrive(), 5, TimeUnit.SECONDS);

    client.stop();
}
public void run()引发异常
{
host=“google.com”;
端口=443;
//客户端初始化
HTTP2Client client=新的HTTP2Client();
SslContextFactory SslContextFactory=新SslContextFactory(真);
addBean(sslContextFactory);
client.start();
//连接初始化
未来承诺会话承诺=新的未来承诺();
connect(sslContextFactory,新的InetSocketAddress(主机,端口),新的ServerSessionListener.Adapter(),sessionPromise);
会话=sessionPromise.get(10,时间单位为秒);
//头初始化
HttpFields requestFields=新的HttpFields();
requestFields.put(“用户代理”,client.getClass().getName()+”/“+Jetty.VERSION);
最终相位器相位器=新相位器(2);
//一个连接中的多个请求

对于(inti=0;i),Jetty项目尚未实现(尚未)HTTP/2请求优先级

我们正在讨论这对服务器是否有用,服务器关心的是尽快写回响应

让一个客户端改变其对请求优先级的看法,或者让一个请求知道实际上它首先希望另一个请求得到服务,这对服务器来说是一项艰巨的工作,同时还要为连接到它的其他10000个客户端提供服务

当服务器重新计算依赖请求的优先级树时,它可能已经为请求提供了服务

当客户端意识到它必须更改请求的优先级时,整个响应可能已经在运行中

话虽如此,我们当然对真实世界中的用例感兴趣,在这些用例中,服务器执行的请求优先级可以产生真正的性能改进。我们只是还没有看到它


我很想听听你为什么对请求优先级感兴趣以及你是如何利用它的。你的答案可能是Jetty项目实施HTTP/2优先级的驱动力。

因为我的研究兴趣是网络安全。我想知道一些黑客可能会利用HTTP/2优先级的功能攻击服务器。所以我想告诉我们让Jetty客户端做这样的测试。顺便说一下,我在javadoc 9.3.3中看到了PriorityFrame,为什么你说你还没有实现它。另一件事是,你说当客户端意识到它必须更改请求的优先级时,它的整个响应可能已经在运行中。我可以使用Jetty来构建多个特定的re吗有一些关系的任务,就像我的测试一样。
PriorityFrame
之所以存在,是因为服务器必须解析它,但它会立即被丢弃,并且不会执行优先级逻辑(现在)。您可以使用Jetty
HTTP2Client
来生成具有优先级和依赖性的请求,但您需要找到一个实现该功能的服务器来触发行为,我建议您这样做。请随时加入进一步的讨论。如果我理解正确,您的意思是我可以使用HTTP2Client来生成具有优先级和依赖性的请求pendencies,似乎我需要使用PriorityFrame来构建依赖项。但你也说过没有优先级逻辑。因此,即使我使用优先级和依赖项构建请求,也没有用。对吗?我还尝试了代码向支持优先级和依赖项的h2o服务器发出请求。但结果仍然是一样的相同。是的,您可以使用
HTTP2Client
构建具有优先级和依赖性的请求。当我说“没有优先级逻辑”时我说的是服务器。除了发送帧,客户端没有任何逻辑。当你与H2O对话时,什么结果保持不变?我明白了,我的意思是,当我使用上面的代码与H2O对话时,设置依赖项与否没有区别。我一个接一个地获得了数据帧,没有超时或等待。我猜你的解释是这样的(到我们……可能已经完成了请求。到客户……可能已经在飞行中了。)是的。如果我同时使用多个线程发送请求,您认为结果可能会不同吗?我不清楚客户端和服务器中的优先级是如何实现的。您对此有什么推荐材料吗?非常感谢。