从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?
从输入域名到网页打开的简单过程如下,还附加我自己的理解:
1.DNS域名解析
客户端输入域名后,由DNS服务器来将域名解析成对应服务器的IP地址
2.建立TCP连接;
获得服务器IP之后,就需要三次握手的协议才能建立连接
1)客户端发送SYN包请求,等待服务器确认
2)服务器确认收到SYN包请求后,同时自己也返回一个包给客户端,即返回SYN+ACK
3)客户端收到SYN+ACK包之后,返回给服务器一个确认包ACK包表示收到,然后双方达成协议,建立连接
3.发送HTTP请求;
与服务器建立连接之后,就可以向服务器发送请求了,请求需要遵循http协议
4.服务器处理请求;
被请求的服务器解析用户请求的有哪些资源,通过服务器返回数据给客户端
5.返回响应结果;
给客户端返回请求的状态码,通过状态码可以知道服务器端的处理是否正常
常见状态码:状态码
100 Continue 继续,客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝
200 OK 请求成功,表示正常状态
301 Moved Permanently 请求的网页已永久移动到新位置。
400 Bad Request 语义有误,当前请求无法被服务器理解。或者是请求参数有错误
404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现。多数情况是找不到输入域名对应的网页。
500 Internal Server Error 一般来说,这个问题都会在服务器端的源代码出现错误时出现。。
6.浏览器渲染:
返回成功之后,浏览器拿到请求页面的代码,将其解析渲染出来。解析和渲染的过程主要由浏览器的渲染引擎实现
7. 断开连接:
数据传输完毕,需要断开tcp连接,此时tcp发起4次挥手
1)客户端发送给服务器,告诉服务器需要关闭tcp了
2)服务器发送给客户端,告诉客户端我准备一下就关闭
3)服务器发送给客户端,告诉客户端我已经准备好关闭了
4)客户端发送给服务器,告诉服务器我也准备好关闭了。
我自己是用 "到外面吃饭" 这种方式来理解的:
1. 比如我要到某某餐馆吃饭,我先在地图上搜 餐馆在哪里,然后通过导航 找到该餐馆(域名解析)
2. 到达餐馆过后,我想我到底要吃什么:(建立连接)
1) 摸了摸口袋里的钱,发现只有两块钱,然后询问老板有没有两元的东西。(客户端发送包,等待服务器确认)
2) 老板一看我的样子,就知道是个穷逼(服务器收到包),然后说只有馒头价格两元一个!(再返回一个包)
3) 我欣喜若狂,掏出我压箱底的两元钱,告诉老板我要了(客户端返回一个包),老板表示蚊子再小也是肉,就接受了这个订单。我们快乐地达成了协议(达成协议)
3. 老板给后厨说准备一个馒头(发送http请求)。
4. 后厨收到请求之后,开始准备馒头的材料(处理请求)。
5. 没过多久,我就拿到了热腾腾的馒头(返回响应结果)。
6. 拿到馒头之后我就开始了愉快的进食过程。(渲染)
7. 吃饱之后就离开餐馆:(断开连接)
1)我对老板说:老板,结账,我准备走了
2)老板对我说:稍等一下,马上就来
3)老板又对我说:一共两元。
4)我付了账,对老板说:这馒头真好吃,我下次再来。
虽然上面的过程和真实的响应过程对应起来比较牵强,但是这能够帮助我理解什么时候是做什么事情,并不像原来一样全靠记忆。