前端填坑之重谈HTTP协议

从用户在浏览器地址栏输入域名敲回车显示我的个站首页,从敲击回车到完全将页面显示出来,浏览器和服务器做了哪些事情。

这是个说简单也简单,说复杂也复杂的过程,我打算将他分成两个部分来写:

  • 浏览器发送请求到服务器响应请求,再到浏览器接收请求这一过程为第一部分。
  • 浏览器接收到请求到完整显示出页面这一过程浏览器做了哪些事情为第二部分。

第一部分可以叫做HTTP协议,第二部分叫做浏览器对页面的解析与渲染,本篇为第一部分——介绍HTTP协议。

概述

当用户在地址栏输入合法的网址后,浏览器首先会解析主机地址,比如使用帅华君的个站的文章列表页面:

http://www.shuaihua.cc/article/

浏览器会解析主机地址,解析为 www.shuaihua.cc ,随后会到hosts文件中查找该主机地址对应的IP地址(下面是帅华君希望hosts文件的部分内容截图)。

上图说明:windows系统中存储域名与IP地址对应关系的hosts文件

如果hosts文件中没有找到 www.shuaihua.cc 对应的 IP地址,则浏览器会到专门的DNS服务器查询 www.shuaihua.cc 对应的IP地址,这一个DNS服务器查询的过程也是可以优化的。

假设浏览器从DNS服务器获取到 www.shuaihua.cc主机名对应的IP地址,则立即就向该IP发出请求(域名是方便普通用户便于记忆产生的,不需要用户记住一连串毫无规律的IP地址),所以用户可以直接将IP地址输入到浏览器的地址栏。

浏览器向该IP地址发送请求会携带一些信息,这些信息请求HTTP请求信息,这里推荐一款HTTP请求抓包工具 httpwatch,它能够捕获浏览器向指定IP发送请求的信息和响应信息。

不过chrome和其他浏览器已经有了面向开发者的控制台,也可以利用开发者工具查看浏览器的请求消息,随手一抓:

服务器接收到请求后会对根据自身的一套逻辑,提取需要的数据,并对请求头进行解析,这要根据服务器的web服务来定,不同的运行环境的操作会有不同。

总之,服务器对请求进行处理之后会向浏览器发送响应信息:

浏览器接收到响应信息后对其进行解析和渲染,至于渲染成html页面还是图片还是纯文本,要取决于响应信息中的 content-type 字段,上图中的 Content-Type:text/html; charset=utf-8,告诉浏览器响应的消息体需要解析成html文档,并且编码采用 utf-8。

上面粗略的串联了从用户敲击回车键到浏览器接收到响应消息这有过程,其中涉及到的细节不胜枚举,下面帅华君尽可能详尽的写其中涉及到的知识。

hosts文件的延伸

粘贴一段来自某百科对hosts文件的解释:

Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。

需要注意的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。

从上一段文字中抽取以下关键点:

  • hosts相当于一个不会自动更新的“数据可”,该数据库中的有两个字段,一个是主机名,一个对主机名对应的IP地址

  • 在用户通过浏览器发出请求时,首先会从hosts获取IP地址(默认的 127.0.0.1指的是本地IP地址),因此如果hosts被不怀好意的人修改了主机名和IP地址的对应关系,比如将某宝的主机名写入hosts文件,并将一个不是某宝的IP地址与主机名相对应,则当用户访问某宝网站时,由于系统会首先查询本地hosts文件,因此用户便在不知情的情况下进入了一个伪造的某宝界面,从而造成损失,这就是域名劫持的原理。

hosts文件的作用:

  • 加快域名解析,对于要经常访问的网站,我们可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。由于有了映射关系,当我们输入域名计算机就能很快解析出IP,而不用请求网络上的DNS服务器。

  • 方便局域网用户,在很多单位的局域网中,会有服务器提供给用户使用。但由于局域网中一般很少架设DNS服务器,访问这些服务器时,要输入难记的IP地址。这对不少人来说相当麻烦。可以分别给这些服务器取个容易记住的名字,然后在Hosts中建立IP映射,这样以后访问的时候,只要输入这个服务器的名字就行了。

  • 屏蔽网站(域名重定向),有很多网站不经过用户同意就将各种各样的插件安装到你的计算机中,其中有些说不定就是木马或病毒。对于这些网站我们可以利用Hosts把该网站的域名映射到错误的IP或本地计算机的IP,这样就不用访问了。在WINDOWS系统中,约定 127.0.0.1 为本地计算机的IP地址, 0.0.0.0是错误的IP地址。

  • 顺利连接系统,对于Lotus的服务器和一些数据库服务器,在访问时如果直接输入IP地址那是不能访问的,只能输入服务器名才能访问。那么我们配置好Hosts文件,这样输入服务器名就能顺利连接了。

  • 虚拟域名,很多时候,网站建设者需要把”软环境“搭建好,再进行上传调试。但类似于邮件服务,则需要使用域名来辅助调试,这时就可以将本地 IP 地址与一个”虚拟域名“做地址指向,就可以达到要求的效果,且无需花费。

