nghttpd连接自动关闭

时间:2018-06-06 09:03:07

标签: telnet httpserver http2 nghttp2

我尝试使用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

我该如何解决这个问题?

2 个答案:

答案 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服务器发送控制帧,如MAGICSETTINGS(这包括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连接。