来自《红黑联盟》
的
HTTP协议详解
但是
1. HTTP协议概述
HTTP协议是整个web的基础,是客户端和服务器端协同工作的基石,要想了解web的工作原理、优化web应用,就要完全理解HTTP协议。作为专注于web编程的PHP语言,简单的网络模型和接口,使得在PHP中实现套接字、curl等变得极其简单。
简单来说,HTTP就是一个基于应用层的通信规范,它不仅保证计算机正确快速地传输超文本文档,还能确定传输文档中的哪一部分,以及哪部分的内容首先显示(如文本先与图片)等。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,目前普遍使用的版本是 HTTP 1.1。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP通常承载于TCP协议之上,有时也承载于TLS或SSL协议之上,这时就成了HTTPS。默认HTTP的端口为80,HTTPS的端口为443。
HTTP协议的模型就是客户端发起请求,服务器进行响应,它是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。这种设计属于典型的“问答式”交互,客户端和服务器端一问一答,使得HTTP协议模型异常简单。但这种设计也存在问题,比如服务器端不会主动向客户端推送(push)数据,一问一答的轮询也会使TCP连接频繁建立和断开,导致其交互效率不高。
浏览网页是HTTP协议的主要应用,但这并不代表HTTP协议就只能应用于网页的浏览。只要通信的双方都遵守HTTP协议,它就有用武之地,如QQ、迅雷等。
2. HTTP协议的工作原理
客户端发送一个HTTP请求(request)给服务器,服务器接收到请求后,生成一个响应(response)返回给客户端。一次HTTP操作称为一个事务,其工作过程分为四步:
(1)客户端与服务器建立连接。在浏览器中访问某个网址,HTTP协议开始工作。
(2)建立连接后,客户端发送一个请求给服务器。格式为:前面是统一资源定位符(URL),中间是协议版本号,后面是MIME信息(包括请求修饰符、客户机信息和可能的内容)。
(3)服务器收到请求后,返回对应的响应信息。格式为:首先是一个状态行(包括信息的协议版本号、状态码),然后是MIME信息(包括服务器信息、实体信息和可能的内容)。
(4)客户端接收服务器返回的信息并呈现给用户,然后断开与服务器的连接。
如果以上过程中的某一步出错,产生的错误信息将返回给客户端。
3. HTTP请求
浏览器客户端在发起请求前,需要先和服务器建立连接。
连接是一个传输层的实际环流,它建立在两个相互通信的应用程序之间。在 HTTP 1.1 协议中,request和response头中都有可能出现一个connection的头,它决定当客户端和服务器通信时如何处理长连接。
HTTP 1.1 协议中,客户端和服务器端默认对方支持长连接,如果客户端不希望使用长连接,需要在header中指明connection的值为close;如果服务器端不想支持长连接,则需要在response中明确说明connection的值为close。无论request还是response的header中包含了值为close的connection,都表明当前正在使用的TCP连接为短连接,即一次请求处理完毕后会断开连接,再次请求时,需重新建立连接。
HTTP请求由三部分组成:请求行、消息报头、请求正文。请求行以一个请求类型开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF
上述格式中的参数说明如下:
Method:请求的方法类型
Request URI:统一资源标识符
HTTP Version:请求的HTTP协议的版本
CRLF:回车和换行(除了作为结尾的CRLP外,不允许出现单独的CR或LF字符)
下面列出HTTP抓包工具抓取的HTTP请求的原生代码的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
GEThttp:
//demo.com/?id=1HTTP/1.1
Host:demo.com
User-Agent:Mozilla/
5.0
(WindowsNT6.
1
;rv:
48.0
)Gecko/20100101Firefox/
48.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
Connection:keep-alive
Upgrade-Insecure-Requests:
1
Cache-Control:max-age=
0
|
请求的方法类型,主要有以下几种:
GET:请求获取Request URI所标识的资源
POST:在Request URI所标识的资源后附加新的数据
HEAD:请求获取由Request URI所标识的资源的响应消息报头
PUT:请求服务器存储一个资源,并用Request URI作为其标识
DELETE:请求服务器删除Request URI所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:保留以备将来使用
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求
4. HTTP响应
服务器在接收和解释请求消息后,会返回一个HTTP响应(response)消息。HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
上述格式中的参数说明如下:
HTTP Version:服务器HTTP协议的版本
Status Code:服务器返回的响应状态码
Reason Phrase:状态码的简短描述
下面列出HTTP抓包工具抓取的HTTP响应的原生代码的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
HTTP/
1
.1200OK
Date:Sun,04Sep201605:
10
:43GMT
Server:Apache/
2.4
.
10
(Win32)OpenSSL/
1.0
.1iPHP/
5.5
.
15
X-Powered-By:PHP/
5.5
.
15
Content-Length:
26
Keep-Alive:timeout=
5
,max=
100
Connection:Keep-Alive
Content-Type:text/html
Array
(
[id]=>
1
)
|
状态码由三位数字组成,第一个数字定义了响应的类别,它有五种可能的值:
1xx:指示信息,请求已接收,继续处理
2xx:成功,请求已被成功接收、理解
3xx:重定向,要完成请求必须进行更进一步的操作
4xx:客户端错误,请求有语法错误或请求无法实现
5xx:服务器端错误,服务器未能实现合法的请求
常见的状态码、状态描述,主要有以下几种:
200 OK:客户端请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorize:请求未经授权,这个状态码必须和 WWW Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在,例如输入了错误的URL
500 Internal Server Error:服务器发生了不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
例如,响应状态行“HTTP/1.1 200 OK (CRLF)”,表示请求到达服务器后被成功识别,返回成功标记。响应正文就是服务器返回的资源的内容。
4. 消息报头
HTTP消息报头(header)包括普通报头、请求报头、响应报头、实体报头。每个报头域的组成形式为,名称: 值。
注意:报头域的名称不区分大小写,报头都是自解释的。
常见的几个比较重要的报头域:
Host:指定了请求资源的主机和端口,必须表示请求URL的原始服务器和网关的位置。HTTP 1.1 请求必须包含主机头域,否则服务器会以400状态码返回。
User-Agent:简称UA,用户代理,指定了发出请求的用户代理的信息。如果是浏览器客户端,则主要包含浏览器的名称、版本和所用的操作系统的内核。UA头不仅仅是使用浏览器才存在,只要使用了基于HTTP协议的客户端都会发送这个报头域。UA头是辨别客户端所用设备(电脑、手机还是iPad等)的重要依据。
Accept:告诉浏览器,客户端可以接收的文件格式。通常这个值在各种浏览器中都差不多,不过WAP浏览器所能接收的格式要少一些,这也是用来区分WAP和计算机浏览器的主要依据之一。但随着WAP浏览器的升级,它已经和计算机浏览器越来越接近,因此这个判断所起的作用也越来越弱。
Cookie:Cookie分两种,一种是客户端向服务器发送的,使用Cookie报头域,用来标记一些信息;另一种是服务器发送给浏览器的,报头为Set Cookie。二者的主要区别是Cookie报头的value里可以有多个Cookie值,并且不需要显示指定domain等。而Set Cookie报头里一条记录只能有一个Cookie的值,需要指明domain、path等。
Cache-Control:缓存控制,指定请求或响应时应该遵循的缓存机制。在请求头或响应头中设置Cache Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no cache、no store、max age、max stale、min fresh、only if cached;响应消息中的缓存指令包括public、private、no cache、no store、no transform、must revalidate、proxy revalidate、max age。
Referer:允许客户端指定请求URI的源资源地址,这可以允许服务器生成回退链表,可用来登录、优化缓存等,也允许废除的或错误的连接由于维护的目的被追踪。如果请求的URI没有自己的URI地址,Referer不能被发送。如果指定的是部分URI地址,则此地址应该是一个相对地址。Referer通常是流量统计系统用来记录来访者地址的参数。通过Referer的值,可以得知当前请求是从哪个URL跳转过来的,PHP中可以用$_SERVER['HTTP_REFERER']获取当前请求头中的Referer的值,借此实现网站的防盗链。
Content-Length:内容的长度
Content-Type:内容的类型
Content-Range:资源内容的范围。可以在每次请求中标记请求的资源范围,在连接断开后重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。迅雷就是基于整个原理,使用多线程分段读取网络上的资源,最后再合并。
Accept-Encoding:指定所能接收的编码方式。通常服务器会对返回的内容进行gzip压缩后再输出以减少流量,浏览器一般都支持对这种压缩后的数据进行处理。但对于我们来说,如果不想接收到这些看似“乱码”的数据,可以指定不接收任何服务器的压缩处理,要求其原样返回。
自定义报头:在消息头(header)中,也可以使用一些在 HTTP 1.1 正式规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或扩展头。比如:Server字段,在PHP中,可通过 header 函数实现。
HTTP和HTTPS区别
一、HTTP和HTTPS的基本概念
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
二、HTTP与HTTPS有什么区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
HTTPS加密、加密、及验证过程,如下图所示:
简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
三、HTTPS的工作原理
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
1、客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2、服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。
这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6、服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7、传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
四、HTTPS要比HTTP多用多少服务器资源?
HTTPS其实就是建构在SSL/TLS之上的 HTTP协议,所以,要比较HTTPS比HTTP多用多少服务器资源,马海祥认为主要看SSL/TLS本身消耗多少服务器资源。HTTP使用TCP三次握手建立连接,客户端和服务器需要交换3个包;HTTPS除了TCP的三个包,还要加上ssl握手需要的9个包,所以一共是12个包。
HTTP建立连接,按照下面链接中针对Computer Science House的测试,是114毫秒;HTTPS建立连接,耗费436毫秒,ssl部分花费322毫秒,包括网络延时和ssl本身加解密的开销(服务器根据客户端的信息确定是否需要生成新的主密钥;服务器回复该主密钥,并返回给客户端一个用主密钥认证的信息;服务器向客户端请求数字签名和公开密钥)。
当SSL连接建立后,之后的加密方式就变成了3DES等对于CPU负荷较轻的对称加密方式,相对前面SSL建立连接时的非对称加密方式,对称加密方式对CPU的负荷基本可以忽略不记,所以问题就来了,如果频繁的重建ssl的session,对于服务器性能的影响将会是致命的,尽管打开HTTPS保活可以缓解单个连接的性能问题,但是对于并发访问用户数极多的大型网站,基于负荷分担的独立的SSL termination proxy就显得必不可少了,Web服务放在SSL termination proxy之后,SSL termination proxy既可以是基于硬件的,譬如F5;也可以是基于软件的,譬如维基百科用到的就是Nginx。
那采用HTTPS后,到底会多用多少服务器资源,2010年1月Gmail切换到完全使用HTTPS, 前端处理SSL机器的CPU负荷增加不超过1%,每个连接的内存消耗少于20KB,网络流量增加少于2%,由于Gmail应该是使用N台服务器分布式处理,所以CPU负荷的数据并不具有太多的参考意义,每个连接内存消耗和网络流量数据有参考意义,这篇文章中还列出了单核每秒大概处理1500次握手(针对1024-bit 的 RSA),这个数据很有参考意义。
Heartbleed这个被称作史上最大的网络安全漏洞,想必很多人都有所耳闻,Heartbleed之所以能够出现,其实和我们这个问题关系还不小,前面我们谈到了频繁重建SSL/TLS的session对于服务器影响是致命的,所以,聪明的RFC在2012年提出了RFC6520 TLS的心跳扩展,这个协议本身是简单和完美的,通过在客户端和服务器之间来回发送心跳的请求和应答,保活TLS session,减少重建TLS的session的性能开销,令人遗憾的是,openssl在实现这个心跳扩展时,犯了一个低级的错误,没有对收到的心跳请求进行长度检查,直接根据心跳请求长度拷贝数据区,导致简单的心跳应答中可能包含了服务器端的核心数据区内容,用户名,密码,信用卡信息,甚至服务器的私有密钥都有可能泄露。
五、HTTPS的优点
正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,从站长的角度来说,HTTPS的优点有以下2点:
1、SEO方面
谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
2、安全性
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:
(1)、使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
(3)、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
六、HTTPS的缺点
虽然说HTTPS有很大的优势,但其相对来说,还是有些不足之处的,具体来说,有以下2点:
1、SEO方面
据ACM CoNEXT数据显示,使用HTTPS协议会使页面的加载时间延长近50%,增加10%到20%的耗电,此外,HTTPS协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。
而且HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。
最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。
2、经济方面
(1)、SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(2)、SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。
(3)、HTTPS连接缓存不如HTTP高效,大流量网站如非必要也不会采用,流量成本太高。
(4)、HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本,如果全部采用HTTPS,基于大部分计算资源闲置的假设的VPS的平均成本会上去。
(5)、HTTPS协议握手阶段比较费时,对网站的相应速度有负面影响,如非必要,没有理由牺牲用户体验。
七、SSL的作用
(1)、认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)、加密数据以防止数据中途被窃取;
(3)、维护数据的完整性,确保数据在传输过程中不被改变。
而SSL证书指的是在SSL通信中验证通信双方身份的数字文件,一般分为服务器证书和客户端证书,我们通常说的SSL证书主要指服务器证书,SSL证书由受信任的数字证书颁发机构CA(如VeriSign,GlobalSign,WoSign等),在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能,分为扩展验证型(EV)SSL证书、组织验证型(OV)SSL证书、和域名验证型(DV)SSL证书。
HTTP1.0和HTTP1.1区别及http状态码
HTTP1.0和HTTP1.1的主要区别
1,HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;
2,HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!
HTTP目前三个版本:HTTP0.9、HTTP1.0
(1)HTTP0.9是最早的版本 ,它只定义了最基本的简单请求和简单回答;HTTP1.0较完善,也是目前使用广泛的一个版本;HTTP1.1增加了大量的报头域,并对HTTP1.0中没有严格定义的部分作了进一步的说明。
(2)HTTP1.1提供了一个基于口令基本认证方法,目前所有的WEB服务器都可以通过“基本身份认证”支持访问控制。在身份认证上,针对基本认证方法以明文传输口令这一最大弱点,补充了摘要认证方法,不再传递口令明文,而是将口令经过散列函数变换后传递它的摘要
(3)针对HTTP协议的改进还有安全HTTP协议SHTTP。最新版本的SHTTP1.3它建立在HTTP1.1基础上,提供了数据加密、身份认证、数据完整、防止否认等能力。
1**- 信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。205 - Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(新)。
206 - Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(新)。
400 - Bad Request 请求出现语法错误。
401 - Unauthorized 访问被拒绝,客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示:502.1 - CGI 应用程序超时。
502.2 - CGI 应用程序出错。
503 - Service Unavailable 服务不可用,服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个 Retry-After头。这个错误代码为 IIS 6.0 所专用。