首页 > 试题广场 >

当你在浏览器输入一个网址,如http:www.taoba

[问答题]
当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?请从技术的角度描述,如浏览器、网络(UDP、TCP、HTTP等),以及服务器等各种参与对象上由此引发的一系列活动,请尽可能的涉及到所有的关键技术点。
推荐
xxj头像 xxj

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

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

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

如果还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商,就是那些拉网线到你家里的运营商,中国电信中国移动什么的),ISP也会有相应的ISP DNS服务器,一听中国电信就知道这个DNS服务器的规模肯定不会小,所以基本上都能在这里找得到。题外话:会跑到这里进行查询是因为你没有改动过"网络中心"的"ipv4"的DNS地址,万恶的电信联通可以改动了这个DNS服务器,换句话说他们可以让你的浏览器跳转到他们设定的页面上,这也就是人尽皆知的DNS和HTTP劫持,ISP们还美名曰“免费推送服务”。强烈鄙视这种霸王行为。我们也可以自行修改DNS服务器来防止DNS被ISP污染。

如果还是没有的话, 你的ISP的DNS服务器会将请求发向根域名服务器进行搜索。根域名服务器就是面向全球的顶级DNS服务器,共有13台逻辑上的服务器,从A到M命名,真正的实体服务器则有几百台,分布于全球各大洲。所以这些服务器有真正完整的DNS数据库。如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。或者卖域名的把它回收掉了(通常是因为欠费)。

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

多说一句,例如"mp3.baidu.com",域名先是解析出这是个.com的域名,然后跑到管理.com域名的服务器上进行进一步查询,然后是.baidu,最后是mp3,

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

浏览器终于得到了IP以后,浏览器接着给这个IP的服务器发送了一个http请求,方式为get,例如访问nbut.cn

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

发送完请求接下来就是等待回应了,如下图:

