一次完整的 Web 请求是如何处理的?

示意图

处理流程

处理过程解析

输入 URL

URI:Uniform Resource Identifier,统一资源标识符,用字符串标识某一互联网资源。

URL:Uniform Resource Locator,统一资源定位符,URL 是 URI 的子集,也就是我们通常使用的网页地址。

1
2
3
4
5
# HTTP URL格式
http://<host>:<port>/<path>?<searchpart>

# 文件URL格式
file://<host>/<path>

DNS 域名解析

功能:简单的说就是把域名翻译成 IP 地址,基本过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
➜  hexo dig +cmd +trace www.baidu.com   

; <<>> DiG 9.10.6 <<>> +cmd +trace www.baidu.com
;; global options: +cmd
. 103 IN NS j.root-servers.net.
. 103 IN NS g.root-servers.net.
. 103 IN NS a.root-servers.net.
. 103 IN NS i.root-servers.net.
. 103 IN NS e.root-servers.net.
. 103 IN NS f.root-servers.net.
. 103 IN NS d.root-servers.net.
. 103 IN NS h.root-servers.net.
. 103 IN NS l.root-servers.net.
. 103 IN NS m.root-servers.net.
. 103 IN NS c.root-servers.net.
. 103 IN NS k.root-servers.net.
. 103 IN NS b.root-servers.net.
;; Received 239 bytes from 10.138.92.76#53(10.138.92.76) in 94 ms

com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com. 86400 IN RRSIG DS 8 1 86400 20191219050000 20191206040000 22545 . OBLBMAKPWdA9vtl+G+51COaZLcCCWqZZHqV/EgOTAVGNDx4JrinTOynB eY2PHFjv4VbzRhjZxic7LH3gVJhO0T7nu+VygYvL2jshHIP+1uc15fzl 42PgBvJEVVV2FZoMDoS72wJ10jK/dN2PfhPfXTrK42XqGDa253opx2W2 +aTcu4YsXCbEjn7z2wg5LguHcsFX56zhYONsnH2UWtCAQCQhBH64M/NL CweHmJNTEjvhBQOATGB66vuhkgn5v9EpBwRSH/MG6klVj6KOfcpHpbAj GKjazHo3A7l4e5EkVYXNhDPF2bI3/thcplNFkGDvuAAfrftfnvddZWgB beBOGg==
;; Received 1173 bytes from 192.203.230.10#53(e.root-servers.net) in 96 ms

baidu.com. 172800 IN NS ns2.baidu.com.
baidu.com. 172800 IN NS ns3.baidu.com.
baidu.com. 172800 IN NS ns4.baidu.com.
baidu.com. 172800 IN NS ns1.baidu.com.
baidu.com. 172800 IN NS ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20191213054807 20191206043807 12163 com. NjRosY9LtJZsqeG+g+/JAi8jqB/0KYSqvkI/a4KEUM8atk25ERfJ+69Y WLKQDc048p4OC4TFn/R+Z73M3Xo1uAp0QSiBOzQXasVb0RvXKJOIfDyy mIMQh9IJGXXBMNgrbCG1AaN4DyU4uTxi6nIsoOc58h1FYov7seLt9ezy waw1r5UbrRg6J7xML7Ge/yui3VffXOYoeitCRJZkeTvcGg==
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN NSEC3 1 1 0 - HPVVN3Q5E5GOQP2QFE2LEM4SVB9C0SJ6 NS DS RRSIG
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN RRSIG NSEC3 8 2 86400 20191211055253 20191204044253 12163 com. LW49gsAlOuvZZeH44KGPPfP+9wOlaCwJ+y0PyStRG+5XLjM1Ah6tDlY5 J65QbqG6IyucqnZIyPbXc+pZnnMFxrTG8tyQ2JenP7bCtVBmkjmMQa9g 6Kocjnb5RiGYIqpX+IfX5y43KmLiQr+Ikh24HuVfpow30C+8qxDpt9UB CMIoFLtBjjZPFcX6XRxrIgNeN2NXCFSDwDw73HEq74nCAw==
;; Received 761 bytes from 192.33.14.30#53(b.gtld-servers.net) in 507 ms

www.baidu.com. 1200 IN CNAME www.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
;; Received 239 bytes from 14.215.178.80#53(ns4.baidu.com) in 97 ms
  • DNS 根域名服务器(13台):.
  • DNS 主域名服务器(13台):com.
  • 管理方 DNS 服务器:baidu.com.

举个例子,你想知道某个一起上法律课的女孩的电话,并且你偷偷拍了她的照片,回到寝室告诉一个很仗义的哥们儿,这个哥们儿二话没说,拍着胸脯告诉你,甭急,我替你查(此处完成了一次递归查询,即,问询者的角色更替)。然后他拿着照片问了学院大四学长,学长告诉他,这姑娘是xx系的;然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学,助理同学说是xx系yy班的,然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话(此处完成若干次迭代查询,即,问询者角色不变,但反复更替问询对象)。最后,他把号码交到了你手里,完成整个查询过程。

建立 TCP 连接

拿到域名对应的 IP 地址后,浏览器会以一个随机端口(1024 < 端口 < 65535)向服务器的 WEB 程序发起 TCP 的连接请求。

三次握手

  • Client 首先发送一个连接试探
  • Server 监听到连接请求报文后,如同意建立连接,则向 Client 发送确认
  • Client 收到确认后还需再次发送确认,同时携带要发送给 Server 的数据

抓包

发送 HTTP 请求

HTTP 协议

服务器处理 HTTP 请求

服务器在接收到请求后,解析用户请求,知道要调度哪些资源文件,再通过相应的资源文件处理用户的请求和参数,并调用数据库,将结果通过 web 服务器返回给浏览器。

Nginx

关闭 TCP 连接

数据传输完成后,为了避免服务器与客户端双方的资源占用和损耗,会经过四次挥手,关闭 TCP 连接。

浏览器渲染页面