域名劫持

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。

目前比较纯净的两个域名服务器IP地址有两个:

114.114.114.114

8.8.8.8

114.114.114.114和8.8.8.8,这两个IP地址都属于公共域名解析服务DNS其中的一部分,而且由于不是用于商业用途的,这两个DNS都很纯净,不用担心因ISP运营商导致的DNS劫持等问题,而且都是免费提供给用户使用的。

114.114.114.114是国内移动、电信和联通通用的DNS,手机和电脑端都可以使用,干净无广告,解析成功率相对来说更高,国内用户使用的比较多,而且速度相对快、稳定,是国内用户上网常用的DNS。

8.8.8.8是GOOGLE公司提供的DNS,该地址是全球通用的,相对来说,更适合国外以及访问国外网站的用户使用。

DNS对于网民来说,就跟灯塔和航海人员的道理是一样的,选择合理的DNS可以有效的帮助我们防止DNS劫持、提升上网速度等

目前世界上的大中型网站都是采用CDN做内容分发的,从而可以确保用户就近的接入、提升访问速度,不少的网站会使用DNS作为识别,因此,如果本人在北京,却选择了上海的DNS,就有可能会被网站认为是上海的用户而引导到上海的服务器上去。不过所幸,现在的不少网站都根据IP地址来引导用户的。

目前国内有不少的免费、安全而且无毒的DNS,常见的如百度提供的180.76.76.76、阿里提供的223.5.5.5和223.6.6.6、前文提到的114.114.114.114

手动设置DNS服务器

  • 点击控制面板,点击网络和internet
  • 进入后点击更改适配器设置,右键“无线网络连接”选择“属性”
  • 在:“此连接使用下列项目”中把“internet协议(TCP/IPV6)”前面的“对号”去掉
  • 双击 “internet协议(TCP/IPV4)”,出现属性对话框自动获取IP地址不变,DNS地址:选择“使用下面的DNS服务器地址”,手动填写DNS服务器地址,首选为180.76.76.76;备用为114.114.114.114(或不填)
  • 点击确定

资料来源:114.114.114.114和8.8.8.8,哪个DNS好?

HTTP消息

HTTP消息类型包括从客户端到服务端的请求消息,和从服务端到客户端的响应消息。

HTTP-message   = Request | Response     ; HTTP/1.1 messages

请求和响应使用RFC882G规范采用的通用消息格式来传输。这两种消息类型都包含 开始行、零个或一个头部名值对(众所周知的头信息),一个空行(确保该空行前面无内容)标志着头部名值对的结束,和可有可无的消息体。

/public/article/1511672270183/capter-04.jpg)

上图是请求与响应的通用HTTP消息格式,下面分别列出请求消息和响应消息的具体格式:

请求行格式:

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

请求URI格式:

 Request-URI    = "*" | absoluteURI | abs_path | authority

星号的意思是不特指具体的资源,由服务器自己实现,比如 OPTIONS 请求方法:

OPTIONS * HTTP/1.1

一个完整的请求行应该是这样的:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

请求头扮演的角色就像给函数传入的参数一样:

接收到请求消息后,服务器返回响应消息,同样遵循HTTP协议中的HTTP消息格式,响应消息格式是这样的:

请求方法

常见的请求方法有GET、POST,除此之外还有很多其他请求方法。

请求版本

共有两个版本的请求消息,分别是 HTTP/1.0 和 HTTP1.1,目前使用的是HTTP/1.1

响应状态码

最常看到的响应状态码无非有 200,304,404等屈指可数的几个,除此之外,还有很多常用和不常用的响应状态码

响应头允许服务器向客户端传递信息:

版权声明 » 自由转载-署名-非商用-相同方式共享

作者署名 » 陈帅华-探索技术艺术与国学之美

发布日期 » 2017年11月26日 星期日

我要留言