HTTP协议详解

来源:互联网 发布:金方 绿方 知乎 编辑:程序博客网 时间:2024/06/05 16:20

@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.1Host: www.baidu.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflate, brCookie: 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_22073Connection: keep-aliveUpgrade-Insecure-Requests: 1Cache-Control: max-age=0

这是我截取的报文,向百度的服务器发送请求报文。第一行就是请求方法,GET 是请求方法的一种,表示以实体的方式得到由请求URI所指定资源的信息。除了GET方法,还有其他方法。

GET表示以实体的方式得到由请求URI所指定资源的信息。POST数据放置在HTML HEADER内提交HEAD只请求页面的首部PUT从客户端向服务器传送的数据取代指定的文档的内容DELETE请求服务器删除指定的页面(通常这个方法都会被禁用)一般我们看到的都是GET、POST方法,GET方式提交的数据最多只能有1024字节,而POST则没有此限制。一般GET用来发起获取数据的请求,POST用来发起提交数据的请求。后面的 HTTP/1.1 表示的是请求报文的版本。第二行开始就是请求头了,请求头包含很多重要的信息。Accept-Charset用于指定客户端接受的字符集Host用于指定被请求资源的Internet主机和端口号Accept-Encoding/td>用于指定可接受的内容编码Accept-Language/td>用于指定一种自然语言Host用于指定被请求资源的Internet主机和端口号Connection当前连接是否保持Accept代表发送端(客户端)希望接受的数据类型Cookie通常指用户的有关信息(身份识别码、密码)Content-Length表示请求消息正文的长度


深入HTTP请求报文的分析——响应报文



响应报文是由服务器返回的,格式是 状态行|响应头|实体头|响应正文

我抓取了一个响应报文,我们来分析一下。

HTTP/1.1 200 OKBdpagetype: 1Bdqid: 0xac37ab700004159eBduserid: 0Cache-Control: privateConnection: Keep-AliveContent-Encoding: gzipContent-Type: text/html; charset=utf-8Cxy_all: baidu+41558559050fd7790540842ca81655d5Date: Thu, 12 Oct 2017 01:12:28 GMTExpires: Thu, 12 Oct 2017 01:12:28 GMTServer: BWS/1.1Set-Cookie: BDSVRTM=6; path=/BD_HOME=0; path=/H_PS_PSSID=1427_13549_21084_17001_22073; path=/; domain=.baidu.comStrict-Transport-Security: max-age=172800Vary: Accept-EncodingX-Powered-By: HPHPX-Ua-Compatible: IE=Edge,chrome=1Transfer-Encoding: chunked

第一行就是状态行,这里会返回一个HTTP的版本,以及一个状态码,这个状态码表示请求的结果。

100客户必须继续发出请求101客户要求服务器根据请求转换HTTP协议版本200请求成功201提示知道新文件的URL202接受和处理、但处理未完成203返回信息不确定或不完整204请求收到,但返回信息为空300请求的资源可在多处得到301删除请求数据302在其他地址发现了请求数据303建议客户访问其他URL或访问方式305请求的资源必须从服务器指定的地址得到306前一版本HTTP中使用的代码,现行版本中不再使用307申明请求的资源临时性删除400错误请求,如语法错误403禁止访问401未授权404没有发现文件、查询或URl500内部服务器错误502网关错误

以上就是通常会碰到的状态码,我们继续往下面看响应头都有什么。

Server使用的服务器名称(环境、系统版本)Content-Type表示后面的文档属于什么类型Date当前的GMT时间Location表示客户应当到哪里去提取文档Refresh表示浏览器应该在多少时间之后刷新文档Content-Length表示内容长度Content-Encoding文档的编码(Encode)方法Allow服务器支持哪些请求方法s

实体头的常见字段:

Allow请求方法Content-MD5MD5实体的一种MD5摘要,用作校验和。Content-Type标明发送或者接收的实体的类型Content-Encoding标明发送或者接收的实体的类型Content-Language实体内容的语言Content-Length实体内容的长度


Web缓存



Web缓存器也叫代理服务器,它的作用是大大减少对客户请求的响应时间,也可以减少服务器的负担。

这里写图片描述

我们访问页面,经常需要向服务器发请求,可是当服务器忙碌的时候,就会卡,这样就造成了不好的体验。

但是,如果把那些被频繁访问的资源都放在另一个服务器,我需要访问服务器的这些资源时,如果这个代理服务器有,就直接从代理服务器返回,不用去找背后的服务器了。

例如,我们访问一个网址 www.cloudking.com/logo.gif

浏览器的请求首先会指向Web缓存器,进行一下步骤:

  1. 浏览器建立一个到Web缓存器的TCP连接,并向该Web缓存器发送该HTTP请求;

  2. Web缓存器检查自己有木有这种资源,有就返回该资源,没有就打开一个到网站服务器的TCP连接,向服务器发送请求该资源的HTTP报文

  3. 网站服务器接受到HTTP请求,按照自己的情况去进行响应,如果有该资源就返回该资源,如果没有就返回相应的消息;

  4. Web服务器接受到服务器返回的对象,在本地保存一份,然后再向客户端返回一份。

假设一个校园网内,访问外网的链路最多是20M的速度,为了提高访问速度,要把20M的链路改成100M,那样成本就会很高。不如直接在本地弄一个Web缓存器,专门存放一些经常访问的资源,由于本地访问的速度能够达到100M,廉价且效率高,这不是两全其美吗?

2017/10/12 12:01:46 @Author:云都小生(Cloudking)

原创粉丝点击