目录
在技术面试或其他方面,一个常见的问题是当您在浏览器中输入 URL 时会发生什么?当您浏览网站时,幕后会发生什么?典型的 HTTP 连接生命周期需要什么?我将尽我所知回答这些问题。
在深入研究连接过程之前,我们先回顾一下基本的 OSI 模型(开放系统互连模型)。 OSI 模型是一种概念模型,它标准化了两个系统之间的通信 - 一个是发出请求的系统(客户端),另一个是服务请求并发送回响应的系统(服务器)。下表显示了每层的一些重要特征。
不 | 层 | 硬件 | 功能 | 协议/应用程序 | 补充内容 |
---|---|---|---|---|---|
7 | 应用 | 服务器/电脑 | 应用程序、用户界面 | HTTP、SMTP、DNS | L7 接头 |
6 | 推介会 | 服务器/电脑 | 处理加密和语法更改 | JPEG、MP3 | L6 接头 |
5 | 会议 | 服务器/电脑 | 身份验证、权限、会话 | SCP、操作系统调度 | L5 接头 |
4 | 运输 | 防火墙 | 端到端交付、错误控制 | TCP、UDP | L4 接头 |
3 | 网络 | 路由器 | 网络寻址、路由、交换 | 知识产权 | L3 标头 |
2 | 数据链 | 开关 | 物理地址、错误检测、流程 | 以太网、帧中继 | L2 头/尾 |
1 | 身体的 | 电缆 | 通过物理网络传输的比特 | 环境影响评估/TIA | L1 标头 |
一旦您在浏览器中输入 URL 并按 Enter/Return 键,浏览器(或任何与此相关的客户端)就会解析 URL [1] 以从中提取重要的组件。下面给出了一个示例 URL:
https://www.google.com/search?q=cats
这里我们只是在谷歌上搜索猫。从上面的 URL 来看, https://
是协议, google.com
是www
(互联网)上的主机, /search
是路径参数, ?q=cats
是查询字符串参数,表示我们正在 Google 中查询猫 [ 2]。
现在,由于浏览器知道它试图访问的主机(在本例中google.com
,它将尝试获取其相应的 IP 地址。创建“ .com”或“ .org”等域名是为了让我们可以轻松记住它们。但浏览器要向 google.com 发送实际请求,它需要主机的 IP 地址。 DNS 解析帮助我们获取给定域名的 IP 地址信息。从上表来看,DNS 驻留在应用程序层 (L7)。
DNS解析步骤:
$ ipconfig /displaydns
或在 mac/linux 上使用$ log stream --predicate 'process == "mDNSResponder"' --info
命令来检查 DNS 缓存。.com
、 .org
等都是顶级域名。然后,TLD 名称将返回权威名称服务器的 IP 地址。$ dig google.com
; << >> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 180 IN A 172.217.164.174
;; AUTHORITY SECTION:
google.com. 60552 IN NS ns1.google.com.
google.com. 60552 IN NS ns2.google.com.
google.com. 60552 IN NS ns3.google.com.
google.com. 60552 IN NS ns4.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 60438 IN A 216.239.32.10
ns1.google.com. 58273 IN AAAA 2001:4860:4802:32::a
ns2.google.com. 60438 IN A 216.239.34.10
ns2.google.com. 131763 IN AAAA 2001:4860:4802:34::a
ns3.google.com. 163770 IN A 216.239.36.10
ns3.google.com. 60541 IN AAAA 2001:4860:4802:36::a
ns4.google.com. 75597 IN A 216.239.38.10
ns4.google.com. 60541 IN AAAA 2001:4860:4802:38::a
;; Query time: 13 msec
;; SERVER: 10.4.4.10#53(10.4.4.10)
;; WHEN: Mon Jun 24 12:20:50 PDT 2019
;; MSG SIZE rcvd: 303
在 OSI 模型的每一层,信息被称为 PDU(分组数据单元)。因此,应用层的信息称为 L7 PDU,而网络层的信息称为 L3 PDU。在每一层,都会添加相应的层头。标头位于其主体之前,包含寻址和到达预期目的地所需的其他数据。另一方面,数据从最顶层向下传递。 L4、L3 和 L2 标头如下所示:
在数据包发送到互联网并最终到达谷歌域服务器之前,它首先需要通过路由器进行路由。每当一个设备需要物理连接到另一个设备(在本例中为本地路由器)时,它就需要该设备的 MAC 地址(硬件地址)。但是本地机器如何知道路由器是默认路由呢?此信息是通过本地计算机内每个接口设置的默认路由获取的。您可以使用$ ifconfig
命令检查默认路由。
IP地址用于定位网络上的设备,而MAC地址用于识别实际设备。 ARP 协议用于在已知 IP 地址的情况下获取设备的 MAC 地址。这里我们假设请求的机器已经收到一个 IP 地址(静态的或通过 DHCP 协议)。
ARP 驻留在 OSI 模型的数据链路层。在这种情况下,本地计算机上运行的 Web 浏览器将连接到作为互联网网关的路由器。
arp -a
命令检查 ARP 表。然后数据包被路由到默认路由。如果没有设置默认路由,它们将被路由到路由器。可以使用命令查看默认路由
route get default | grep gateway
或netstat -rn
(mac/linux) 或ipconfig
(windows)。
例如,如果您位于 192.168.10.0/24 网络上并尝试通过 172.217.164.174/24 到达 Google 网络,例如当数据包到达路由器时,路由器将检查路由表并决定如何将流量路由到到达目的网络。因此,它将把数据包发送到指定的网关,以到达目的地 172.217.164.174/24
客户端与服务器端的连接;在这种情况下,您的本地计算机到 Google 服务器需要经过很多跳。每一跳本质上是通往目的地的路径上的一个路由器。这里的路由器帮助请求从一个网络传输到另一个网络。途中的每个设备都有一个全球唯一的 MAC 地址(硬件地址)。
现在,本地计算机创建带有 L7 标头 (HTTP)、L4 标头 (TCP)、L3 标头 (IP)、L2 标头(ARP、MAC 地址)、L2 尾部(帧检查序列)和实际数据的请求。当路由器收到数据包时,它会解封装、修改 L2 头/尾并再次封装该数据包。
路由器现在接收它并开始解封装。它查看 L2 标头并发现目标 mac 是给它自己的。现在它删除了 L2 标头,现在查看 L3 标头并了解该请求不是针对其自身,而是针对 Google 服务器。然后路由器递减 L3 标头内的 TTL 值。路由器现在会在其路由表中查找其他路由器可能已向该路由器(通过 RIP 或 IGP)通告的所有可能路由,以了解如何到达目的地。如果路由器的缓存中没有 MAC 地址,则路由器会执行 ARP 来获取下一跳路由器的 MAC 地址。
然后,路由器还会添加 CRC,该 CRC 会继续到 L2 尾部。这有助于下一个路由器知道路由上没有发生导致数据包在网络上损坏的问题。如果它已损坏,则会丢弃该帧。
在这种情况下,路由器修改了 L2 标头和 L2 尾部,但它没有触及 L3 标头,因此其上方没有标头。
源端口号将是一个临时端口号,目标端口号将为 80。
TCP - 可靠且相同的订单服务。本地计算机现在要做的第一件事是与 Google 服务器建立三向握手,因为它知道到服务器的路由。连接建立有助于最终确定一些状态变量,如 MSS 大小、初始序列号、ACK 类型、缓冲区大小等。
在这种情况下,TCP 标头中的源端口和目标端口都是 16 位,因此 2^16 是 65535。源端口用于标识客户端应用程序,而目标端口用于标识在 Web 服务器上运行的服务或守护进程。
客户端(Web 浏览器)选择 49152 - 65535 之间的任何端口。这可以确保没有 2 个应用程序使用相同的端口。端口地址与 IP 地址一起称为 TCP 套接字。目的端口是IP报文中的80端口。
开始沟通:
通过上述三个步骤,客户端和服务器之间的 TCP 握手成功,并且双方现在都同意数据传输的通用规则。
如果您连接到安全网站,则在 TCP 握手后,将进行 TLS 握手。通过 TLS 握手,客户端和服务器同意安全通信的通用条款。
从现在开始,TLS 会话传输使用商定的对称密钥加密的应用程序 (HTTP) 数据。
服务器处理请求并发回适当的响应。当请求到达端口 80 (HTTP) 或端口 443 (HTTPS) 上的服务器时,Apache 或 Nginx 等 Web 服务器会侦听端口 443,处理请求的连接并将其路由到 Web 服务所在的另一个临时端口跑步。
任何 HTTP 客户端、服务器或代理都可以随时关闭 TCP 传输连接。例如,当客户端检测到数据传输结束并且不再需要打开的连接通道时,它向服务器发送连接关闭请求。下次客户端想要与服务器通信时,需要在两台机器之间建立新的连接。
[1] | 网址标准 |
[2] | 组件或 URL |