一次URL输入域名按下回车到底发生了什么?

1、 浏览器的url输入栏发起一个请求,浏览器首先会看自己缓存中有没有对应的ip地址,如果有的话

就直接去访问;如果没有

2、 浏览器会去查看本地的hosts文件,看看有没有和这个域名匹配的ip地址,如果有的话就直接用

hosts文件的ip地址;

3、 如果本地的hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务

器 ,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,

此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

4、 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域

服务器上去继续查询,并给出域服务器的地址

5、 域服务器最终会返回给本地的DNS服务器一个具体的ip地址;然后本地的DNS服务器把这个具体

的ip地址返回给浏览器,并且他自己也会把这个url请求对应的ip保存在自己本地,从而加快访问

速度;

6、 浏览器得到域名对应的ip地址后,会加上一个端口号去访问;

7、 一般的服务器网站都会通过反向代理来负载均衡用户们的请求服务,

这里拿Nginx举例,请求来到Nginx后,Nginx会通过负载均衡的算法,把请求分发到服务器集群

上的任意一台服务器,

8、 请求会申请和服务器建立连接这个连接的过程就是我们常说的三次握手;

9、 建立连接后 Java的servlet容器会去接受这个请求,接受后servlet容器会解析

这个请求,与此同时容器会创建一个servlet实例,也就是实例化;同时还会去创建

servletRequest、servletResponse;servletConfig对象

10、实例化对象之后会马上调用servlet的init方法去初始化这个servlet对象,init方法只会调用一次;

在初始化的时候,容器会给这个servlet实例创建一个ServletConfig对象,这个ServletConfig会从

web应用中的配置文件(web.xml)读取配置信息,得到servlet初始化的时候所需要的参数信

息;

11、在初始化失败的时候servlet会得到500的错误,也就是服务器内部错误;

如果没有找到初始化参数的话,会报404错误;

12、用户的请求通常是这个情况:http://hostname: port /contextpath/servletpath

hostname 和 port 是用来与服务器建立 TCP 连接,而后面的 URL 才是用来选

择服务器中那个子容器服务用户的请求。

服务器会通过org.apache.tomcat.util.http.mapper来帮URL找到准确的servlet容

器;我们的springMVC框架中有一个dispatcherServlet去继承HTTPServlet,

得到用户的请求信息,比如GET,POST 还有附带的一些头信息,例如账号密码

然后再进行业务的处理,最终将结果返回给前端进行处理,按页面原路返回给

浏览器;

13、session和cookie;

情况一:如果浏览器支持Cookic的话,Tomcat这类的服务器就会去

解析Cookic得到一个sessionID,得到这个sessionId后,服务器端会创建一个

HttpSession对象,

情况二: 触发 request. getSession() 方法 的时候,如果Session ID 还没有对

应的 HttpSession 对象那么就创建一个新的HttpSession ,HttpSession 这个

对象会被 org.apache.catalina. Manager 放到 sessions 容器中保存,

,Manager 类将管理所有 Session 的生命周期,Session 过期将被回收,服务

器关闭,Session 将被序列化到磁盘等。只要这个 HttpSession 对象存在,用户

就可以根据 Session ID 来获取到这个对象,也就达到了状态的保持。我们常

说的session就是这个HttpSession ;

14、经过上面的步骤,服务器收到了我们的请求,也处理我们的请求,到这一步,它会把它的处

理结果返回,也就是返回一个HTPP响应。

HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成,分别是:

l  状态行

l  响应头(Response Header)

l  响应正文

状态行:

状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

格式:    HTTP-Version Status-Code Reason-Phrase CRLF

例如:    HTTP/1.1 200 OK \r\n

-- 协议版本:是用http1.0还是其他版本

-- 状态描述:状态描述给出了关于状态代码的简短的文字描述。比如状态代码为200时的描述为 ok

-- 状态代码:状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。如下

响应正文

包含着我们需要的一些具体信息,比如cookie,html,image,后端返回的请求数据等等。

15、浏览器得到了请求的结果,就会解析HTML,CSS、JS、图片等文件了。

到这里,一次完整的请求和响应就结束了,

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏www.96php.cn

WeiPHP插件模板中快速引入公共模板文件

WeiPHP插件模板中快速引入公共模板文件,weiphp建立于onethink之上,简单修改代码,无需填写绝对路径实现轻松引入模板。记录一下,分享给需要的人。 ...

2633
来自专栏人工智能LeadAI

深入理解并发/并行,阻塞/非阻塞,同步/异步

1、阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: ? 进程状态 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个...

4014
来自专栏IT技术精选文摘

Nginx核心模块常用指令

配置示例 user www www; worker_processes 2; error_log /var/log/nginx-error.log info; ...

2345
来自专栏史上最简单的Spring Cloud教程

Openresty最佳案例 | 第1篇:Nginx介绍

Nginx 简介 Nginx是一个高性能的Web 服务器,同时是一个高效的反向代理服务器,它还是一个IMAP/POP3/SMTP 代理服务器。 由于Ngin...

3707
来自专栏smy

Java JDK安装小谈

我用的是当前最新版jdk-7u10-windows-i586。 安装时有两个需要选择的安装路径,一个是JDK一个是JRE。两个最好安装在同一文件夹下。 jr...

3415
来自专栏Java 源码分析

Redis基本入门

1.Redis简介     Redis 是一种基于内存亦可持久化的日志型,Key-Value 数据库。可持久在于他的部分数据是存放在内存上,而当数据库重启以后他...

39410
来自专栏抠抠空间

爬虫之FileCookieJar

1740
来自专栏Janti

Http学习笔记

   在HTTP工作开始前,浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成的。HTTP是比TCP更高层次的应用层协议,根据规则,只有底层协议建立...

1142
来自专栏pangguoming

整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大...

2486
来自专栏大数据实战演练

ambari-web/admin 前端二次开发

ambari-web可以单独编译,用来修改ambari UI页面。采用ember.js(版本: v1.0.pre)作为前端MVC框架和NodeJS相关工具,用h...

3251

扫码关注云+社区

领取腾讯云代金券