本帖最后由 michael_llh 于 2017-4-23 18:44 编辑
在我们介绍HTTP之前我们先大概来了解一下一个WEB的访问流程,从而对浏览器访问到WEB的一个流程有一个清晰的了解。
首先,在访问一个WEB页面的时候,我们需要在浏览器中输入要访问的站点域名,比如说www.baidu.com,然后后面发生了什么呢?首先这请求会先去访问DNS服务器,DNS的全程是domain name system,翻译过来就是域名系统,它提供的功能是完成一个域名到IP地址的转化。这里有引出一个问题,IP地址是什么?
IP地址,internet protocol address,网际协议地址,它就有点类似一个身份证,给每台电脑给定了一个标签,每个人都是唯一不同的(有歧义)。现在的IP地址分为两类,IPV4和IPV6,IPV4是用32位表示,而IPV6是用128位表示。目前还是以IPV4为主,慢慢向IPV6过渡。对于IPV4的表示形式基本都是以点分十进制的方式展现的,比如说10.3.232.121这样。那么对于每一台连接到互联网的电脑都有一个自己的IP地址。
这里我们大概说一下为什么有IPV4和IPV6,IPV4是用点分十进制表示,每个一个点分之中的数字可以取从0~255中间的任意一个数值,假设我们将这些IP地址全部用于互联网的每一台电脑,最多互联网上面可以连接2564=4294967296台主机,大概是42亿,这是最理想的情况,但是其中我们还对这些地址进行了细分,私有IP地址段是不对外的,去掉说环路测试IP:127.0.0.1,等等,所以实际上只有25.68亿个地址是可以直接在互联网上使用的,再加上现在越来越多的互联网设备,以及智能家居设备的引入,IP地址资源越发匮乏,所以引入了IPV6来解决IP地址不够用的情况。这里也只是简单介绍一下关于IP地址的一些东西,想深入了解的话大家还需要多查阅些资料和书籍。
现在我们明白了IP地址对于访问的WEB的重要性了,所以当我们从DNS服务器那边拿到了www.baidu.com的服务器地址,这个时候我们就可以去访问WEB服务器向它发起请求来获取baidu的页面。 现在大家可以大概理解一个WEB的访问流程了吧,但是这个又有一个问题,既然说IP地址是访问一个服务器的关键,但是浏览器第一次需要获取www.baidu.com的IP地址时需要访问DNS服务器,那DNS服务器的地址是哪里来的呢,这就需要引入DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)这个服务器可以帮你设置你电脑的IP啊,包括DNS的IP地址。
上面我们是简化了WEB的访问流程,最初的WEB是以这样的形式,但是现在WEB访问是复杂非常多了。但中心思想是这样的方式。
现在我们要引入今天要谈的http了。http的全称是HyperText Transfer Protocol,超文本传输协议,这个协议的提出就是为了提供和接收HTML界面,通过这个协议在互联网上面传出web的界面信息。
那么具体什么是HTTP协议呢? 下面我们看一个具体的例子,这里我们需要使用google的chrome浏览器,然后我们按F12进入chrome的开发者工具。 然后我们选择NetWork标签栏: 在这个选项卡中我们可以看到很多获取的文件信息 我们看一下请求头,这个已经是chrome帮我们分类整理过的的Request Header。 选择Request Headers旁边的view source按钮,就可以查看请求头的源码是什么了。 好了,到这里我们就可以看到HTTP协议的应用了,上面的请求源码就是按照HTTP协议来写的,同样的大家可以自己亲手试试,自己看下Response的返回源码是什么,这里我们先直接给大家贴出来了。
经过上面的时间我们知道了浏览器是通过HTTP协议来和WEB服务器进行通信的,当我们请求一个WEB页面的时候,由浏览器按照HTTP协议向服务器发送一个请求说,我要看这个界面,你发给我,然后服务器给浏览器返回一个Response,浏览器根据这个判断返回的页面对不对,对的话就显示出来。其中的HTTP协议就相当于一种语言,用于WEB服务器和浏览器之前的语言,没有这个语言,两个人就听不懂,不知道你要干什么,而我们就是定义了HTTP协议这个语言来解决双方的沟通问题。
现在我们需要大概来谈一下HTTP协议的格式问题,因为我们可能后面是需要用到这个东西的。 HTTP协议的两个过程,Request和Response,两个都有各自的语言格式,我们看下是什么。 请求报文格式:(注意这里有个换行) <method> <request-URL> <version> <headers>
<entity-body> 响应报文格式:(注意这里有个换行) <version> <status> <reason-phrase> <headers>
<entity-body> 好了我们大概来解释一下: 方法method: 这个很重要,比如说GET和POST方法,这两个是很常用的,当然还有其他的,这里暂且不介绍,GET就是获取什么内容,而POST就是向服务器发送什么数据。 请求URL: 这个是什么意思呢,这里我们先说明一下,当我们访问WEB的时候是访问主机的什么内容。比如你有一个web服务器,那么这个服务器会设置一个你主机的本地目录地址,比如说D:/web这样,Linux底下可能是/usr/www/html或者其他的,那么这个对应的就是我们本地主机下一个目录,当我们在WEB设置了这个目录为WEB的地址,那么当我们去访问WEB的时候实际访问的就是这个地址,比如你在D:/web下面放一个index.html,你的IP地址(10.123.231.22)或者域名(www.myweb.com),我们在浏览器访问10.123.231.22/index.html或者www.myweb.com,对应的就是访问到这个目录下的index.html文件,可以明白了吗。那么这里填写的URL是不包含IP地址或者域名的,所以我们一般看到的就是“/”。 版本version: 格式是HTTP/<major>.<minor>这样的格式,比如说HTTP/1.1.这个版本代表的就是我们使用的HTTP协议的版本,现在使用的一般是HTTP/1.1 状态码status: 状态码是三个数字,代表的是请求过程中所发生的情况,比如说200代表的是成功,404代表的是找不到文件。 原因短语reason-phrase: 是状态码的可读版本,状态吗就是一个数字,如果你事先不知道这个数字什么意思,可以先查看一下原因短语。 首部header: 注意这里的header我们不是叫做头,而是叫做首部。可能有零个首部也可能有多个首部,每个首部包含一个名字后面跟着一个冒号,然后是一个可选的空格,接着是一个值,然后换行。 实体的主体部分entity-body: 实体的主体部分包含一个任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时候只是一个空行加换行就结束了。
这些内容大家作为了解,没有必要去死记,实在不记得可以记得去哪里查就可以了。
下面我们举个简单的例子:
请求报文: GET /index.html HTTP/1.1 Accept: text/*
响应报文: HTTP/1.1 200 OK Content-type: text/plain Content-length: 3
Hi!
当然这里面还有很多的内容,如果大家想深入学习HTTP的话我在后面上传了一份HTTP权威指南,如果有耐心过一遍的话应该可以理解的比较深刻,如果可以的话。那么我们就先介绍到这里,如果有需要用到深入的知识,后续会补充这方面的知识的。Chrome的F12调出的调试工具对于WEB开发是非常好用的,建议大家自己尝试玩一玩。
因为论坛上传限制。PDF文件有点大,所以放到网盘了: (有失效可以回复提醒更新)
|