HTTP基础的简单理解html
在了解HTTP协议以前,咱们先了解下TCP/IP的参考模型,TCP/IP参考模型分为四层:应用层、传输层、网络层、链路层(数据链路层)。git
应用层:为不一样的网络应用提供所需的服务。github
传输层:为应用层实体提供端到端的通讯/传输功能,确保数据包的按顺序传送及数据的完整性。web
网络层:处理网络上流动的数据包,它所包含的协议涉及到数据包在整个网络上的逻辑传输。算法
链路层:监控数据交换,处理网络链接的硬件部分。数据库
TCP/IP通讯传输流以下图所示:浏览器
HTTP在各层的封装处理:缓存
与HTTP协议密切相关的协议/服务:IP,TCP,DNS安全
IP协议负责数据包的传送,固然,这须要配合IP地址和MAC地址,IP间的通讯依赖MAC地址,这就涉及到用以解析地址的ARP协议了。bash
TCP提供了可靠的字节流服务,对要发送的大块数据进行分割成小数据包以易于传输,而且该协议可确认数据包是否送达到目的方。
DNS服务负责解析域名
URI(统一资源标识符)和URL(统一资源定位符)
URI:一个用于标识某一互联网资源名称的字符串。组成:主机名(含端口号)+相对路径+标识符
URL:对能够从互联网上获得的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。组成:协议+主机名(含端口号)+相对路径
区别:URI表示请求资源在互联网上存在的位置,URL在表示请求资源的位置同时还要说明如何访问到这个资源,URL是URI的一个子集。参考资源:URL和URI的区别
Cookies
HTTP协议用于客户端和服务端之间经过请求和响应的交换所达成的通讯,而且它是一种无状态的协议,不会对请求和响应之间的通讯状态进行保存(没法根据前一次请求对此次请求作出处理),但为了可以有保存状态的功能,引入了cookies技术。
持久链接
HTTP初始版本时,每进行一次HTTP请求就会断开一次TCP链接,这状况在早期传输文本很小的时候倒也不以为如何,可是随着时代的进步,所需传输的内容种类愈来愈多和内容愈来愈大了,每次链接后都会断开请求就大幅度的增长了通讯量的开销了。幸亏,自HTTP/1.1和部分HTTP/1.0来,有了持久链接这么个神奇的东西,它规定了只要任何一方没有明确的提出断开链接,那么就保持TCP链接状态。而在维持的TCP链接期间,能够屡次进行HTTP请求来传输须要的内容。
HTTP/1.1默认保持持久链接,在HTTP的头部信息中会有Connection: Keep-alive属性,咱们也能够经过浏览器开发工具的NetWork面板查看这个属性的状态及HTTP请求信息:
如何关闭持久链接:在响应头设置Connection属性为close.
得益于持久链接,HTTP实现了管线化,可以作到同时并行发送多个请求,而无需一个接一个的等待响应。
HTTP请求的内容结构
HTTP协议交互的信息称为HTTP报文,经过下面的图来看看HTTP报文的结构:
除却空行(回车符、换行符),大体分为报文首部和报文主体。报文首部包含请求行(请求的方法、URI、HTTP版本)和状态行(响应状态码、缘由短语、HTTP版本),首部字段(请求和响应的条件和属性),其余(未定义的首部)。
首部字段
首部字段规定了客户端如何处理请求和服务端如何处理响应,根据用途可分为四种:请求首部(请求报文使用的首部),响应首部(响应报文使用的首部),通用首部(请求和响应通用的首部),实体首部(报文实体部分使用的首部)。
HTTP/1.1首部字段列表
通用首部字段
1
2
3
4
5
6
7
8
9
10
|
首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、链接的管理
Date 建立报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其余协议
Via 代理服务器的相关信息
Warning 错误通知
|
请求首部字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(天然语言)
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
if
-Match 比较实体标记(ETag)
if
-Modified-Since 比较资源的更新时间
if
-None-Match 比较实体标记(与
if
-Match相反)
if
-Range 资源未更新时发送实体Byte的范围请求
if
-Unmodified-Since 比较资源的更新时间(与
if
-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方法
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息
|
响应首部字段
1
2
3
4
5
6
7
8
9
10
|
首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源建立通过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定的URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Reter-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
|
实体首部字段
此外,还有一些如Cookie、Set-Cookie和Content-Disposition等在其余RFC中定义的首部字段也常常会被用到。
传输编码
HTTP传输数据的时候能够传输原数据,也能够在传输过程当中编码以提高传输速率。经过传输时的编码处理,能有效的处理大量的访问请求。经常使用的内容编码有如下几种
· gzip(GUN zip)
· compress(UNIX系统的标准压缩)
· deflate(zlib)
· identity(不进行编码)
多部分对象集合
HTTP协议中采纳了多部分对象集合,容许发送的报文主体内可含有多类型实体。多用于上传文件或者图片时使用,能够设置Content-Type属性对其进行规定。如如下几种常见的形式:
Text:用于标准化地表示的文本信息,文本消息能够是多种字符集和或者多种格式的
Multipart:用于链接消息体的多个部分构成一个消息,这些部分能够是不一样类型的数据
Application:用于传输应用程序数据或者二进制数据
范围请求
实现这项功能须要指定下载的实体范围,如:一份1000字节大小的文件,想取300-3000字节范围内的资源,能够设置Range:bytes=300-3000;想取300-3000字节和5000字节到最后的资源,能够设置Range:bytes=300-3000,5000-
内容协商
内容协商机制是指客户端和服务端就响应资源内容进行交涉,而后提供给客户最为适合的资源,内容协商会以响应资源的语言、字符集、编码方式等做为判断的基准。涉及到如下首部字段:
· Accept
· Accept-Charset
· Accept-Encoding
· Accept-Language
· Content-Language
内容协商技术又分为三种类型
服务器驱动协商:服务端以请求的首部字段做为参考,在服务端处理而且返回对应资源。
客户端驱动协商:用户经过浏览器提供的可选列表进行手动选择,或者利用js脚本在web页面上自行选择。
透明协商:服务器驱动协商和代理驱动协商的结合体,当一个缓存被提供了构成响应的一系列可得的表现形式,而且维度的差别能彻底被缓存理解,那么此缓存变得有能力表明源服务器为那个资源的后续请求去执行服务器驱动协商
内容协商可参考:内容协商
HTTP方法及状态码
HTTP方法
HTTP中也包含了一些方法,用于指定请求的资源定期望产生某种行为。对于这些方法,其中用的最多的是get和post,你们也必定很熟悉了~
HTTP/1.1和HTTP/1.0支持的方法
HTTP状态码
HTTP状态码表示客户端HTTP请求的返回结果,经过状态码,用户能够知道HTTP请求是否出现问题,问题出在哪,下面简单罗列一些HTTP状态码:
1
2
3
4
5
6
|
状态码类别 状态码性质
1XX 信息性状态码
2XX 成功状态码
3XX 重定向状态码
4XX 客户端错误状态码
5XX 服务器错误状态码
|
一些常见的状态码:
1
2
3
4
5
6
7
8
9
10
11
12
|
200 ok 正常处理请求
204 no content 服务端接收请求并成功处理,但返回的响应报文不含实体的主体部分
206 partial content 客户端进行范围请求,服务端成功执行这部分范围的get请求
301 moved permanently 永久性重定向
302 found 临时性重定向
303 see other 表示因为请求对于的资源存在另外一个URI,应使用GET方法定向获取请求的资源
304 not modified 客户端发送附带条件的请求,服务端容许访问资源,但为知足条件
401 unauthorized 表示发送的请求须要有经过HTTP认证的认证信息
403 forbidden 请求资源的访问被服务端拒绝
404 not found 服务端没法找到请求的资源
500 internal server error 服务端执行请求时发生错误
503 service unavailable 服务端处于没法处理请求状态
|
HTTP代理及缓存
代理
代理指的是具备转发功能的应用程序,接收客户端的请求转发给服务端,也接收服务端的响应转发给客户端。代理不会改变请求的URI,会直接发送给持有资源的服务器。
在HTTP通讯过程当中能够级联多台代理服务器,而且转发时须要附加Via首部字段以标记通过的主机信息。
缓存
缓存是代理服务器或客户端本地磁盘内保存的资源副本,利用缓存来减小对源服务器的访问以便于节省通讯流量和通讯时间,也能够达到更好的交互体验。
请求的资源若是已经被缓存则直接由缓存服务器返回给客户端,或者客户端直接从本地磁盘读取。缓存能够设置有效时间,当判断缓存过时后,客户端/缓存服务器可像源服务器从新请求新资源。
HTTP安全升级--HTTPS
讲了一些HTTP的优势后,来看看HTTP的缺点
· 通讯使用明文(未经加密),内容可能被窃听
· 不验证通讯方的身份,请求/响应会遭假装
· 没法证实报文的完整性,存在被篡改的可能
互联网的任何角落都存在通讯内容被窃听的风险
按照TCP/IP协议的工做机制,通讯内容在全部的通讯线路上都有可能遭受窥视。即便是加密处理过的通讯,也会被窥视到通讯内容,只是通过了加密,就有可能让人没法破解出正确完整的报文信息含义,加密后的报文信息自己内容仍是会被看到。
通常来讲,窃听通讯是经过收集在互联网上流动的数据包来作解析,这些能够经过抓包和嗅探工具实现,这也使得一些使用公共wifi帐号被盗的事情时有发生。
针对明文传输这点,也能够对报文主体(传输内容)进行加密处理
针对身份验证这点,可经过在本地安装证书,存储身份认证信息等
针对确保信息完整性,MD5/SHA-1的散列值校验,数字签名等
HTTP => HTTPS
HTTP不带加密机制,但能够经过和SSL(安全 套接层...标注下阅读时的停顿)或TLS(安全层传输协议)的组合使用,用SSL创建安全通讯线路后,就能够在这条线路上欢快的进行HTTP通讯了。因为结合了SSL,HTTP升级成为HTTPS(或者 HTTP over SSL),然而这还不能说是个完整的HTTPS。
完整的HTTPS = HTTP + 加密 + 认证 + 完整性保护
一次完整的HTTPS请求
1.客户端发送Client Hello报文开始SSL通讯,报文中包含客户端支持的SSL的指定版本、加密组件列表等
2.服务端可进行SSL通讯时,会以Serve rHello报文做为应答
3.服务端发送Certificate报文,报文包含公开密钥证书
4.服务端发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束
5.SSL第一次握手结束后,客户端以Client Key Exchange报文做为回应,其中包含通讯加密中使用的随机密码串
6.客户端发送Change Cipher Spec报文,提示服务端此报文以后的通讯采用符合上一步的随机密码串的密钥加密
7.客户端发送Finished报文,其中包含链接至今所有报文的总体校验值
8.服务端发送Change Cipher Spec报文
9.服务端发送Finished报文
10.Finished报文交换完毕后,SSL链接创建完成
11.应用层协议通讯,HTTP
12.客户端断开链接,发送close notify
WebSocket 和 http/2.0
WebSocket
WebSocket实现了再Web客户端和服务端之间的全双工通讯,一旦Web服务端与客户端之间创建WebSocket协议的通讯链接,以后的全部通讯都依赖这个专用协议进行。
WebSocket具备推送功能,服务端可直接向客户端推送数据,没必要等待客户端的请求;因为WebSocket一直保持链接状态,而且首部信息小,使得通讯量也相应的减小。
为了实现WebSocket通讯。须要用到前面说到的HTTP首部字段Upgrade,达到告知服务端通讯协议发生改变,当成功握手确立WebSocket链接以后,通讯时再也不使用HTTP的数据帧,而采用WebSocket独立的数据帧。
HTTP/2.0
核心优点/特性
多路复用:多个请求都是经过一个 TCP 链接并发完成(HTTP/1.1管线化在多个请求之间的响应会被阻塞,HTTP/2.0解决了这问题,而且支持优先级和流量控制)
头部压缩:报文头部压缩处理,数通讯量更小
服务端推送:服务端可以更快的把资源推送给客户端
语义改进:采用二进制格式传输数据
Web的攻击技术
以服务器为目标的主动攻击,表明性的有SQL注入和OS命令注入,SQL注入是指攻击者经过直接访问Web应用,把攻击的SQL代码传入服务端以执行数据库来获取所需的数据信息或篡改数据库信息(调用SQL语句的方式所产生的漏洞);OS命令攻击指的是在服务端执行非法的操做系统命令达到攻击的目的。
以服务器为目标的被动攻击,其模式以下:
1.攻击者诱导用户触发已经设置好的陷阱,启动发送已嵌入攻击代码的HTTP请求
2.含有攻击代码的HTTP发送到服务端并容许
3.运行完攻击代码后,存在安全漏洞的Web应用便会成为攻击者的跳板,致使我的信息被窃取(网络安全课的知识全还给老师了...起初看到这些,一脸懵逼...)
以客户端为目标的主动攻击,表明性的跨站脚步攻击(XSS),经过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript代码进行的一种攻击方式,该攻击可获取用户我的信息等
还有HTTP首部注入攻击、邮件首部注入攻击、目录遍历攻击、远程文件所包含的漏洞等
设置或设计致使的安全漏洞
强制浏览,从安置在Web服务端的公开目录下的文件中浏览那些本来非自愿公开的文件,致使我的信息/内部文件信息的泄露
抛出错误信息致使的漏洞,暴露出系统的出错点,给攻击者提供了攻击的突破点
开放重定向,对任意URL做重定向跳转的功能,攻击者可诱导用户到具备恶意的Web站点
会话管理疏忽致使的安全漏洞
会话劫持,攻击者经过一些手段拿到用户会话ID,并使用此会话ID假装成用户达到攻击的目的
攻击者可能得到会话ID的一些方式:
· 经过非正规的生成方法推测出会话ID
· 经过窃听或XSS攻击盗取会话ID
· 经过会话固定攻击强行获取会话ID
会话固定攻击,大体模式为:攻击者访问站点拿到未认证的会话ID,设置陷阱强制用户使用这个会话ID前去认证,一旦用户触发陷阱并完成认证,攻击者就可以使用用户的身份顺利登录网站
跨站点请求伪造,攻击者经过设置的陷阱强制对已完成认证的用户进行非预期的信息某些状态的更新
其余安全漏洞
密码破解,获取密码,突破认证(经过网络密码试错或者对已加密的密码进行破解),密码破解如字典攻击、彩虹表、获取密钥、加密算法漏洞等
点击劫持,又称界面假装,大多以透明层元素做为陷阱以达到攻击目的
Dos攻击,让服务端的服务呈中止状态(利用访问请求形成资源过载,资源用尽以中止服务;经过攻击安全漏洞中止服务)
后门程序,开发者debug的程序,开发者为自身利益植入的程序等