这个 nc 命令如何作为 HTTP 服务器工作?

这个 nc 命令如何作为 HTTP 服务器工作?

一个答案通过 HTTP 提供文件服务nc

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080

一条评论说:

除非您使用第二个 nc 命令,否则 Chrome 不会停止跳动。

此外,并非两个 nc 命令 show 都会在响应后退出。您可以使用以下命令继续重新启动它:while :; do { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080; done。使用 ctrl+z 使其进入睡眠状态。

跳动是否意味着网络浏览器会自动重新加载 URL?

添加到第一个 nc 命令的第二个 nc 命令的目的是Content-Length: $(wc -c <some.file)阻止 Chrome 跳动吗?

URLhttp://IP:8080/后面不加任何内容或任何内容都可以在 Web 浏览器中获取文件。这种灵活性是由 HTTP 协议nc还是 Web 浏览器提供的?

谢谢。

答案1

Chrome 继续使用该命令的第一个版本,因为它不知道发送的文件有多大,所以它不知道何时收到全部文件,这种跳动意味着它仍在等待查看是否还有更多文件。

第二个版本在文件内容之前添加了带有有效负载大小的 HTTP 标头,因此 chrome 现在知道它还需要多少数据,并在到达文件末尾时将事务标记为完成。

nc结合HTTP/1.0 200 OK\r\n实现 HTTP 协议发送内容所需的绝对最低限度(实际上不是,但它接受的内容非常慷慨),添加了Content-Length更接近规范的动作。 HTTP协议有详细的文档,我建议你阅读射频卡

编辑:

  1. 跳动意味着浏览器认为页面尚未加载完毕。因此,在 chrome 确定它拥有所有文件之前,它会一直跳动。
  2. 您需要去了解 URL 的组成部分,但端口号后面的部分指向您希望服务器提供的资源。在这种情况下,服务器并不关心你要求什么,它总是会返回some.file
  3. 我真的无法回答这个问题,我希望这是一个错字,应该notenot

答案2

在 HTTP/1.0 中,如果响应中缺少 Content-Length 标头,则通过关闭套接字来指示响应的结束。nc默认情况下不会执行此操作,因此 chrome(或任何其他浏览器)会“永远”等待(“颤动”)这种情况发生。

在第一个命令中添加-N参数,它应该可以正常工作:nc

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -N -l -p 8080

请注意,HTTP/1.0 中不需要 Content-Length 标头(rfc1945 第 7.2.2 节) 除非需要一个主体并且它是空的 (第 7.2 节)。

URLhttp://IP:8080/使浏览器将 IP 和端口之后的任何内容发送到服务器,在本例中,仅发送最后一个/作为它希望从服务器获得什么的指示。在示例 nc 命令中,/浏览器发送的(或其他任何实际内容)将被完全忽略,并且响应始终相同。所以你可以使用http://IP:8080/hello/world.png相同的结果。

相关内容