传智博客
快捷导航
蚂蚁部落
蚂蚁部落 网站首页 前端教程 HTTP协议 查看内容

栏目导航

HTTP协议详解

2017-10-9 10:28| 发布者: admin| 查看: 302| 评论: 1|来自: 蚂蚁部落

传智播客

本章节主要介绍HTTP1.1版本相关知识,关于HTTP2可以参阅HTTP2协议一章节。

一.什么是协议:

现实中,如果人与人或者国与国之间达成一项协议,那么双方就必须要遵守,否则可能会受到某些惩罚。在互联网上也是如此,协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,本文所要介绍的就是应用最为广泛的互联网协议,HTTP协议。

关于HTTP协议的发展历史可以参阅HTTP版本发展介绍一章节。

二.HTTP协议:

HTTP是Hypertext transfer protocol的缩写,即超文本传输协议。

它规定浏览器客户端与万维网服务器之间通信的相关规则。

协议特点如下:

(1).HTTP允许传输任意类型的数据对象,比较灵活。

(2).HTTP协议是无状态协议,也就是当前连接和上一次连接没有任何关联。

(3).HTTP基于TCP/IP应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。

特别说明:HTTP主要应用于网页浏览,但不等同于只应用于网页浏览,比如QQ或者迅雷也有此协议的使用。

三.HTTP协议工作原理:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/112146rp0wp3bx08wxbubu.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

简单解析如下:

(1).万维网服务器的一个进程不断的监控TCP的80端口(默认),以便获取来自客户端的request请求。

(2).收到请求并建立TCP连接之后,服务器则会返回一个response响应,包含要请求的内容。

(3).最后,关闭TCP连接。

代理服务器:

也许我们的request请求需要经过一个代理服务器,才会到达我们真正所要请求的服务器。

图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/112959i4sl433srdtcnq5t.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

使用代理服务器目的主要有如下几点:

(1).利用代理服务器的缓存功能,提高访问速度;也许访问真正的目的web服务器速度很慢,但是代理服务器访问会很快,而我们访问代理服务器的速度也很快,这样它们之间就架设了一个桥梁。

(2).隐藏访问者的真实身份,出于各种原因,不少人有类似需求。

(3).突破一些网络限制,这一点大家都懂得。

四.HTTP消息结构:

当通过一个URI地址向web服务器发起一个请求时,无论是客户端请求信息还是服务器端回应信息都需要一定的格式,下面分别做一下介绍。

1.请求消息格式图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/114651a8nu121aa8vugg1t.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

解析如下:

(1).开始行,也就是请求行(request line),它给出了请求的方法、资源地址和协议版本号。

(2).首部行,也就是请求头(header),给出客户端一些信息,如浏览器信息或者可以接收数据类型等。

(3).在首部行后面紧跟着一个空行,后面是实体主体。

(4).实体主体行,也就是请求数据。

特别说明:如果请求方法是GET或者HEAD,则没有实体主体部分。

常见的请求方法有"POST","GET",下面是HTTP请求中所有的方法:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/120329wsyxypexxewxlezd.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

URL是所要请求资源的地址,例如:

[HTML] 纯文本查看 复制代码运行代码
http://www.softwhy.com/forum.php?mod=viewthread&tid=6191

版本是当前所使用的HTTP协议版本,如HTTP1.1。

Fiddler工具捕捉request请求信息图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/121849n3b37ccgg3t77rf7.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

一个GET请求,请求数据部分为空(GET和HEAD请求都没);请求头部信息内容较多,后面会介绍。

2.响应消息格式图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/122204lt2ggd9uujgyly9g.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

解析如下:

(1).开始行,也就是响应行(Response line),包括HTTP版本,状态码,以及解释状态码的短语。

(2).首部行,也就是响应头(Response header),包括一些响应的附属信息,例如传输数据格式等。

(3).首部行后面是一个空行,空行后面是响应体。

(4).实体主体,也就是响应体(Response header),包含具体请求获取的内容。

Fiddler工具捕捉response信息图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/125423lz14webcrnvqoo1v.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

响应行和响应主体的都比较简单,响应头内容较多后面会介绍。

关于状态码可以参阅HTTP 状态码一章节。

