@Author:云都小生
HTTP协议概述
HTTP协议被称为超文本传输协议,是一个应用层协议,同时,也是Web的核心,规定了浏览器与万维网服务器之间的互相通信规则,它也是万维网信息交换的基础。
这个概念看起来很烦,我给它简化一下:HTTP定义了我们从浏览器与网站服务器之间的通信规则。
HTTP通常由两个程序实现,一个在客户端,一个在服务端,通过HTTP规定的格式,相互交换报文进行会话。
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。
图1表示简单的HTTP请求。
HTTP是基于TCP运输协议的应用层协议,所以使用HTTP不用关心数据是否会丢失,TCP是一个可靠的传输协议,会保证数据到达目标。
Web服务器总是打开的,每次我们访问一个网站,浏览器就会自动向这个Web服务器发送请求页面的数据包。如果Web服务器没有打开,那就GG。
HTTP还分为可持续连接和不可持续连接。当我们的客户端向服务端请求一个页面的时候,服务器响应这个页面后会马上断开连接,还是会继续保持连接一段时间,这就是可持续与不可持续的区别。
三次握手
当我们访问一个网站的某个网页时,浏览器跟Web服务器会怎么建立连接呢?
这里有一个经典的三次握手通信。
现在,我们访问了www.cloudker.com/head.html这个网址,会发生什么呢?
第一步:浏览器(客户端)会利用TCP协议,向该网站所在的服务器发送一个连接请求(TCP连接);
第二步:服务器会返回一个响应的报文,要么允许建立连接,要么不允许建立连接;
第三步:当Web服务器响应允许建立连接的时候,客户端就可以发送请求报文了,例如上面那个网址,我们就是从服务器中请求head.html这个页面;
第四步:Web服务器端接收到了HTTP请求报文,把head.html这个页面返回给了我们的客户端,然后,浏览器断开与服务器的连接。
完成以上四步,我们就成功访问了一个网站的页面,三次握手指的是前三个步骤。
深入HTTP请求报文的分析——请求报文
想深入了解HTTP,就必须先清楚HTTP报文的格式。HTTP主要分为请求报文和响应报文,顾名思义,一个是客户端请求的时候发出的报文,另一个是服务端响应的时候发出的报文。
请求包的格式,主要分为三种内容:请求方法、请求头和请求正文,我们来看一个例子。
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Cookie: BAIDUID=203A0F1BD28861A57297563DCD1DFBB2:FG=1; BIDUPSID=203A0F1BD28861A57297563DCD1DFBB2; PSTM=1501823485; MCITY=-257%3A; pgv_pvi=4844802048; BD_UPN=13314752; BDRCVFR[mkUqnUt8juD]=mk3SLVN4HKm; BDRCVFR[7MNccJyLkSD]=aeXf-1x8UdYcs; BD_HOME=0; H_PS_PSSID=1427_13549_21084_17001_22073
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
这是我截取的报文,向百度的服务器发送请求报文。第一行就是请求方法,GET 是请求方法的一种,表示以实体的方式得到由请求URI所指定资源的信息。除了GET方法,还有其他方法。
GET | 表示以实体的方式得到由请求URI所指定资源的信息。 |
POST | 数据放置在HTML HEADER内提交 |
HEAD | 只请求页面的首部 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
DELETE | 请求服务器删除指定的页面(通常这个方法都会被禁用) |
Accept-Charset | 用于指定客户端接受的字符集 |
Host | 用于指定被请求资源的Internet主机和端口号 |
Accept-Encoding/td> | 用于指定可接受的内容编码 |
Accept-Language/td> | 用于指定一种自然语言 |
Host | 用于指定被请求资源的Internet主机和端口号 |
Connection | 当前连接是否保持 |
Accept | 代表发送端(客户端)希望接受的数据类型 |
Cookie | 通常指用户的有关信息(身份识别码、密码) |
Content-Length | 表示请求消息正文的长度 |
深入HTTP请求报文的分析——响应报文
响应报文是由服务器返回的,格式是 状态行|响应头|实体头|响应正文
我抓取了一个响应报文,我们来分析一下。
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xac37ab700004159e
Bduserid: 0
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Cxy_all: baidu+41558559050fd7790540842ca81655d5
Date: Thu, 12 Oct 2017 01:12:28 GMT
Expires: Thu, 12 Oct 2017 01:12:28 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=6; path=/
BD_HOME=0; path=/
H_PS_PSSID=1427_13549_21084_17001_22073; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Powered-By: HPHP
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
第一行就是状态行,这里会返回一个HTTP的版本,以及一个状态码,这个状态码表示请求的结果。
100 | 客户必须继续发出请求 |
101 | 客户要求服务器根据请求转换HTTP协议版本 |
200 | 请求成功 |
201 | 提示知道新文件的URL |
202 | 接受和处理、但处理未完成 |
203 | 返回信息不确定或不完整 |
204 | 请求收到,但返回信息为空 |
300 | 请求的资源可在多处得到 |
301 | 删除请求数据 |
302 | 在其他地址发现了请求数据 |
303 | 建议客户访问其他URL或访问方式 |
305 | 请求的资源必须从服务器指定的地址得到 |
306 | 前一版本HTTP中使用的代码,现行版本中不再使用 |
307 | 申明请求的资源临时性删除 |
400 | 错误请求,如语法错误 |
403 | 禁止访问 |
401 | 未授权 |
404 | 没有发现文件、查询或URl |
500 | 内部服务器错误 |
502 | 网关错误 |
以上就是通常会碰到的状态码,我们继续往下面看响应头都有什么。
Server | 使用的服务器名称(环境、系统版本) |
Content-Type | 表示后面的文档属于什么类型 |
Date | 当前的GMT时间 |
Location | 表示客户应当到哪里去提取文档 |
Refresh | 表示浏览器应该在多少时间之后刷新文档 |
Content-Length | 表示内容长度 |
Content-Encoding | 文档的编码(Encode)方法 |
Allow | 服务器支持哪些请求方法s |
实体头的常见字段:
Allow | 请求方法 |
Content-MD5 | MD5实体的一种MD5摘要,用作校验和。 |
Content-Type | 标明发送或者接收的实体的类型 |
Content-Encoding | 标明发送或者接收的实体的类型 |
Content-Language | 实体内容的语言 |
Content-Length | 实体内容的长度 |
Web缓存
Web缓存器也叫代理服务器,它的作用是大大减少对客户请求的响应时间,也可以减少服务器的负担。
我们访问页面,经常需要向服务器发请求,可是当服务器忙碌的时候,就会卡,这样就造成了不好的体验。
但是,如果把那些被频繁访问的资源都放在另一个服务器,我需要访问服务器的这些资源时,如果这个代理服务器有,就直接从代理服务器返回,不用去找背后的服务器了。
例如,我们访问一个网址 www.cloudking.com/logo.gif
浏览器的请求首先会指向Web缓存器,进行一下步骤:
浏览器建立一个到Web缓存器的TCP连接,并向该Web缓存器发送该HTTP请求;
Web缓存器检查自己有木有这种资源,有就返回该资源,没有就打开一个到网站服务器的TCP连接,向服务器发送请求该资源的HTTP报文;
网站服务器接受到HTTP请求,按照自己的情况去进行响应,如果有该资源就返回该资源,如果没有就返回相应的消息;
Web服务器接受到服务器返回的对象,在本地保存一份,然后再向客户端返回一份。
假设一个校园网内,访问外网的链路最多是20M的速度,为了提高访问速度,要把20M的链路改成100M,那样成本就会很高。不如直接在本地弄一个Web缓存器,专门存放一些经常访问的资源,由于本地访问的速度能够达到100M,廉价且效率高,这不是两全其美吗?
2017/10/12 12:01:46 @Author:云都小生(Cloudking)