http
计算机与网络设备相互通信的规则称为协议,这种协议的集合总称为TCP/IP。
TCP/IP中重要的一点是分层:应用层、传输层、网络层、链路层。分层使自由改动和功能设计变得更加简单。
应用层:FTP、DNS、HTTP
传输层:TCP、UDP
网络层:IP
链路层:控制操作系统、硬件的设备驱动、NIC(网络适配器、网卡)、光纤等物理可见部分
应用层使用HTTP协议发送请求,传输层使用TCP协议把请求报文进行分割,打上标记及端口号转发给网络层,网络层使用IP协议,增加作为通信目的地的MAC地址转发给链路层。接收端的服务器从链路层接收到数据,原路返回传输到应用层才算真正接收到HTTP请求。每经过一层就会打上该层的首部信息,接收端会层层消去首部信息。这种把把数据信息包装起来的做法称为封装。
与HTTP密不可分的3个协议:IP、TCP、DNS
IP协议的作用是把数据包传送给对方,IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址
采用ARP协议解析地址,根据IP地址反查出MAC地址
TCP提供可靠的字节流服务,将大块数据分割成以报文段为单位的数据包管理,并能够确认数据是否最终送达:三次握手
三次握手:SYN - SYN/ACK - ACK
DNS提供域名到IP地址之间的解析服务
URI(统一资源标识符)由某个协议方案表示的资源的定位标识符。用字符串标识某一互联网资源。
URL(统一资源定位符)表示资源的地点,互联网上所处的位置。是URI的子集。
绝对URI格式:协议方案名+登录信息(认证)+服务器地址+服务器端口号+带层次的文件路径+查询字符串+片段标识符
HTTP协议用于客户端和服务器之间的通信,能够明确区分哪端是客户端,哪端是服务端
请求报文段:请求方法+请求URI+协议版本+可选的请求首部字段+内容实体
响应报文段:协议版本+状态码+用以解释状态码的原因短语+可选的响应首部字段+实体主体
HTTP是无状态协议,因此引入cookie技术管理状态
Cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态,服务端发送响应报文时通知客户端保存set-cookie首部字段,之后客户端会自动在请求报文中添加cookie信息
如果不是访问特定资源而是对服务器本身发起请求。可以用*代替请求URI??????
HTTP1.1中可使用的方法:GET、POST、PUT(不带验证机制存在安全性问题)、HEAD(获取报文首部)、DELETE(不带验证机制)、OPTIONS(询问支持的方法)、TRACE(追踪路径,查询发送出去的请求是怎样被加工修改的)、CONNECT(要求与代理服务器通信时使用SSL(安全套接层)和TLS(传输层安全)协议加密经网络隧道传输)
HTTP协议的初始版本中,每请求一次就要断开TCP连接,增加通信量开销。在HTTP1.1中,所有连接默认为持久连接,但在HTTP1.0内并未标准化
持久连接使多数请求以管线化方式发送,不用等待响应即可发送下一个请求,更快。
用于HTTP协议交互的信息被称为HTTP报文,HTTP报文分为报文首部和报文主体,通常并不一定要有报文主体。
报文首部由请求行、状态行和首部字段组成,首部字段有通用首部、请求首部、响应首部和实体首部及其他未定义的首部。
通常HTTP报文主体等于实体主体,HTTP协议中有内容编码的功能,在HTTP通信中,如果实体资源未传输完成,则无法请求页面,使用分块传输编码把实体主体分块传输。
MIME(多用途因特网邮件扩展)多部分对象集合(form-data、byteranges)容纳不同类型的数据(MIME扩展)。
运用首部字段Range指定资源下载的byte范围
内容协商给客户端提供最适合的资源:服务器驱动协商、客户端驱动协商、透明协商
状态码类别:1xx、2xx、3xx、4xx、5xx
200 204 206 301 302 303 304 307 400 401 403 404 500 503
单台虚拟主机实现多个域名,部署在同一个服务器上,DNS解析后访问的IP地址是相同的,因此要在Host首部完整指定主机名或域名的URI
代理:有转发功能的应用程序,接收客户端的请求转发给其他服务器,不改变请求URI,转发时会附加via首部字段标记经过的主机信息,最终要到达的是源服务器。
缓存代理:代理转发响应时会预先将资源缓存到代理上,当再次请求时就不必从源服务器获取资源。
透明代理: 不对报文做任何处理。反之为非透明代理。
网关:类似代理,接受客户端请求时可以对它进行处理并不被发觉,能使通信线路上的服务器提供非HTTP协议服务,可以在客户端和网关之间的通信进行加密提高通信安全性,它的通信目标是一个网关
隧道:在相隔甚远的客户端和服务端两者之间进行中转,并保留双方通信连接的应用程序,可以使用SSL等加密手段确保安全性。隧道本身是透明的。
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。缓存服务器是代理服务器的一种。缓存会因缓存有效期和客户端要求而去和源服务器确认缓存是否更新。缓存不仅可以存到服务器上,也可以存在客户端浏览器上(临时网络文件)
HTTP报文首部为处理请求和响应提供所需要的信息。
请求中:HTTP报文首部由请求行(方法、URI、HTTP版本)和HTTP首部字段(请求首部字段、通用首部字段、实体首部字段)等部分构成
响应中:HTTP报文首部由状态行(HTTP版本、状态码)和HTTP首部字段(响应首部字段、通用首部字段、实体首部字段)等部分构成
HTTP首部字段给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
HTTP首部由 【首部字段名:字段值】 构成。
HTTP首部字段将定义成缓存代理和非缓存代理的行为分为2种类型:
端到端首部:会转发给最终目标,且必须保存在由缓存生成的响应中
逐跳首部:只单次转发,会因通过缓存或代理而不再转发,需同时提供connection首部字段。
通用首部字段:都使用的首部字段。
Cache-Control:(private、public、no-cache(在请求中表示客户端不接受缓存,在响应中表示不允许服务器进行缓存,响应中带了参数,表示客户端不能使用缓存)、no-store、s-maxage=(适用于多用户使用的公共缓存服务器)、max-age=、min-fresh=、max-stale(带参数表明不超过该指定时间内的过期缓存仍接收)、only-if-cached(仅在服务器有本地缓存的情况下返回,否则返回状态码504)、must-revalidate(代理再次验证缓存有效,弱无效返回504,会忽略max-stale指令)、proxy-revalidate(要求所有缓存服务器必须验证缓存有效性、no-transform(禁止改变实体主体媒体类型,防止缓存或代理压缩图片等操作))
Connection:不再转发的首部字段名(控制不再转发给代理的首部字段)、close(断开连接,HTTP1.1之后的版本默认持久连接)、Keep-Alive(保持连接,HTTP1.1之前的版本默认非持久连接)
Date:创建HTTP报文的日期和时间
Pragma:不接收缓存(no-cache的兼容处理)
Trailer:记录报文主体后出现的首部字段,用于分块传输编码
Transfer-Encoding:规定传输报文主体时采用的编码方式
Upgrade:检测HTTP协议及其他协议是否可使用更高的版本进行通信
Via:用于追踪报文的转发,包含通过的服务器信息。经常和TRACE方法一起使用
Warning:告知用户一些与缓存相关的问题的警告。【警告码】【警告的主机:端口号】【警告内容】【日期时间】
请求首部字段:补充请求的附加内容、客户端信息、响应内容相关优先级
Accept:通知服务器,用户代理能够处理的媒体类型及其相对优先级。例:img/jpeg;q=0.8,text/html;q=0.1,
Accept-Charset:通知服务器用户代理支持的字符集及其相对优先级,同上
Accept-Encoding:通知服务器用户代理支持的内容编码及其相对优先级,同上,*表示通配符
TE:告知服务器,客服端能处理响应的传输编码方式及相对优先级,与Accept-Encoding类似,但用于传输编码。或指定伴随Trailer字段的分块传输编码方式,将trailers赋值给该字段。
Accept-Language:通知服务器,用户代理支持的自然语言集及其相对优先级,同上
Authorization:通知服务器,用户代理的认证信息
Proxy-Authorization:告知代理服务器认证所需要的信息,是客户端和代理之间的认证
Expect:通知服务器,期望出现的某种特定行为,如果服务器无法理解,返回状态码417
From:通知服务器,用户代理的用户的电子邮件地址
Host:通知服务器,请求资源所处的互联网主机名和端口号。(指定虚拟主机)若未设定主机名则发送空值即可。
If-Match:条件请求,服务器判断条件为真后才执行请求。匹配资源的ETag值(实体标记),失败返回状态码412。*表示忽略Etag值
If-None-Match:与If-Match作用相反,在Get和HEAD方法中使用可获取最新资源
If-Modified-Since:指定一个日期时间,如果资源在这个日期后更新过,执行请求,失败返回304
If-Unmodified-Since:与If-Modified-Since相反
If-Range:通知服务器,如果字段值和ETag值一致,则返回范围请求,否则返回全体资源。(如果服务器资源更新客户端请求时不知道,会失败,使用该字段兼容处理)
Range:告知服务器请求资源的指定范围。处理请求后返回206,无法处理则返回200及全体资源
Max-Forwards:指定可经过的服务器最大数目。(用于排查经过的多个服务器中的问题服务器)
Referer:告知服务器请求的原始资源的URI
User-Agent:告知服务器,创建请求的浏览器和用户代理的名称等信息,可能会添加爬虫和经过的代理信息。
响应首部字段:补充响应的附加内容,要求客户端附加额外的内容信息
Accept-Ranges:bytes/none,告知客户端,服务器是否能处理范围请求
Age:告知客户端,源服务器在多久前创建了响应。如果响应由缓存服务器发出,则为缓存的响应再次发起认证到认证完成的时间值
ETag:告知客户端,资源实体标识,ETag值由服务器算法分配,唯一性标识。强Etag值:不论多么细微的变化都会改变其值;弱ETag值:只有资源发生了根本改变才会改变ETag值,区别是在字段值前附加W/。
Location:将响应接收方引导至某个与请求URI位置不同的资源,该字段配合3XX的响应,提供重定向的URI
Proxy-Authenticate:把代理服务器要求的认证信息发给客户端
Retry-After:告知客户端应在多久之后再次发送请求,可以是秒数或时间
Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息
Vary:对缓存进行控制,源服务器向代理服务器传达缓存的使用方法命令:仅对请求中含有与Vary字段值相同的首部字段名的请求返回缓存,否则从源服务器重新获取资源
WWW-Authenticate:告知客户端,适用于访问请求URI所指定资源的认证方案(Basic/Digest)和带参数提示的质询(challenge)
实体首部字段:资源内容更新时间等与实体有关的信息,包含在请求与响应报文中的实体部分所使用的首部
Allow:通知客户端,支持的所有HTTP方法。
Content-Encoding:告知客户端,服务器对实体的主体部分选用的内容编码方式(gzip/compress/deflate/identity)
Content-Language:告知客户端,实体主体使用的自然语言
Content-Length:告知客户端,实体主体部分的大小(单位是字节)
Content-Location:报文主体返回资源对应的URI。与location的不同??
Content-MD5:检查报文主体在传输过程中的完整性。字段值是一串由服务器用MD5算法生成并用Base64编码处理(HTTP首部无法记录二进制值)后的值,客户端接收资源后通过同样的办法处理后与该字段值比较。但对偶发性改变和恶意篡改无从查证。毕竟都能被篡改。
Content-Range:告知客户端,返回的实体的哪个部分符合范围请求,字段值以字节为单位,表示当前发送部分及整个实体大小。
Content-Type:说明实体主体内对象的媒体类型
Expires:告知客户端资源失效的日期,在该指定时间内,缓存响应的副本会一直保存,指定时间后,缓存服务器会向源服务器请求资源。如果不希望缓存就写和Date相同的字段值。优先处理Cache-Control的max-age值。
Last-Modified:指明资源最终修改的时间
Cookie
Set-Cookie:
expires=Date:指定浏览器可发送Cookie的有效期,省略是仅限于维持浏览器运行时间内,Cookie一旦发送至客户端,不可显示删除,但可以覆盖过期Cookie实现实质性删除操作
path=PATH:限制指定Cookie的发送范围
domain=域名:指定的域名与URI结尾匹配一致,都可以向其发送Cookie
secure:限制web页面仅在HTTPS安全连接时才可以发送Cookie
HttpOnly:使JavaScript脚本无法获得Cookie
Cookie:status=enable:告知服务器,客户端接收到的Cookie,从而进行HTTP状态管理
其他
X-Frame-Options:响应首部,控制内容在其他web的frame标签内的显示问题
DENY 拒绝
SAMEORIGIN 仅匹配是同源域名下的页面时可以加载该页面
X-XSS-Protection:响应首部,控制浏览器XSS防护机制的开关。0无效/1有效
DNT:请求首部。拒绝个人信息被收集。0同意追踪/1拒绝追踪
P3P:响应首部。让web网站上的个人隐私变成仅供程序可理解的形式,达到保护用户隐私的目的。????
HTTP缺点:
1.通信使用明文(不加密的报文),内容可能会被窃听
因为互联网是联通到全世界的网络,通信是公开的。即便加密处理也能看到通信内容,不过加密后需要解析工作(抓包、嗅探器可以处理)。
加密对象:
通信的加密,通过和SSL、TLS组合使用,加密HTTP的通信内容。与SSL组合的HTTP称为HTTPS
内容的加密,要求客户端和服务端同时具有加密和解密的机制。该方式不同于通信加密,仍有篡改风险。
2.不验证通信方的身份,可能遭遇伪装
任何人都可发起请求。使用SSL可以确认通信方,SSL不仅提供加密处理,还使用证书用于确认通信方。客户端在开始通信之前确认证书。
3.无法证明报文的完整性,可能遭遇篡改。
遭遇攻击者拦截并篡改内容称为中间人攻击。HTTP协议有确认报文完整性的方法(MD5、SHA-1等散列值校验和确认文件的数字签名(PGP))但都需要用户本人亲自验证下载的文件是否完整。但都无法保证是否被篡改。
需要和其他协议组合来确保完整性。
HTTP+加密+认证+完整性保护=HTTPS
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS代替而已。
HTTP通信:HTTP->TCP
HTTPS通信:HTTP->SSL->TCP
SSL采用公开密钥加密的加密处理方法:加密算法公开,密钥保密,有密钥就可以解密。
共享密钥加密使用一个密钥:加密和解密都用一个密钥,通信时要将密钥发送给对方,需要设法安全的保管接收到的密钥。
公开密钥加密使用非对称的密钥:私有密钥和公开密钥。发送密钥的一方使用对方的公开密钥进行加密处理,接收方使用自己的私有密钥解密。
公开密钥加密比共享密钥加密处理速度要慢。
HTTPS使用共享密钥加密和公开密钥加密两者混合的加密机制,充分利用两者优势:在交换密钥的环节使用公开密钥加密方式,之后的建立通信交换报文使用共享加密方式。
流程:为了保证收到的公开密钥是原本预想的服务器的公开密钥:服务器使用由认证机关颁发的公开密钥证书(上面有认证机关私有密钥加密的数字签名),传达给客户端,客户端接收后使用认证机关的公开密钥对证书上的数字签名进行验证,确认后即可用服务器的公开密钥进行通信。
浏览器开发商会在内部植入常用认证机关的公开密钥,保证认证机关的公开密钥的安全性。
EV SSL证书可证明服务器背后运营的组织的真实性,通过认证的web网站浏览器地址栏处背景为绿色。
HTTPS中可以使用客户端证书,和服务器证书如出一辙。
但客户端证书需要用户自行安装,付费购买。只能证明客户端实际存在,不能证明用户本人的真实性。(案例:银行验证用户从特定终端访问网银)
当前主流版本是SSL3.0和TLS1.0,TLS是以SSL为原型开发的协议,有时会统称该协议为SSL。
HTTPS的问题:
使用SSL时,处理速度会变慢:通信慢和大量消耗CPU及内存导致处理速度变慢
SSL必须加密处理,服务端和客户端都要进行加密解密的运算处理,消耗硬件资源导致负载增强。
改善方法:使用SSL加速器硬件提高计算速度,分担负载。
因此不一直使用HTTPS通信,只在包含个人信息的敏感数据时使用,节约资源与购入证书消费。