从输入域名,到拿到首页的所有细节过程
深刻理解输入域名,到拿到首页的所有细节过程 以访问百度为例
目录
从输入url到页面展示总共经过如下几个过程:
- 域名解析(获得IP地址)
- 向WEB服务器发送HTTP请求
- 服务器处理请求
- 服务器返回HTTP响应
- 浏览器显示页面信息
一、输入地址
网址,即URL,被解析为若*分。例如对于www.baidu.com,实际上它的完整形式是:http://www.baidu.com:80/。
其中包括了以下部分:
协议:http
域名:www.baidu.com。其中baidu.com是百度的域名,www是这个域名下的二级域名。
端口:80
路径:/
当输入url地址后,浏览器已经在智能匹配地址了,会从历史记录、书签或缓存中查找,如果找到了,会从缓存中调出页面显示出来,在你还没有按“enter”之前将页面显示出来
二、浏览器查找域名的IP地址
浏览器查找域名的IP地址按照以下几个步骤进行(这是你输入url,按了enter之后):
首先会在浏览器的缓存中查找是否有该域名对应的IP地址,如果有,则直接返回该IP地址;如果没有,则查找本地硬盘上的hosts文件中是否有,如果有,则返回对应的IP地址;如果没有,则查找路由器缓存中是否有对应的IP地址,如果有,则返回;
如果在浏览器缓存中、hosts文件中、路由器缓存中都没有找到ip地址,则浏览器会发起一个DNS请求到本地DNS服务器,本地DNS服务器一般是由你的网络接入服务器商提供,如:电信、移动;
DNS请求到达本地DNS服务器后,本地DNS服务器会先在自己的缓存中查找,如果找到了就返回找到的IP,这个过程是以递归的方式进行的;如果没有,则本地DNS服务器继续向根DNS服务器发起请求;
根DNS服务器并没有记录域名与IP的对应关系,而是告诉本地DNS服务器,可以到哪个*域名服务器上 查询,并给出该*域名服务器的地址,此过程是以迭代的方式进行的;
本地DNS继续向*域名服务器发出查询请求,*域名服务器接收到请求后,会告诉本地DNS到权限域名服务器上去查询;
本地DNS继续向权限域名服务器发出查询请求,权限域名服务器查询到域名对应的IP后,将IP地址返回给本地DNS,本地DNS接收后将其保存到自己的缓存中,以备下次查询,提高查询速度;至此,一个IP地址的查询就此结束;
DNS解析是一个递归查询的过程:
注意:DNS域名解析是以递归的方式进行的
关于DNS
1. 什么是DNS
DNS(domain name system,域名系统):因特网上域名和IP地址相互映射的分布式数据库;简单理解就是域名与IP地址的对照表,因为域名(如:www.google.com)对于我们而言,更便于记忆,但是机器却不擅长这种表达方式,因此需要将域名转换为IP地址,以便于机器识别, 这便有了DNS。
2. 根域名服务器
根服务器是架设互联网的必须设施,管理互联网的主目录,全球共有13套根域名服务器
3. 递归查询
客户端主机向本地域名服务器的查询是递归查询;所谓递归查询:客户端主机查询的域名地址无法在本地域名服务器中找到,因此本地域名服务器就以DNS客户端的身份向其他根域名服务器发起请求,进行查询,而不是让客户端主机去一直查询;
递归查询的结果要么是返回的IP地址,要么是报错,表示无法查询到地址;
4. 迭代查询
本地域名服务器向根服务器、*域名服务器和主机域名服务器发起的查询请求就是迭代的过程,如:本地域名服务器向根服务器发起查询请求,根服务器中会告诉本地域名服务器:”我这里没有你要找的内容,你去*域名服务器上找吧“,并将*域名服务器的地址返回给本地域名服务器,本地域名服务器接收到后,继续向*域名服务器发送请求;*域名服务器要么返回ip地址,要么告诉本地域名服务器下一步要向哪个权限域名服务器发送请求,直到找到ip地址或找不到ip返回报错信息,然后信息返回给客户端主机;递归过程:主机→本地DNS服务器→其他DNS服务器(如:我要找一个苹果吃,找到了A,问A有没有,A说我帮你去找B,B可能有,果真B有,然后B将苹果给了A,A再将苹果给我,这就是递归)
迭代过程:本地DNS服务器→根服务器,本地DNS服务器→*域名服务器,本地DNS服务器→权限域名服务器;(如:我要找一个苹果,找到了A,A说我也没有,B可能有,你去找B吧;我又找B,B说我也没有,你去找C吧,我又去找C,终于找到了苹果,这就是迭代的过程)迭代查询和递归查询:
如果DNS失败,浏览器会提示域名找不到或者DNS错误。
至此,浏览器知道了网址的对应服务器IP地址和端口,然后就通过TCP协议发起网络请求。但是发起的是什么请求取决于网址的协议是HTTP还是HTTPS(这里解释HTTP协议过程)。
三、浏览器向WEB服务器发送HTTP请求
拿到域名对应的IP地址之后,浏览器会以一个随机的端口(1024~65535)向服务器(Niginx, Apache等)的WEB程序80端口/8080端口(HTTP协议使用80端口/8080端口,HTTPS使用443端口)发起TCP连接请求。连接请求到达服务器端后,通过网卡,进入到内核的TCP/IP协议栈,还有可能要经过防火墙,进入WEB程序,最终建立TCP/IP连接。
建立连接后,会发送一个HTTP请求,HTTP请求包含的信息可以分成如下三部分:HTTP是基于文本的协议,客户端和服务器一问一答,有固定格式。包括HTTP Header和Boby。头部使用换行符进行分隔字段,一行一个字段。字段中使用冒号:分隔Key和Value。例如:
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.14 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cookie: BAIDUID=F27F5856EB13162499CC2DB7DC4FD050:FG=1;
最重要是开始的几行:
- GET / HTTP/1.1:使用GET动作(另外还有POST,PUT等),获得/路径的内容(还记得网址里最后的/么),采用HTTP/1.1协议
- Host: www.baidu.com:主机头为www.baidu.com。
- Connection: keep-alive:结束后保持网络连接,以节省TCP建立的开销。
- User-Agent:报告浏览器参数。
- Accept:浏览器能接受的应答格式。
四、浏览器的永久重定向响应
拿访问百度为例说明
我输入的网址是 http://baidu.com服务器接收到请求后,给浏览器响应301永久重定向,浏览器转而访问http://www.baidu.com而不是http://baidu.com;
1.什么是重定向?
- 简单理解就是将我输入的网址引向另一个网址;
2.为什么产生重定向?
- 如果一个网站有两个网址,那么分配到每个网址上的搜索链接数就会减少,不利于排名
- 缓存友好型变差;因为要将同一个网站的多个地址均保存到缓存中。
3.301和302的区别
- 共同点:都表示重定向,也就是浏览器拿到这个状态码之后,均会跳转到新的URL地址,这个地址从服务器响应的Location中获得
- 不同点:301表示永久重定向,也就是原网址资源不可用了,搜索引擎在抓取新内容的同时,也会将旧网址重定向到新网址。
- 302表示旧地址A的资源还在(仍然可以访问),这个重定向只是暂时的从地址A跳转到地址B,搜索引擎在抓取新内容而保存旧的网址
4.重定向的原因
- 网站调整(如改变目录结构)
- 网页被移到另一个网址
- 网页的扩展名改变(如需要把.php改为html)
- 如果存在上述原因,而不进行重定向,那么访问者访问的是旧的网址,要么不能得到网站的最新信息,要么出现404找不到主页的错误,访问量就被白白浪费掉了;再者,当一个网站申请了多个网址时,它们都需要导向主站点,这时候也需要用到重定向
5.什么时候进行301或302的跳转
- 当网站只是临时的移到另一个新的位置,可以使用302;当使用301时,说明原来的网址已经被移除不存在了。
五、服务器处理请求
经过以上层层步骤之后,我们的请求最终到了服务器,服务器是如何处理请求?
后端服务器从固定的端口接收到TCP报文后,开始对TCP报文进行处理,对HTTP协议进行解析,然后将相应的数据封装为HTTP Request对象,供上层使用。
对于大型的网站,为了防止访问量过大对应用服务器的冲击,使得应用服务器挂掉,所以一般都会设置反向代理服务器(如:Nginx),用户发送的请求并不是直接进入到应用服务器,而是会先到达反向代理服务器,然后由反向代理服务器根据实际情况将用户请求传递给某个应用服务器,然后再将结果返回给客户端;这样也可以防止一台服务器挂掉了,而不会影响到网站的正常使用。
如图所示:
通过Nginx反向代理服务器,我们的请求到达WEB服务器,服务器端脚本处理我们的请求,访问数据库,获取需要获取的内容等。
什么是反向代理服务器
客户端的本来可以直接通过HTTP协议访问应用服务器,但是网站管理员在中间添加了一个Nginx,这样客户端会先将请求发送到Nginx,Nginx请求应用服务器,然后将结果返回给客户端,Nginx就扮演着反向代理服务器器的角色。
六、服务器返回一个HTTP响应
这是百度服务器返回的Response Header。
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Mon, 13 Mar 2017 12:23:41
GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: private
Expires: Mon, 13 Mar 2017 12:23:41 GMT
Content-Encoding: gzip
应答的主要字段:
HTTP/1.1 200 OK:HTTP/1.1协议,返回状态码200,含义为请求成功完成Server:百度服务器信息
Date:时间
Content-Type:应答的格式和编码。这是和浏览器请求对应的。
Expires: 过期时间,在这个时间之前的话应答不会过期,允许浏览器进行本地缓存。
状态代码:状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。如下:
1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。
- 100 Continue
- 101 Switching Protocols
2xx:成功状态码,表示服务器已成功接收到请求并进行处理。
- 200 OK 表示客户端请求成功
- 204 No Content 成功,但不返回任何实体的主体部分
- 206 Partial Content 成功执行了一个范围(Range)请求
3xx: 重定向状态码,表示服务器要求客户端重定向。
- 301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL
- 302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源
- 303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源
- 304 Not Modified 服务器内容没有更新,可以直接读取浏览器缓存
- 307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也依赖于浏览器具体实现
4xx:客户端错误状态码,表示客户端的请求有非法内容。
- 400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解
- 401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用
- 403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因
- 404 Not Found 请求的资源不存在,例如,输入了错误的URL
5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。
- 500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求
- 503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
七、浏览器显示HTML
浏览器对返回的数据进行处理(浏览器渲染),然后显示页面
上一篇: Spring源码解析---AOP
推荐阅读