我一直在玩 Wireshark,我注意到某些网站在初始化 https 连接时表现不同。我测试的第一个网站是美国银行,当我在地址栏中输入“bankofamerica.com”时,它的行为与我预期的完全一样。
控制流程如下:
- 发送 DNS 请求
- 通过端口 80 建立 TCP 连接(TCP 握手)
- 发送 GET / HTTP/1.1
- 接收 301 永久移动到https://www.bankofamerica.com
- 通过 443 建立 TCP 连接
- 设置 TLS 并发送数据
这正是我所期望的。但是,当我在地址栏中输入“facebook.com”时,出现以下情况:
- 发送 DNS 请求
- 通过端口 443 设置 TCP 连接
- 设置 TLS 并发送数据
即使我没有在地址栏中指定 HTTPS,连接怎么可能跳过 HTTP 请求?我尝试清除浏览器缓存、重置路由器,甚至查看 DNS RFC 以查看是否有一些“仅限 https”标志(如我所料,没有)。
当我使用 netcat 时,我能够生成 301 Moved Permanently (但是它是http://www。不是https://www 。):
nc facebook.com 80\n
GET / HTTP/1.0\n\n
但我不知道(即使在删除我的缓存之后)它是如何跳过浏览器连接中的 http 部分的。我担心我不了解 http/https 如何工作的基本部分。任何帮助,将不胜感激。
谢谢