当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?

1、首先是查找浏览器缓存,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时间不一样。

2、如果没有找到对应的记录,这个时候浏览器会尝试调用系统缓存(host)来继续查找这个网址的对应DNS信息。

3、如果还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息。

4、如果还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商),ISP也会有相应的ISP DNS服务器,中国电信DNS规模肯定不会小,所以基本上都能在这里找得到。

5、如果也没有找到,本地DNS服务器向根域名服务器发起请求,根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。

6、本地域名服务器向权限域名服务器dns.abc.com进行查询,权限域名服务器dns.abc.com,通过IP和域名映射表查询后,告诉本地域名服务器,所查询的主机的IP地址。如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。

7、这也就是为什么打开一个新页面会有点慢,因为本地没什么缓存,要这样递归地查询下去。

8、本地域名服务器最后把查询结果——该域名对应的IP地址告诉给主机。

9、至此,主机知道了该域名的IP地址。

10、说一下域名解析,例如"www.taobao.com",域名先是解析出这是个.com的域名,随后Local DNS向com域名服务器发起解析请求,并得到taobao.com二级域名服务器的地址;Local DNS向taobao.com二级域名服务器发起解析请求,并最终获得了www.taobao.com的IP地址信息,然后返回给客户端

11、所以域名结构为:三级域名.二级域名.一级域名。

12、浏览器得到了web服务器IP以后,浏览器接着给这个IP的服务器发送了一个http请求,方式为get,例如访问www.taobao.com,封装应用层

13、这个get请求包含了主机(host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的"代理人",Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。还有一个重点是Cookies,Cookies保存了用户的登陆信息,在每次向服务器发送请求的时候会重复发送给服务器。Corome上的F12与Firefox上的firebug(快捷键shift+F5)均可查看这些信息。

14、封装传输层,开始与服务器建立TCP连接,首先通过三次握手建立连接。这个时候真正含有应用层数据的会等待,直到建立连接后,再继续封装

15、浏览器所在的客户机向服务器发出连接请求报文。(SYN),封装传输层

16、数据封装到网络层,填写源IP和目的IP等信息,查路由表和ARP表,封装数据(查询本地的路由表,根据路由匹配规则,直连>静态>默认),如果没有网关(下一跳)MAC地址,则发送ARP(以广播的形式在局域网中发送请求)请求得到MAC地址

17、数据封装到数据链路层,得到MAC地址后,填写MAC地址等信息,封装数据

18、数据到物理层继续封装,然后通过网卡付出

19、中间可能会经过很多的路由器和交换机等设备,每经过一个路由器,网络层TTL值减1,数据链路层的源和目的MAC也一直在变化,一直到达目的地。

20、到达目的地后,进行一层一层解封,首先从物理层,然后数据链路层,一直送到传输层。

21、服务器接收报文后,解析后,目的主机知道了是请求连接的,同意建立连接,向客户机发出确认报文,回应时和15-19步骤一致(SYN+ACK)。

22、客户端接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文。ACK

23、此处客户机与服务器之间的 TCP连接建立完成,开始真正传输数据。封装步骤14的数据段,一直封装到物理层,通过网卡发出,然后和步骤18、19一致(只不过这时会解析应用层数据)

24、直到所有的数据浏览器已发送完毕(确认对方收到后),这时浏览器会释放 TCP 连接。

25、浏览器所在主机向服务器发出连接释放报文,然后停止发送数据。(FIN+ACK)

26、服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完。(ACK)

27、服务器收到浏览器的这些请求以后(其实是WEB服务器接收到了这个请求,WEB服务器有nginx、apache等),它会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code。响应就是具体的页面编码,就是那个<html>…</html>,浏览器先读了关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。

如果是个静态页面,那么基本上到这一步就没了,但是如今的网站很少有静态的,基本全是动态的。所以这时候还没完,浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分的显示,直到完全显示,最后标签栏上的圈圈就不转了。

因为主页(index)页面框架传送过来以后,浏览器还要继续向服务器发送请求,请求的内容是主页里面包含的一些资源,如图片,视频,css样式等等。这些"非静态"的东西要一点点地请求过来,标签栏就会一直转,内容一直刷,最后全部请求并加载好。浏览器显示页面中所有文本。

对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。缓存的内容通常也不会保存很久,因为难保网站不会被改动。

服务器数据发送完毕后,发送释放报文。(FIN+ACK)

客户机接收到报文后,发出确认,然后等待一段时间后,释放 TCP 连接。(ACK)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值