在浏览器输入地址回车后,发生了什么!

一.浏览器查找域名的IP地址

浏览器会把输入的域名解析成对应的ip,DNS的作用

  1. 查找浏览器缓存

    • DNS:域名系统,DNS协议是用来将域名转换为IP地址,也可以将IP地址转换为相应的域名地址
    • 查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,浏览器去查找这些缓存,如果有缓存,直接返回IP,否则下一步
    • 火狐查询dns:about:config
      在浏览器输入地址回车后,发生了什么!
  2. 查找系统缓存

    • 浏览器缓存中找不到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的主页,并不是百度的主页
      • 友情提示,不要瞎改系统配置文件,很容易把电脑改崩掉
        在浏览器输入地址回车后,发生了什么!
        在浏览器输入地址回车后,发生了什么!

在浏览器输入地址回车后,发生了什么!

  1. 查找路由器缓存
    如果浏览器缓存与系统缓存找不到,则查找路由器的缓存。
  2. 查找ISP DNS
    如果以上步骤都找不到,那么这个请求就会被发到ISP(ISP:Internet Service Provider 互联网服务供应商),ISP也有相应的ISP DNS服务器。
  3. 迭代查询
    如果还是查不到,你的ISP的DNS服务器会将请求发向根域名服务器进行搜索,并进行迭代查询,即先向根域名服务器查询。例如:查询www.baidu.com,会先进行.com的ip查询,下一次进行.baidu.com的ip查询,再下一次进行www.baidu.com的查询。查到后将ip给主机。

二.浏览器与目标服务器建立TCP连接

  1. 浏览器通过DNS解析得到目标服务器的ip之后,与服务器建立TCP连接
  2. 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→渲染页面
  • 参考文件的三篇文章,前辈写的非常好,就是看他们写的弄懂了一点点,第一次写博客(就是学习一遍,把测试的东西贴了出来嘻嘻),如果有错的地方请帮忙指出,我加以改正,万分感谢!嘻嘻!

参考文件