1. 在浏览器输入一个网址或在页面里点击一个超链接
2. 本机上的dns开始解析,看最近这两天有没有访问过这个网站(本机dns最多存储1000个最近访问的网址),有的话直接返回。没有的话,本机dns会将这个网址发送给dns根服务器
3. dns根服务器收到这个网址以后,进行解析(具体解析过程见下文),最后会返回一个ip地址给浏览器
4. 浏览器拿到这个ip以后,也就是知道这个web服务器的地址了,就开始对其进行访问
5. 首先通过tcp三次握手与这个web服务器进行连接
6. 连接建立以后,浏览器开始往服务器发送http请求(get或post之类)
7. web服务器收到这个请求,解析以后,返回对应的静态资源和动态资源(html页面和js),浏览器解析,显示在页面
8. 浏览器接受资源完毕以后,与web服务器进行tcp四次挥手断开连接
第三步:DNS的解析
① 本机向负责自己的本地DNS发送查询报文,如果本地服务器缓存中有,直接返回。
②本地DNS服务器发现缓存中没有,于是从内置在内部的根服务器列表中选一个发送查询报文。
③DNS根服务器解析一下后缀名,告诉本地DNS服务器负责.com的所有顶级服务器列表。
④本地服务器选择一个顶级域服务器继续查询,.com域服务器拿到域名后又开始解析,返回 负责.xx域的所有权威服务器的列表。
⑥本地服务器从返回的权威服务器之一再次发送查询报文,最终会从某一个权威服务器上得到具体的ip地址
⑦本地DNS服务器拿到解析结果
⑧本机获取到最终的ip地址
⑨对对应ip地址的web服务器发起请求
⑩拿到页面并展示
ps:也可以把这个DNS解析过程看成是一个从DNS角度来解释一个请求的过程,之后的建立tcp连接之类的都存在于⑨,发起请求这一步。
整个DNS报文的发送与响应过程都要走网络模型的五层协议
链接:
第五步:TCP三次握手建立连接
两张图链接:https://www.jianshu.com/p/e7f45779008a
三次握手目的:为了防止已经失效的连接请求报文段突然又传到服务器,因而产生错误
Q :为什么要三次握手而不是两次?
A :假如客户端发出去的第一个连接请求阻塞在了某个网络节点里(可不可以理解为某个路由里),一直延迟到连接释放以后服务器端才收到这个请求,本来这事一个失效的请求,而服务器端收到以后,以为这是一个新的连接请求,于是服务器端又给客户端发送了确认报文,表示确认建立。假如不采用三次握手,服务器端就会认为,只要我这边确认报文发出去了,连接就建立了,会一直等待着客户端的数据,但是客户端并没有发出建立连接的请求,所以不会向服务器端发送数据,就这样进入了死等,浪费了服务器端大量的资源。所以有了三次握手。有了三次握手,假如服务器端收到一个过时失效的请求报文,向客户端发送确认报文,此时客户端并没有要求建立建立,所以就不会向服务器端发送确认报文,连接就不会建立。
举个栗子:
三次握手打电话:
A:喂,能听见吗?
B:嗯,能听见,你能听见我说话吗?
A:嗯,我也能听见,Balbala。。。。。。。
没有三次握手的打电话:
A:喂,能听见吗?
(A通电话说完话以后去厕所了)
B:嗯,能听见。
(A在厕所拉肚子,拉完以后出来忘记打了电话)
B:?????。。。。。。
关于TCP**三次握手**,这里讲的更详细,可以参考一下:https://www.jianshu.com/p/e7f45779008a
第七步:服务器解读请求
当TCP连接建立以后,浏览器就开始给服务器发起了http请求,当服务器端web程序接受到http请求以后,基于开始处理这个请求,处理之后返回给浏览器html文件。
那么,服务器端收到这个http请求之后,到底是怎么生成html文件的?
(假如这个服务器配置了nginx)
- nginx在收到浏览器的请求时,会读取http请求里面头部的信息,根据host来匹配自己的所有 的虚拟主机的配置文件server_name,看看有没有匹配的,有匹配的就读取改虚拟主机的配置,也就相当于, 静态的html页面,是在nginx这里搞定的
- 当html页面到达浏览器的时候,浏览器会解析这个html,看需不需要别的资源,比如js/css/img,需要的话就想服务器端请求下载
- 动态资源。。。。。。。。数据库。。。。
参考
第八步:TCP四次挥手