【杂谈】一个回车下去,浏览器做了什么?
前言
在使用PostMan之前,自己测试Rest接口都是直接在浏览器地址栏输入URL来测试的,但是这种方法发出的请求都是Get,如果要发送POST请求只能用ajax等编程方式。有了PostMan就方便多了。某一天在输URL的时候,突然想看看浏览器到底做了什么,于是就有了下面这些内容。
概述
以下讲述的是一个请求静态网页文件的例子,该例子有以下几个过程:
1.在浏览器地址栏输入一个URL,并回车
2.浏览器利用DNS,找到域名对应的IP地址
3.浏览器与服务端建立socket连接,如果已有则无需建立
4.浏览器利用socket连接发送请求数据报
5.服务端返回响应数据报
6.浏览器渲染HTML
7.如果HTML中含有其他文件的引用,如css,js文件,那么它还会重复步骤3~6
建立Socket
要与服务端建立socket连接,浏览器要知道哪些信息呢?
- 服务器的IP地址
- 应用程序占用端口。
IP地址怎么获取?
首先你输入要访问一个网站必然有域名,有了域名必然就能找到IP地址。域名与IP地址是多对一的关系。值得一提的是,域名到IP地址的映射不一定要用到DNS,如果本地hosts文件中有相关的映射,那就不必远程查询了。
地址栏就不能直接输IP地址吗?
只要你记得住,当然可以输,还省去了解析域名的麻烦。域名的出现就是为了不用去记IP地址。例如,baidu.com 总比 xxx.xxx.xxx.xxx好记吧。
那端口呢?
端口在URL中是直接跟在IP地址/域名后面,一般是这样:
IP地址/域名:端口
比如tomcat项目就是,localost:8080/xxx
那为什么很多网站访问的时候不需要输端口?
因为默认不输入的话,会补上80端口。所以端口还是有的。
发送请求数据报
请求数据报包含哪些内容?
那就要说到数据报的结构了,HTTP请求报文分三部分,请求行(request line)、请求头(request headers)、请求实体(request body)。大概就是下面这样:
Method Uri Protocol/version CLRF
Header1:Value1 CLRF
Header2:Value2 CLRF
....
CLRF
Body
这三大块用CLRF分隔(CLRF就是回车+换行,即”\r\n”)。
接收响应数据报
200、500等这些响应结果是怎么回事?
你能收到这些响应结果,至少网络是通的。需要明确一点的是,这些状态码是服务端写好,然后发给你的。请求正常就是200,请求参数导致服务程序出现异常就是500等等。这些状态码很多,有兴趣的可以去看Http协议说明。
网页数据在哪里?
网页文件的内容都放在响应报文的body中,浏览器会把网页内容渲染到页面上。
提示下载文件是怎么回事?
这其实说的是响应报文对于body内容的处理方式,默认情况下是直接在网页上展示的。这主要由响应头中的Content-Disposition值决定,默认是inline,也就是直接在网页上展示。如果是需要下载的话,那就是attachement;filename=xxx.如果浏览器接收到这样的响应报文,会弹出下载提示框,让用户选择保存位置。
断开Socket连接
什么时候断开连接?
实际上,Http协议到了1.1之后,默认维持的是长连接,也就是不会关闭。因为如果每个请求都建立新的连接的话,握手的开销不可小觑。现在基本上使用的都是1.1版本。
怎么断开连接?
socket连接只要双方任何一方关闭即可断开连接,所以可以是浏览器或服务端任意一方关闭连接。
浏览器 => 关闭浏览器应用 Or 提示服务端,让服务端关闭,具体方式为添加请求头Connect:close
服务端 => 编程调用close方法