浅谈HTTP协议
1.Http协议概述
超文本传输协议(HyperText Transfer Tansfer Protocol),是一种基于TCP的应用层协议,也是目前为止最为流行的应用层协议之一,可以说HTTP协议是万维网的基石。
HTTP是一种客户端请求、服务器应答式的模式,服务器端一般是不可能主动向客户端发送数据的,在网络正常的情况下请求和响应的相互对应性的。
所以我们上网的时候只能去找度娘,度娘不会主动来找我们。
2.TCP/IP协议
TCP/IP协议:链路层(网络接口层)、网络层、传输层和应用层。
链路层:驱动程序、网卡
网络层:IP协议、ICMP协议、ARP协议、RARP协议等。
传输层:TCP协议、UDP协议。
应用层:FTP、HTTP、TELNET、SMTP、DNS等协议。
协议之间的关系如下图:
注意:网络层IP提供的是一种不可靠的服务。它只是尽可能快地把分组从源节点送到目的节点,但不提供任何可靠性的保证。
而Tcp在不可靠的ip层上,提供了一个可靠的运输层,采用了超时重传、发送和接受端到端的确认分组等机制。
3.工作原理
* HTTP协议采用请求/响应模式,客户端向服务器发送一个请求报文,然后服务器响应请求。
* 在浏览器中输入URL,并按下回车键
* 浏览器向DNS服务器请求解析该URL中的域名对应的IP地址(如果是IP请求,则不需要该步骤)
* 解析出IP后,根据IP和端口号,和服务器建立TCP连接
* 浏览器向服务器发送请求
* 服务器做出响应,把数据发送给浏览器
* 通信完成,断开TCP连接
* 浏览器解析收到的数据并显示
4.Http报文在各层的封装过程
二、HTTP报文格式详解
1. 请求方式Method:
(1)GET:请求指定的页面信息,并返回实体主体。
(2)POST :请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。一般用提交信息或数据,请求服务器进行处理(例如提交表单或者上传文件)。
(3)HEAD :与GET用法相同,但只请求资源首部。下载前可使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小、可用来测试超链接的有效性,可用性和最近修改、用于判断本地缓存资源是否要更新。
HTTP 1.1新增:
(4)OPTIONS:允许客户端查看服务器的性能,可以说这是一个探测性的方法,客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。
(5)PUT:用幂等的方式向指定资源位置上传其最新内容(原来没有就上传,有就上传并覆盖原来的内容)
(6)DELETE:请求服务器删除Request-URI所标识的资源。
(7)TRACE:回显服务器收到的请求,主要用于测试或诊断。
(8)CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
GET VS POST:
GET和POST本质上都是TCP连接,由于HTTP的规定和浏览器/服务器的限制才导致它们在应用过程中体现出一些不同:
GET:
优点:简单方便,一步发送
缺点:HTTP协议规范没有对URL长度进行限制,浏览器及服务器对长度有限制,URL最好不要超过IE的最大长度限制(2083个字符)、只接受ASCII字符、隐私相关的信息也直接暴露在URI中(www.baidu.com?username=tanggang02&character=Robust)且会被cache
POST:
优点:没有长度限制;参数放在Request Body中传递、默认不会被浏览器缓存,相对于更安全;支持的参数类型多样。
缺点:多数浏览器对于POST采用两阶段发送数据的,先发送请求头(Header),再发送请求体(Body),即使参数再少再短,也会被分成两个步骤来发送。也就是说GET产生一个TCP数据报,POST产生两个TCP数据包报。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
存在问题:当网络状态不好的时候且connect:close时,在传输层TCP会出现两次连接的过程,通信次数越多反而可靠性越低。
建议:对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。
PUT VS POST(协议语义上的约定)
幂等性概念:
单目运算, x为某集合内的任意数, f为运算子如果满足f(x)=f(f(x)), 那么我们称f运算为具有幂等性(idempotent),比如在实数集中,绝对值运算就是一个例子: abs(a)=abs(abs(a))
双目运算,x为某集合内的任意数, f为运算子如果满足f(x,x)=x, f运算的前提是两个参数都同为x, 那么我们也称f运算为具有幂等性,比如在实数集中,求两个数的最大值的函数: max(x,x) = x, 还有布尔代数中,逻辑运算 "与", "或" 也都是幂等运算, 因为他们符合AND(0,0) = 0, AND(1,1) = 1, OR(0,0) = 0, OR(1,1) = 1
PUT请求具有幂等性。将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果还是B,与一次执行的结果是一样的。
POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果。
比如:在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST
用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT
性能优化:https://segmentfault.com/a/1190000000353790
2.Request-URI
常见形式:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
#fragment 片段ID:锚点,应用于客户端,不会传给服务器
相对路径形式:
GET /yongche.php HTTP/1.1
...
...
在请求头信息中一般有Host值来指定服务器主机
URL 保留字符的百分号编码(% + ascii码十六进制表示)
3.Http-Version
队头阻塞:下一个请求必须在前一个请求响应到达之前才能发送。假设前一个请求响应一直不到达,那么下一个请求就不发送,同样的后面的请求也给阻塞了
HTTP 0.9 date-1991
已过时淘汰、只允许发GET请求,且不支持请求头。
HTTP 1.0 date-1996年5月
支持请求响应头、支持GET、POST、HEAD方法
长连接(默认Connection: close)、缓存机制( Expires 过期时间)
支持任何格式的内容、使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的大发展奠定了基础。
HTTP 1.1 date-1997年1月
长连接(默认Connection: Keep-Alive)
请求管道化 (优化了队头阻塞问题)
增加缓存处理(强缓存和协商缓存[传送门],针对缓存新增字段:cache-control)
增加Host字段(HTTP 1.0 默认认为每台服务器都绑定一个唯一的IP地址)
SPDY 协议 date-2009
SPDY强制使用SSL传输协议,全部请求由SSL加密,信息传输更安全
HTTP 2.0 date-2015 (基于SPDY)
二进制分帧 头信息和数据体都是二进制,统称为帧
双工复用(或连接共享) 数据流:帧乱序发送,根据帧首部的流标识符重新组装
头部信息压缩 - 把Cookie、User Agent 客户端、服务端同时维护一张头信息表,所有字段存入并生成索引号,后续只发索引号
服务器推送 (Server Push) 服务端预期客户端需要其他的资源,主动发送
4.HTTP头信息
常见请求头
1)、Host
Host用于指定请求资源的主机名和端口号(可选,默认80)。
Host:www.baidu.com
2)、User-Agent
用户请求的代理软件,包括用户的操作系统,浏览器等相关属性。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
3)、Referer
代表当前访问的URL的上一个URL,也就是用户是从什么地方转到本页面的。
Referer:https://www.baidu.com/
4)、Cookie
Cookie是个非常重要的请求头,常用来表示请求者的身份。比如有些会话信息(SesssionId)会存在Cookie中。
Cookie:BAIDUID=AAABBBCCCDDDEEEFFFGGG;BIDUPSID=ZYXWVUOPQRST;PSTM=1494145048;__cfduid=d9a1edfb6fa7a6a21167d12a07558b2551494568096;BD_CK_SAM=1;PSINO=1;BD_HOME=1;H_PS_PSSID=1421_21079_21672_20927;BD_UPN=12314353;sugstore=1
5)、Cache-Control
指定请求和响应遵循的缓存机制,Cache-Control: no-cache
6)、Accept
客户端接受什么类型的信息。类型用MIME表示。
比如:
Accept: text/html,application/xhtml+xml,application/json
7)、Accept-Charset
客户端接受什么字符集的文本内容。如UTF-8,GBK等。
8)、Connection
表示是否需要持久连接。(HTTP 1.1默认进行持久连接) keep-alive、close
9)、Accept-Encoding
客户端接受什么压缩格式的内容。如gzip压缩格式,deflate压缩,sdch压缩。
10)、Range
只请求实体的一部分,指定范围,Range: bytes=500-999
实例:
Accept:
application/json
Accept-Encoding:
gzip, deflate
Accept-Language:
zh-CN,zh;q=0.9
Cache-Control:
no-cache
Connection:
keep-alive
Content-Length:
201
Content-Type:
application/x-www-form-urlencoded
Cookie:
BAIDUIDB=68591AE3191431C1F6BCFE9874:FG=1; BIDUPSID=A1FB6-AE7QpNY5V3r57dNX-uup; RCVIDAAAAAAEAAAAifplryMvJ-sjrz7cyMTYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGjYluBo2kUmQAm;
BDRCVFR[4r8LXJfwh-6]=I67x6TjHwwYf0; H_PS_PSSID=
Host:
Origin:
http://cp01-carpool-4.epc.baidu.com:8889
Pragma:
no-cache
Referer:
http://cp.epc.baidu.com:8889/main/webapp?page=unionInvoiceInfo
User-Agent:
Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
X-Requested-With:
XMLHttpRequest
常见响应头
1)、Server
服务器所使用的Web服务器名称。攻击者可以通过查看该头信息,来探测Web服务器名称。所以一般服务器端会对该头信息进行修改。
Server: Apache/2.4.6 (CentOS)
2)、Set-Cookie
向客户端设置Cookie。与Cookie请求头相互对应。Set-Cookie头是服务器向客户端设置Cookie,Cookie头是客户端向服务器传客户端已经保存的Cookie信息。
Set-Cookie: __bsi=12777267876439010180_00_68_R_N_70_0303_C027_N_I_I_0; expires=Thu, 18-May-17 16:32:52 GMT; domain=www.baidu.com;path=/
3)、Last-Modified
服务器通过该头信息告诉浏览器,资源最后的修改时间。从而让客户端及时地更新缓存内容。
4)、Location
服务器通过该头信息告诉浏览器去访问那个页面,浏览器接收到这样的响应信息后,通常会立刻访问Location头所指向的页面。这个头通常配合302重定向状态码使用。
5)、Refresh
服务器通过Refresh头信息让浏览器定时刷新。
比如下面这个头信息定时三秒后,刷新到百度页面。
Refresh: 3;url="http://www.baidu.com"
6)、Cache-Control
指定客户端对页面的缓存策略。
比如下面的头信息表示指定客户端不缓存该页面内容。
Cache-Control: no-cache
7)、Content-Type
响应实体的内容类型。
Content-Type: text/html;charset=utf-8
8)、Content-Encoding
响应实体的编码方式
Content-Encoding: gzip
9)、Content-Length
响应实体的内容长度
5.Http响应码
HTTP/1.0200OK
客户端发出HTTP请求,服务端接收后,会向客户端发送响应信息。
1XX:信息提示。表示请求已被服务器接受,但需要继续处理,范围为100~101。
2XX:请求成功。服务器成功处理了请求。范围为200~206。
3XX:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300~305。
4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或者请求了一个不存在的资源。范围为400~415。
5XX:服务器出错。客户端发送了有效的请求,但是服务器自身出现错误,比如Web程序运行出错。范围是500~505。
图片参考:http://blog.jobbole.com/88450/
三、HTTPS (http over ssl)
HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能。
过程:
* 客户端发送请求到服务端,要求与Web服务器建立SSL连接。
* 服务端会将网站的证书信息(证书中包含公钥)传送一份给客户端。
* 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
* 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做会话密钥对需要发送的数据进行对称加密
* 客户端在接收到加密后的数据使用会话密钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
* SSL加密建立
HTTPS使用的加密方式结合了对称加密和不对称加密的特点,在保证安全的情况下,又提高了传输效率。HTTP和HTTPS的区别如下:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http的信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https用的端口不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
优点:
使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
HTTPS是现行架构下比较安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
缺点:
SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。