我尝试使用nghttpd服务器来测试HTTP / 2.0。要开始使用:
sudo nghttpd --push=/test=/test1.png,/test2.pcapng,/test2.txt,/test3.png --no-tls --workers=3 --early-response -v 80.
在我的CWD中,我有推文件。在另一个终端,我输入:
telnet localhost 80
一切似乎都没问题,因为我在第一个终端
中有这个输出[id=1] [ 11.893] send SETTINGS frame <length=6, flags=0x00, stream_id=0>
(niv=1)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[id=1] [ 21.898] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=SETTINGS_TIMEOUT(0x04), opaque_data(0)=[])
当我尝试使用第二个终端(任何类型的)HTTP GET时出现问题:
telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test HTTP/2.0
Connection closed by foreign host.
在我的第一个终端中,我得到了这个输出
[id=1] [314.531] closed
我该如何解决这个问题?
答案 0 :(得分:1)
HTTP / 2是一种二进制协议,您不能像使用HTTP / 1.1那样使用telnet
。
您希望仔细阅读描述HTTP / 2协议是二进制文件的HTTP/2 specification,并要求使用HPACK压缩HTTP标头。
这两个结合起来非常难以使用telnet
和手动输入到套接字;与HTTP / 2服务器交互的常用方法是使用HTTP / 2客户端工具。
此类客户端工具包括nghttp
本身,以及curl
。
答案 1 :(得分:1)
稍微详细说明:HTTP / 2服务器发送控制帧,如MAGIC
和SETTINGS
(这包括Max Concurrent Streams和Initial Window Size等信息),服务器不会尊重客户端,直到这些由客户确认(在SETTINGS
框架中)。
Telnet只是建立TCP连接,然后等待用户发出下一个数据包。
如果没有在几秒钟内看到这些控制帧,服务器会在几秒钟内关闭连接。
这符合RFC 7540第6.5.3节:
如果SETTINGS帧的发送方在合理的时间内没有收到确认,则可能会发出SETTINGS_TIMEOUT类型的连接错误(第5.4.1节)。
当我通过Telnet连接时,这是nghttpd的日志(以详细模式运行):
[id=2] [ 34.645] send SETTINGS frame <length=6, flags=0x00, stream_id=0>
(niv=1)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[id=2] [ 44.654] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
(last_stream_id=0, error_code=SETTINGS_TIMEOUT(0x04), opaque_data(0)=[])
[id=2] [ 44.654] closed
事实上,你的问题就在于答案,只是你打印了部分nghttpd服务器的日志。发送GOAWAY
帧后,服务器发送SETTINGS
帧10秒,并关闭TCP连接。