在浏览器输入地址回车后,发生了什么!
在浏览器输入连接回车后,发生了什么!
一.浏览器查找域名的IP地址
浏览器会把输入的域名解析成对应的ip,DNS的作用
-
查找浏览器缓存
- DNS:域名系统,DNS协议是用来将域名转换为IP地址,也可以将IP地址转换为相应的域名地址
- 查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,浏览器去查找这些缓存,如果有缓存,直接返回IP,否则下一步
- 火狐查询dns:about:config
-
查找系统缓存
- 浏览器缓存中找不到IP之后,会检索本地缓存。
- 本地缓存保存地址:C:\Windows\System32\drivers\etc\hosts
-
测试
- 先更改本地配置文件hosts 增加127.0.0.1 对应www.baidu.com
- 其次更改tomcat文件,将Host name更改为www.baidu.com 启动tomcat
- 在浏览器输入http://www.baidu.com:8080/ 会发现页面显示的tomcat的主页,并不是百度的主页
-
友情提示,不要瞎改系统配置文件,很容易把电脑改崩掉
-
查找路由器缓存
如果浏览器缓存与系统缓存找不到,则查找路由器的缓存。 -
查找ISP DNS
如果以上步骤都找不到,那么这个请求就会被发到ISP(ISP:Internet Service Provider 互联网服务供应商),ISP也有相应的ISP DNS服务器。 -
迭代查询
如果还是查不到,你的ISP的DNS服务器会将请求发向根域名服务器进行搜索,并进行迭代查询,即先向根域名服务器查询。例如:查询www.baidu.com,会先进行.com的ip查询,下一次进行.baidu.com的ip查询,再下一次进行www.baidu.com的查询。查到后将ip给主机。
二.浏览器与目标服务器建立TCP连接
- 浏览器通过DNS解析得到目标服务器的ip之后,与服务器建立TCP连接
- TCP 三次握手连接
浏览器所在的客户机向服务器发出连接请求报文。
服务器接收报文后,同意建立连接,向客户端发出确认报文。
客户端接收到报文后,再次向服务器发出报文,确认已接收到确认报文。
三.浏览器通过http协议发送请求
浏览器向主机发起HTTP报文请求,请求中包含访问的url,也就是https://www.csdn.net/,KeepAlive,长连接,还有User-Agent用户浏览器操作系统信息,编码等。
四.某些服务器会做永久重定向响应
对于大型网站存在多个主机站点,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200,而是301以3开头的重定向码,浏览器在获取了重定向相应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。
重定向的作用
重定向是为了负载均衡或者导入流量,提高SEO排名。利用一个前端服务器接收请求,然后负载到不同的,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力,重定向也可将多个域名的访问,集中到一个站点,由于baidu.com www.baidu.com会被搜索引擎认为是两个网站,造成每个的链接都会减少从而降低排名,永久重定向会将两个地址关联起来,搜索引擎会认为是同一个网站,从而提高排名。
五.浏览器跟踪重定项地址
当浏览器知道了重定向最终的访问地址之后,重新发送一个http请求,发送内容同上
六.服务器处理请求
服务器接到收获请求,然后处理并返回一个响应。
七.服务器发出一个HTML响应
返回状态码为200 表示服务器可以响应请求,返回报文,由于在报文头中Content-type为”text/hml“,浏览器以Html形式呈现
如果你请求的是一张图片,那么Content-type就不会是”text/html“
八.释放TCP连接(tcp的四次握手)
1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的***seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的***是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
九.浏览器显示页面
在浏览器没有完整接收全部HTML文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚本的交互(也就是经常看见的页面转圈圈)
十.浏览器发送获取嵌入在HTML中的其他内容
css、url、js文件等。静态文件是可以缓存到浏览器中的,有时访问这些文件不需要通过服务器,直接从缓存中取。
总结
简单来说就是
- 输入url后回车→各个地方的DNS解析IP→三次握手建立tcp连接→http发送请求→服务器处理请求并响应→四次握手释放tcp→渲染页面
- 参考文件的三篇文章,前辈写的非常好,就是看他们写的弄懂了一点点,第一次写博客(就是学习一遍,把测试的东西贴了出来嘻嘻),如果有错的地方请帮忙指出,我加以改正,万分感谢!嘻嘻!