我需要从数据包层面解释 HTTP 如何重定向到 HTTPS

我需要从数据包层面解释 HTTP 如何重定向到 HTTPS

我正在编写一个嵌入式 Web 服务器,并试图弄清楚如何将端口 80 上的所有传入 SYN 数据包重定向到端口 443。我在网上找到的所有内容都是在 Apache、NGIX 等的上下文中,并且这些都不适用于我正在使用的内容。

编辑:

以下是我目前对这一过程的理解:

  1. 浏览器在端口 80 上发起 TCP 三次握手,假设成功。
  2. 在接收到第一个 HTTP GET 请求后,服务器应该向浏览器返回一个301 Moved Permanently(或?)。308 Permanent Redirect
  3. 然后浏览器应在端口 443 上发起 TLS 握手

值得一提的是,这是一个无法访问互联网的 LAN 设备。

答案1

  1. 浏览器在端口 80 上发起 TCP 三次握手,假设成功。

正确的。

  1. 在接收到第一个 HTTP GET 请求后,服务器应向浏览器返回 301 永久移动(或 308 永久重定向?)。

通常是 301。这对于 GET 请求来说已经足够了。这里线路上的实际数据包并不重要:TCP 是关于字节流的,而此字节流如何打包与功能无关。

  1. 然后浏览器应在端口 443 上发起 TLS 握手

在浏览器能够在端口 443 上进行 TLS 握手之前,它必须在端口 443 上创建一个 TCP 连接,类似于在步骤 1 中对端口 80 所做的操作。

再次强调,TLS 握手的实际打包并不重要,因为 TCP 是关于字节流的。有关 TLS 握手在传输数据方面的工作原理,请参见示例TLS 握手中会发生什么? | SSL 握手

TLS 握手完成后,浏览器将发送 GET 请求,但通过 TLS 连接发送,因此是加密的。

答案2

我正在编写一个嵌入式 Web 服务器,并试图弄清楚如何将端口 80 上的所有传入 SYN 数据包重定向到端口 443。我在网上找到的所有内容都是在 Apache、NGIX 等的上下文中,并且这些都不适用于我正在使用的内容。

这是网络堆栈上的两个不同层:SYN 数据包是 TCP 握手的一部分,用于在客户端和 Web 服务器之间形成双向通信通道。在此 TCP 连接上,使用 HTTP 协议发出请求并发回响应。

如果没有更近的上下文,就很难知道您是否正在使用现有的 TCP 堆栈,或者您是否也在实现 TCP。

如果您正在使用现有的 TCP 堆栈,我建议使用 Libevent 作为 HTTP 服务器。示例如下:https://github.com/libevent/libevent/blob/master/sample/http-server.c

然后,您可以添加一些逻辑来处理您想要的请求/响应逻辑。

答案3

我的建议是安装一个小型的 nginx 网络服务器,并使用 whireshark 之类的工具进行网络捕获,然后进行一些捕获以查看会发生什么。

相关内容