五.HTTP Request header:

利用Fiddler工具可以非常方便的查看HTTP请求头的信息,截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/145931yrrrlfiairaiy41a.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

Fiddler工具将头部信息进行了分类,便于我们观察和理解。

1.Cache头域:

(1).Cache-Control用来规定所要遵循的缓存机制,主要属性值介绍如下:

max-age>0:表示直接从游览器缓存中提取内容。

max-age<=0:向server发送http请求确认资源是否修改,如果修改返回200 ,否则返回304。

(2).If-Modified-Since把浏览器端缓存所页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

(3).If-None-Match通常和ETag一起工作,具体参阅HTTP Etag用法详解一章节。

2.Client头域:

(1).Accept:用于规定客户端浏览器可以接收的数据类型。

比如,Accept: text/html 代表浏览器可以接受服务器回发的类型为text/html  也就是html文档。

如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。

通配符 * 代表任意类型。

(2).Accept-Encoding:用于规定客户端浏览器可以接收的编码类型。

比如,Accept-Encoding: gzip, deflate。

(3).Accept-Language:浏览器自己声明自己接收的语言。 

比如,Accept-Language: zh-CN,zh;q=0.8。

(4).User-Agent:告知服务器客户端使用的操作系统和浏览器的名称和版本等信息。

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36。

3.Cookies:

因为HTTP协议是无状态的,也就是说当前请求和前一次请求是没有任何关系的,所以通常需要使用cookie来维持状态。cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie 值后发送出去。服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务 器上的记录,最后得到之前的状态信息。

图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/144936ygmx29nrcsego5sn.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

请求头中的cookie就是发送给web服务器的。

4.Entity头域:

(1).Content-Length用来说明发送给HTTP服务器数据的长度。

(2).Content-Type用来说明发送给HTTP服务器数据类型。

5.Miscellaneous头域:

(1).Referer:用来规定当前页面是从哪个页面跳转而来。

6.Transport头域:

(1).Connection: keep-alive表示持久连接,具体参阅http持久连接一章节。

(2).Host规定请求的主机域名,这位虚拟主机的发展打下了基础,否则一个服务器只能绑定一个域名。

六.HTTP Response header:

利用Fiddler可以查看Response header头部信息,图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201710/09/162815ize7rr9tz3z9f4zn.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

1.Cache头域:

(1).Date显示生成消息的具体时间和日期。

(2).Expires规定浏览器可以指定过期时间内使用本地缓存。

(3).Cache-Control用来规定索要遵循的缓存机制,主要属性值介绍如下:

          max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒。

          s-maxage:和max-age是一样的,不过它只针对代理服务器缓存而言。

          public:指示响应可被任何缓存区缓存。

          private:只能针对个人用户,而不能被代理服务器缓存。

          no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。这很容易产生误解,使人误以为是响应不被缓存。实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。

          no-store:禁止一切缓存(这个才是响应不被缓存的意思)。

(4).Vary: Accept-Encoding告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题。

2.Cookie/Login头域:

(1).Set-Cookie用将http服务器端生成的cookie写入客户端浏览器。

3.Entity头域:

(1).Content-Encoding用来表明服务器使用什么压缩方法压缩响应中的对象。

(2).Content-Language用来表明服务器响应的对象的语言。

(3).Content-Length用来表明服务器响应正文内容的长度,以字节方式存储的十进制数字来表示。

(4).Content-Type用来表明服务器响应的对象的类型和字符集。

(5).ETag可以参阅HTTP Etag用法详解一章节。

4.Miscellaneous头域:

(1).Server表明是使用何种web服务器。

(2).X-Powered-By表明网站是用什么技术开发。

5.Location头域:

(1).Location用于重定向一个新的位置, 包含新的URL地址。


鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

引用 admin 2017-11-4 17:53
如有问题大家可以留言

查看全部评论(1)

关于我们|手机版|小黑屋| ( 鲁ICP备10022556号-3 )

GMT+8, 2017-11-19 20:23 , Processed in 0.069575 second(s), 22 queries .

Powered by Discuz! X3.2 Licensed

Copyright © 2012-2017 Design: 蚂蚁部落

返回顶部