【杂谈】一个回车下去,浏览器做了什么?

前言

  在使用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 CRLF

Header1:Value1 CRLF
Header2:Value2 CRLF
....
CRLF

Body

这三大块用CRLF分隔(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方法

posted @ 2019-02-06 16:51  猫毛·波拿巴  阅读(724)  评论(1编辑  收藏  举报