为什么以下事件序列导致协议错误?

时间:2018-03-20 07:22:14

标签: http2

我正在使用HTTP2客户端/服务器实现,而且我遇到了protocol_error,但我不确定原因。

Received frame: {:length=>18, :type=>:settings, :flags=>[], :stream=>0, :payload=>[[:settings_max_concurrent_streams, 128], [:settings_initial_window_size, 65536], [:settings_max_frame_size, 16777215]]}
Sent frame: {:type=>:settings, :stream=>0, :payload=>[], :flags=>[:ack]}
Received frame: {:length=>4, :type=>:window_update, :flags=>[], :stream=>0, :increment=>2147418112}
Sent frame: {:type=>:headers, :flags=>[:end_headers, :end_stream], :payload=>{":scheme"=>"https", ":method"=>"GET", ":path"=>"/index", ":authority"=>"www.example.com"}, :stream=>1}
Received frame: {:length=>8, :type=>:goaway, :flags=>[], :stream=>0, :last_stream=>0, :error=>:protocol_error}

我几乎可以肯定这是流ID的问题,但我对HTTP2协议并不陌生,所以我实际上不确定出了什么问题或为什么我&#39 ; m得到协议错误。

2 个答案:

答案 0 :(得分:1)

我猜是因为你没有发送你的设置框架 - 你只是确认了服务器设置框架。

规范could be clearer on this

  

设置帧必须由连接开始时的两个端点发送

确认设置帧数吗?

然而this section声明:

  

此序列必须后跟SETTINGS框(第6.5节),该框可能为空。   ...   作为连接前言的一部分从对等端收到的SETTINGS帧必须在发送连接前言后进行确认(参见6.5.3节)。

因此,我必须发送您的设置框,然后确认服务器设置框架。

答案 1 :(得分:0)

尝试使用标记“chrome.exe --disable-http2”,如果它与http2协议错误有关,它将会消失。