我正在编写一个嵌入式 Web 服务器,并试图弄清楚如何将端口 80 上的所有传入 SYN 数据包重定向到端口 443。我在网上找到的所有内容都是在 Apache、NGIX 等的上下文中,并且这些都不适用于我正在使用的内容。
编辑:
以下是我目前对这一过程的理解:
- 浏览器在端口 80 上发起 TCP 三次握手,假设成功。
- 在接收到第一个 HTTP GET 请求后,服务器应该向浏览器返回一个
301 Moved Permanently
(或?)。308 Permanent Redirect
- 然后浏览器应在端口 443 上发起 TLS 握手
值得一提的是,这是一个无法访问互联网的 LAN 设备。
答案1
- 浏览器在端口 80 上发起 TCP 三次握手,假设成功。
正确的。
- 在接收到第一个 HTTP GET 请求后,服务器应向浏览器返回 301 永久移动(或 308 永久重定向?)。
通常是 301。这对于 GET 请求来说已经足够了。这里线路上的实际数据包并不重要:TCP 是关于字节流的,而此字节流如何打包与功能无关。
- 然后浏览器应在端口 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 之类的工具进行网络捕获,然后进行一些捕获以查看会发生什么。