从浏览器输入域名www.baidu.com,敲击回车开始,都经历了一些什么?
0x01 DNS请求
-
浏览器首先会查找浏览器本地的
DNS
缓存,如果缓存没有过期(一般期限也就是一分钟,并且只能容纳1000
条,各家浏览器可能不尽相同),则返回服务器IP
进行下一步; -
如果本地缓存没有的话,浏览器就会查看操作系统(
win
/Linux
等)的DNS
缓存; -
如果系统缓存没有的话,就查看
hosts
文件(c:\Windows\System32\drivers\etc\
),如果有对应的域名与ip
则解析结束; -
如果系统缓存中依然没有,就会发起
DNS
的系统调用,系统会向本地配置的首选DNS
服务器发起域名解析请求,i.e.
一般会向ISP
的DNS
服务器通过udp
的53
号端口发起DNS
请求。DNS
请求一般是递归的,也就是说,不管找没找到域名对应的IP
,ISP
的DNS
服务器都必须给我们一个答复。ISP
的DNS
服务器先在自己的缓存中查找域名对应的IP
,如果存在并且没有过期则解析成功,将IP
返回给请求方客户端浏览器;如果不存在,则该DNS
服务器会代替浏览器发起迭代DNS
解析请求,首先他会找到根域DNS
的IP
地址,向根域发起DNS
解析(请问你知道www.baidu.com
的IP
地址吗?),根域发现这是一个顶级域com
域的一个域名,根域回复:我不知道www.baidu.com
的地址,但是我知道com
域的IP
地址,你去找他。然后ISP
的DNS
服务器找到了com
域的DNS
服务器,向他发起了DNS
解析请求(请问你知道www.baidu.com
的IP
地址吗?),com
域回复说,我不知道www.baidu.com
的地址,但是我知道baidu.com
域的IP
地址,你去找他吧。最后找到baidu.com
域的DNS
服务器,一般到这就结束了,这个就是你购买域名的厂商(万网、新网等)的DNS
服务器,如果你配置了www.baidu.com
的地址,就会将IP
返回,否则就是找不到IP
地址,该域名无法解析。ISP
的DNS
服务器收到返回的IP
地址以后,他会将IP
地址返回给最初请求方,并且自己缓存,系统内核收到IP
地址以后返回给浏览器,然后进行下一步的TCP/IP
连接。
0x02 TCP三次握手
-
拿到服务器的IP之后,
User-Agent
(浏览器等)会以一个随机端口([1024
,65535
])向服务器的WEB
程序(httpd
,nginx
等)的80
端口发起TCP
连接请求。 -
HTTP
的原始请求经过TCP/IP
协议栈的层层封包,经过物理层传输到服务器设备端,然后经过服务器的TCP/IP协议栈的层层解包,最终达到WEB程序(i.e.
nginx
)。
![](https://img.haomeiwen.com/i5366157/48b1998123437f0a.png)
-
如下图所示建立连接:
TCP 三次握手
0x03 客户端发起HTTP请求
-
TCP
连接建立完成后就可以开始传输数据了。HTTP
可以发起请求。
![](https://img.haomeiwen.com/i5366157/8b309559dc2e1aa6.png)
- 使用的
http
方法是GET
,请求的URL
是/
,协议是HTTP/1.0
。
协议这里有三种版本:
http/0.9
:stateless
http/1.0
:MIME
,keep-alive
(保持连接), 缓存
http/1.1
: 更多的请求方法,更精细的缓存控制,持久连接(persistent connection
) 比较常用
chrome
发起的http
请求报文头部参数:
![](https://img.haomeiwen.com/i5366157/492ddc102a9895af.png)
Accept
就是告诉服务器端,我接受那些MIME
类型
Accept-Encoding
这个看起来是接受那些压缩方式的文件
Accept-Lanague
告诉服务器能够发送哪些语言
Connection
告诉服务器支持keep-alive
特性
Cookie
每次请求时都会携带上Cookie
以方便服务器端识别是否是同一个客户端
Host
用来标识请求服务器上的那个虚拟主机,比如Nginx
里面可以定义很多个虚拟主机,这里就是用来标识要访问那个虚拟主机。
User-Agent
用户代理,一般情况是浏览器,也有其他类型,如:wget curl
搜索引擎的蜘蛛等
条件请求首部:
If-Modified-Since
是浏览器向服务器端询问某个资源文件如果自从什么时间修改过,那么重新发给我,这样就保证服务器端资源文件更新时,浏览器再次去请求,而不是使用缓存中的文件
安全请求首部:
Authorization
: 客户端提供给服务器的认证信息;
0x04 服务器响应HTTP请求
-
nginx
读取配置文件 -
WEB
程序,即nginx
等,在收到请求(GET / HTTP/1.1
)时,会读取http
请求里面的头部信息; -
根据
Host
来匹配自己的所有虚拟主机的配置文件的server_name
,看看有没有匹配到; -
有匹配的话就查看该虚拟主机的配置,找到配置(
root /var/www/html/
),这个就表示所有的网页文件都在这个目录下,也就是网站的根目录; -
如果直接输入
www.baidu.com
,会默认进入首页,首页的配置从这个配置项获取(index
index.html
index.htm
index.php
); -
如果在上面的配置没有找到,就将请求交给
uwsgi
来处理,uwsgi
经过后端逻辑的处理返回json
数据,或者是渲染好的html
页面。
0x05 浏览器解析返回的数据,渲染页面
- 浏览器拿到
html
页面或者json
数据,开始解析html
代码,加载js/css/image
等静态资源,请求服务器下载静态文件,这个时候就利用了keep-alive
特性,即建立一次HTTP
连接,可以请求多个资源;
欢迎关注微信公众号(coder0x00)或扫描下方二维码关注,我们将持续搜寻程序员必备基础技能包提供给大家。
网友评论