当然了,服务器收到浏览器的请求以后(其实是WEB服务器接收到了这个请求,WEB服务器有iis、apache等),它会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code,2开头如200表示一切正常,3开头表示重定向,4开头,如404,呵呵。响应就是具体的页面编码,就是那个<html>......</html>,浏览器先读了关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。在下一次CF的时候(不是穿越火线,是http://codeforces.com/),由于经常难以承受几千人的同时访问,所以CF页面经常会出现崩溃页面,到时候可以点开火狐的firebug或是Chrome的F12看看状态,不过这时候一般都急着看题和提交代码,似乎根本就没心情理会这个状态吧-.-。

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

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

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


编辑于 2015-01-28 10:32:20 回复(6)
1.DNS域名解析:浏览器缓存、系统缓存、路由器、ISP的DNS服务器、根域名服务器。把域名转化成IP地址。
2.与IP地址对应的服务器建立TCP连接,经历三次握手:SYN,ACK、SYN,ACK
3.以get,post方式发送HTTP请求,get方式发送主机,用户***,connection属性,cookie等
4.获得服务器的响应,显示页面
发表于 2015-03-03 11:01:46 回复(2)
1 查缓存
2 DNS解析
3 获取ip
4 建立tcp连接
5 发http数据
6 接受http数据并解析
7 close
发表于 2014-11-30 12:34:21 回复(0)

1.       我们输入一个域名: www.taobao.com  

2.       浏览器查找浏览器缓存,如果有域名的 IP 地址则返回,如果没有继续查找;

3.       系统查找系统缓存,如果有域名的 IP 地址则返回,如果没有继续查找;

4.       路由器查找路由器缓存,如果有域名的 IP 地址则返回,如果没有继续查找;

5.       本地域名服务器采用迭代查询,它先向一个根域名服务器查询;

6.       根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器 dns.com IP 地址;

7.       本地域名服务器向顶级域名服务器 dns.com 进行查询;

8.       顶级域名服务器 dns.com 告诉本地域名服务器,下一次应查询的权限域名服务器 dns.baidu.com IP 地址;

9.       本地域名服务器向权限域名服务器 dns.baidu.com 进行查询;

10.   权限域名服务器 dns.baidu.com 告诉本地域名服务器,所查询的主机 www.baidu.com IP 地址;

11.   本地域名服务器最后把查询结果告诉主机;

12.   主机浏览器获取到 Web 服务器的 IP 地址后,与服务器建立 TCP 连接;

13.   浏览器所在的客户机向服务器发出连接请求报文;

14.   服务器接收报文后,同意建立连接,向客户机发出确认报文;

15.   客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;

16.   此处客户机与服务器之间的 TCP 连接建立完成,开始通信;

17.   浏览器发出取文件命令: GET

18.   服务器给出响应,将指定文件发送给浏览器;

19.   浏览器释放 TCP 连接;

20.   浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;

21.   服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;

22.   服务器数据传输完毕后,向客户机发送连接释放报文;

23.   客户机接收到报文后,发出确认,然后等待一段时间后,释放 TCP 连接;

24.   浏览器显示页面中所有文本。

 

发表于 2016-12-18 11:07:33 回复(0)
浏览器收到键盘事件(键盘的硬件部分不管,内存内数据的读写不管, 总线的控制不管,时间片处理调度不管)
处理地址栏数据
封装GET方法的HTTP请求
投递至操作系统
检查系统dns设置
开始征询www.taobao.com的ip(不考虑缓存)
封装为IP[TCP[HTTP]]包向下投递
根据网关设置封装为frame向下投递
发送到网卡设备缓存
网卡封装为物理层信号发送(不考虑媒介)
路由收到解析到ip包
并根据路由表向下一个路由派送
投递至服务器
服务器开始解析HTTP包(物理层到这里不管)
根据Header中Host判定服务器转发规则进行转发(具体的反向***不管)
Webserver收到请求(socket到通知部分不管)
Webserver根据Cookie 进行判断登陆状态(具体的数据库缓存使用不管)
根据请求GET / 分发至对应的处理程序
附带一个session的Set-Cookie 
程序生成HTTP完整的页面
标记NoCache的Header
Webserver写入网络
数据开始回传(不管这部分)
http解析开始(包括HTTP协议解析, chunk, 续传, .....  )
用户浏览器收到第一个GET的response
保存SetCookie中的session
HTML解析开始生成dom 
解析到JS并加载(具体加载不管)
解析到CSS并加载(具体加载不管)
解析title并标记浏览器标题(系统的刷新流程不管)
解析meta标记(具体处理不管)
解析body
解析基本的html标签并显示(具体的渲染部分,Flash等不管)
js加载完毕的进行js引擎的处理
css加载完毕的马上应用到dom结构中
加载完毕
触发document的ready事件
驱动之前注册的js脚本
触发ajax(如果有)等部分继续进行加载(之后不管了)
(屏幕的硬件刷新不管)

编辑于 2015-01-29 16:59:22 回复(0)
1、根据域名查询域名的IP。浏览器缓存->操作系统缓存->本地域名服务器缓存->域名服务器。

2、得到IP后发起基于TCP的HTTP请求。如果浏览器存储了该域名下的cookie,那么会把cookie放入HTTP请求头里。

3、TCP被包装为IP包,通过网络(可能经过很多路由器、交换机)发送到IP地址对应的服务器。这个服务器可能只是一个反向***服务器,如果是,则HTTP请求被转交给内网中真实的某一个服务器(可能有多个服务器)。

4、服务器分析HTTP请求,生成HTTP响应(可能是HTML、图片等)后,将响应发送给客户端浏览器。

5、浏览器得到响应后,根据响应内容显示结果。如果响应的是图片,则将图片”画“在浏览器页面上;如果是HTML,则渲染HTML并”画“在浏览器页面上,在分析HTML时,若发现引用了其他资源,例如css、图片等,则发起HTTP请求,得到响应资源。
发表于 2015-05-09 08:24:03 回复(0)
前提:我现在使用的是校园网
如果我在很短的时间之前就访问过该网站,浏览器会首先访问我浏览器缓存中的内容,如果缓存中内容已经过期,则会将www.taobao.com的请求通过校园***服务器发送到最近的一个 DNS服务器上,通过服务器来解析其IP地址,将IP地址发送给我的主机,主机还是将IP请求通过校园***服务器发送给网关路由器,该路由器检索自己的路由表,将此IP请求发送到下一个路由器,直到此请求被发送到淘宝服务器上,淘宝服务器将我所申请的网页通过http协议传回我的主机。
发表于 2015-04-04 10:24:57 回复(1)
主机DNS Service识别域名.com,主机与远程服务器通过HTTP协议链接,服务器给主机分配一个IP,主机通过UDP协议发出请求,服务器通过TCP给主机传输数据。
发表于 2015-03-22 22:15:22 回复(0)
输入网址并按下回车以后,浏览器先调去计算机底层的方法去DNS服务器查询www.taobao.com的ip地址。得到IP地址后,浏览器和服务器通过TCP建立链接,在TCP链接上用HTTP协议发送GET请求给服务器。后面的以后再写。
发表于 2014-09-24 23:34:29 回复(0)
1、根据域名查询域名的IP。浏览器缓存->操作系统缓存->本地域名服务器缓存->域名服务器。

2、得到IP后发起基于TCP的HTTP请求。如果浏览器存储了该域名下的cookie,那么会把cookie放入HTTP请求头里。

3、TCP被包装为IP包,通过网络(可能经过很多路由器、交换机)发送到IP地址对应的服务器。这个服务器可能只是一个反向***服务器,如果是,则HTTP请求被转交给内网中真实的某一个服务器(可能有多个服务器)。

4、服务器分析HTTP请求,生成HTTP响应(可能是HTML、图片等)后,将响应发送给客户端浏览器。

5、浏览器得到响应后,根据响应内容显示结果。如果响应的是图片,则将图片”画“在浏览器页面上;如果是HTML,则渲染HTML并”画“在浏览器页面上,在分析HTML时,若发现引用了其他资源,例如css、图片等,则发起HTTP请求,得到响应资源。
发表于 2015-04-01 17:15:56 回复(0)
自己的一些阅读和学习的总结,不一定正确,谢谢指教呀:
1. 域名解析:浏览器进行域名解析,先在浏览器缓存里找,找到其IP就返回,找不到就继续去本机系统缓存里找,找到其IP就返回,再找不到就向路由器发送一个DNS查询请求报文(一般是递归查询),这时候路由器会在路由器缓存里找,找到其IP就向用户端发送对应的DNS回答报文,找不到的话,路由器会作为一个新的DNS客户 向ISP(即所谓的本地?)DNS服务器发送一个DNS查询请求报文(一般是递归查询),这时候ISP会在自己的DNS server里找域名的IP,找到了便发送一个DNS回答报文把IP地址返回给路由器,找不到的话,就会依次向根DNS服务器(或本区主DNS服务器?)、顶级域名服务器权威域名服务器发出迭代查询,最后返回所需的IP地址给ISP DNS server。
(其中root name server会返回TLD name server的IP让ISP server去这个服务器这里询问,而TLD name server会返回Authoritative name server的IP让ISP server去这个服务器询问)
最终ISP name server从权威域名服务器得到IP地址后,会给最开始的客户端的路由器发送DNS回答报文,最后路由器发送DNS回答报文给最开始的客户端,浏览器最终获得IP。

2. 建立TCP链接:浏览器得到该网址的IP地址之后,即得到了拥有该页面资源的web服务器的IP,浏览器所在的客户机便向该web服务器发送基于TCPHTTP GET请求报文,需要先三次握手建立TCP链接。所以客户机给web服务器发送SYN链接请求报文,web服务器回SYN ACK确认链接报文并把该HTTP需要的页面资源放进报文里一起回复,客户机再回复ACK确认报文。

3. 开始通信:浏览器收到资源(html,图片)后进行渲染,呈现画面如果发现有更多的资源需要索取,就继续发送HTTP GET,同一个TCP链接,可以持续双向通信。直到超时或客户机主动发送关闭链接FIN请求报文给web服务器,web服务器回复确认关闭 FIN ACK 报文 且同时把最后一些需要发送给客户机的资源放进报文里。web服务器再发送资源释放FIN报文给客户机,进入等待最后的关闭ACK的状态,客户机回复确认资源释放的ACK报文给web服务器,过一定的时间再关闭。服务器是比客户端稍微早关闭一些的,为的是避免服务器没有收到最后的ACK而一直处于等待状态,浪费资源,所以客户机需要等待是否有收到重复的FIN,因为web服务器没有收到ACK便会重发FIN。
发表于 2020-08-28 06:35:36 回复(0)
yql头像 yql
http://blog.jobbole.com/84870/
发表于 2015-09-22 18:01:32 回复(0)
<p style="color:#666666;"> 首先是查找<span style="color:#3333FF;">浏览器缓存</span>,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不等。 </p> <p style="color:#666666;"> 如果没有找到对应的记录,这个时候浏览器会尝试调用<span style="color:#3333FF;">系统缓存</span>来继续查找这个网址的对应DNS信息。 </p> <p style="color:#666666;"> 如果还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的<span style="color:#3333FF;">路由器缓存</span>上查找记录,路由器一般也存有DNS信息。 </p> <p style="color:#666666;"> 如果还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商,就是那些拉网线到你家里的运营商,中国电信中国移动什么的),ISP也会有相应的<span style="color:#3333FF;">ISP DNS服务器</span>,一听中国电信就知道这个DNS服务器的规模肯定不会小,所以基本上都能在这里找得到。题外话:会跑到这里进行查询是因为你没有改动过"网络中心"的"ipv4"的DNS地址,万恶的电信联通可以改动了这个DNS服务器,换句话说他们可以让你的浏览器跳转到他们设定的页面上,这也就是人尽皆知的DNS和HTTP劫持,ISP们还美名曰“免费推送服务”。强烈鄙视这种霸王行为。我们也可以自行修改DNS服务器来防止DNS被ISP污染。 </p> <p style="color:#666666;"> 如果还是没有的话, 你的ISP的DNS服务器会将请求发向<span style="color:#3333FF;">根域名服务器</span>进行搜索。根域名服务器就是面向全球的顶级DNS服务器,共有13台逻辑上的服务器,从A到M命名,真正的实体服务器则有几百台,分布于全球各大洲。所以这些服务器有真正完整的DNS数据库。如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。或者卖域名的把它回收掉了(通常是因为欠费)。 </p> <p style="color:#666666;"> 这也就是为什么打开一个新页面会有点慢,因为本地没什么缓存,要这样递归地查询下去。 </p> <p style="color:#666666;"> 多说一句,例如"mp3.baidu.com",域名先是解析出这是个.com的域名,然后跑到管理.com域名的服务器上进行进一步查询,然后是.baidu,最后是mp3, </p> <p style="color:#666666;"> 所以域名结构为:三级域名.二级域名.一级域名。 </p> <p style="color:#666666;"> 浏览器终于得到了IP以后,浏览器接着给这个IP的服务器发送了一个http请求,方式为get,例如访问nbut.cn </p> <p align="center" style="color:#666666;"> <img alt="" src="http://img.blog.csdn.net/20140825111343428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFjdHJveA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> </p> <p style="color:#666666;"> 这个get请求包含了主机(host)、用户***(User-Agent),用户***就是自己的浏览器,它是你的"***人",Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。其他的顾名思义就行了。还有一个重点是Cookies,Cookies保存了用户的登陆信息,在每次向服务器发送请求的时候会重复发送给服务器。Corome上的F12与Firefox上的firebug(快捷键shift+F5)均可查看这些信息。 </p> <p style="color:#666666;"> 发送完请求接下来就是等待回应了,如下图: </p> <p align="center" style="color:#666666;"> <img alt="" src="http://img.blog.csdn.net/20140825112825079?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFjdHJveA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> </p> <p style="color:#666666;"> 当然了,服务器收到浏览器的请求以后(其实是WEB服务器接收到了这个请求,WEB服务器有iis、apache等),它会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code,2开头如200表示一切正常,3开头表示重定向,4开头,如404,呵呵。响应就是具体的页面编码,就是那个&lt;html&gt;......&lt;/html&gt;,浏览器先读了关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。在下一次CF的时候(不是穿越火线,是http://codeforces.com/),由于经常难以承受几千人的同时访问,所以CF页面经常会出现崩溃页面,到时候可以点开火狐的firebug或是Chrome的F12看看状态,不过这时候一般都急着看题和提交代码,似乎根本就没心情理会这个状态吧-.-。 </p> <p style="color:#666666;"> 如果是个静态页面,那么基本上到这一步就没了,但是如今的网站几乎没有静态的了吧,基本全是动态的。所以这时候事情还没完,根据我们的经验,浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分的显示,直到完全显示,最后标签栏上的圈圈就不转了。 </p> <p align="center" style="color:#666666;"> <img alt="" src="http://img.blog.csdn.net/20140825114441048?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFjdHJveA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> </p> <p align="left" style="color:#666666;"> 这是因为,主页(index)页面框架传送过来以后,浏览器还要继续向服务器发送请求,请求的内容是主页里面包含的一些资源,如图片,视频,css样式等等。这些"非静态"的东西要一点点地请求过来,所以标签栏转啊转,内容刷啊刷,最后全部请求并加载好了就终于好了。 </p> <p align="center" style="color:#666666;"> <img alt="" src="http://img.blog.csdn.net/20140825115321699?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFjdHJveA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> </p> <p style="color:#666666;"> 需要说明的是,对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。缓存的内容通常也不会保存很久,因为难保网站不会被改动。 </p> <div> <br /> </div>
发表于 2015-08-21 08:43:09 回复(0)
看看怎么样。没看到垃圾
发表于 2015-05-12 14:32:24 回复(0)
按回车键之后
1、域名会转化成IP地址,具体过程:首先在本机上查看有无该域名对应的IP,如果有转化;如果没有则访问域名服务器进行转化。
2、然后通过路由找到IP地址所对应的服务器,具体过程:寻找合适的路由器,进行路由,在一个路由器中,查看路由表,获得路由路径,不断的进行存储转发过程,最终达到服务器。
3、服务器对本机的请求作出相应。
发表于 2015-03-31 09:22:49 回复(0)
mqh头像 mqh
首先进行DNS域名解析,从域名服务器获取IP地址,然后根据IP地址进行tcp进行三次握手,握手成功后进行数据传输,然后断开tcp链接。
发表于 2014-12-27 16:27:47 回复(0)
流头像
首先浏览器相当于一个客户端,在应用层使用HTTP协议,通过传输层TCP协议进行连接,在客户端首先查找ARP表,如果可以解析则通过网络(交换机、路由器(网关))与服务器进行三次握手连接,然后通过UDPhuoTCP进行数据传输。
发表于 2014-12-13 12:24:57 回复(0)
发表于 2014-12-13 02:48:41 回复(0)
http协议,tcp协议,UDP协议,session cookie会话,一个请求发出,建立了一个session 会话,创建session id ,携带着数据 传到服务器端,中间会有过滤器,拦截器对信息过滤,然后最终发送到服务器端,最后访问数据库,然后由服务器端携带着响应,通过拦截器,过滤器,返回到客户端。将cookie信息存入硬盘
发表于 2014-12-09 22:25:03 回复(0)
a
发表于 2014-12-02 21:31:45 回复(0)
壕头像
不会
发表于 2014-12-01 19:20:29 回复(0)