图解HTTP
2022-11-07 21:42:37 1 举报
AI智能生成
图解HTTP
作者其他创作
大纲/内容
HTTP首部
HTTP报文首部
HTTP请求报文:由方法、URL、HTTP版本、HTTP首部字段构成。
HTTP响应报文:由HTTP版本、状态码、HTTP首部字段构成。
HTTP首部字段
HTTP首部字段传递重要信息
HTTP首部字段结构:由 首部字段名 和 字段值 构成的。
Content-Type:text/html。
4种HTTP首部字段类型:通用首部字段类型(请求报文和响应报文两方都会使用的首部)、请求首部字段、响应首部字段、实体首部字段。
HTTP/1.1首部字段
非HTTP/1.1首部字段
HTTP/1.1通用首部字段
请求报文和响应报文双方都会使用的首部。
Cache-Control:操作缓存的行为。
public:表明其他用户也可利用缓存。
private:响应只能以特定的用户作为对象,与public指令的行为相反。
no-cache:防止从缓存中返回过期的资源。
客户端发送的请求中如果包含no-cache指令,表示客户端将不会接收缓存过的响应。如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。
Cache-Control: no-store。暗示请求或响应种包含机密信息。
s-maxage、max-age、min-fresh、max-stale
only-if-cached、must-revalidate、proxy-revalidate、no-transform、cache-extension token
——
Connection:控制不再转发给代理的首部字段、管理持久连接。
控制代理不再转发的首部字段:Connection:不再转发的首部字段名。
管理持久连接:HTTP/1.1版本的默认连接都是持久连接,客户端会在持久连接上连续发送请求。当服务端想断开连接时,指定Connection:close
——
Date:表明创建HTTP报文的日期和时间。
Pragma:no-cache。客户端会要求所有的中间服务器不返回缓存的资源。
Trailer:事先说明在报文主题后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时。
Transfer-Encoding:规定了传输报文主体时采用的编码方式。
Upgrade:用于检测HTTP协议及其他协议是否可使用更高的版本进行通信。
Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径。
各个代理服务器会往Via首部添加自身服务器的信息。
Warning:告知用户一些与缓存相关的问题警告。
请求首部字段
Accept:可以通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
Accept:text/html;image/jpeg;video/mpeg;application/octec-stream。文本文件、图片文件、视频文件、应用程序使用的二进制文件
Accept-Charset:通知服务器用户代理支持的字符集及字符集的相对优先顺序。
Accept-Encoding:告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
gzip、compress、deflate、identity
Accept-Language:告知服务器用户代理能够处理的自然语言集。
Authorization:告知服务器,用户代理的认证信息(证书值)。想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。
Expect:告知服务器,期望出现的某种特定的行为。
From:告知服务器使用用户代理的用户的电子邮件地址。
Host:告知服务器,请求的资源所处的互联网主机名和端口号。虚拟主机运行在同一个IP上,因此使用首部字段Host加以区分。
If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since
Max-Forwards=10:可经过的服务器最大数目。当服务器接收到Max-Forwards值为0的请求时,不再进行转发,而是直接返回响应。
Proxy-Authorization:接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
Range:只需获取部分资源的范围请求。
Referer:告知服务器请求的原始资源的URL。
TE:告知服务器客户端能够处理响应的传输编码方式及相对优先级。
User-Agent:将创建请求的浏览器和用户代理名称等信息传达给服务器。
响应首部字段
Accept-Ranges:告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
Age:告知客户端源服务器在多久前创建了响应。单位:秒。
ETag:能告知客户端实体标识。服务器会为每份资源分配对应的ETag值。
Location:可以将响应接收方引导至某个与请求URL位置不同的资源。
Proxy-Authenticate:会把代理服务器所要求的认证信息发送给客户端。
Retry-After:告知客户端应该在多久之后再次发送请求。
Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary:可对缓存进行控制。
WWW-Authenticate:用于HTTP访问认证。告知客户端适用于访问请求URL所指定资源的认证方案。
实体首部字段
Allow:通知客户端能够支持Request-URL指定资源的所有HTTP方法。
Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式。
Content-Language:告知客户端,实体主体使用的自然语言。
Content-Length:表明了实体主体部分的大小。
Content-Location:给出与报文主体部分相对应的URL。
Content-MD5:客户端对接收的报文主体执行相同的MD5算法,然后与首部字段Content-MD5的字段值比较
Content-Range:告知客户端作为响应返回的实体的哪个部分范围请求。
Content-Type:说明了实体主体内对象的媒体类型。
Expires:会将资源失效的日期告知客户端。
Last-Modified:指明资源最终修改的时间。
为Cookie服务的首部字段
工作机制:用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前存放的Cookie。
调用Cookie时,由于可校验Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击者的攻击而泄露。
Set-Cookie
expires属性:指定浏览器可发送Cookie的有效期。省略expires属性时,有效期仅限于维持浏览器会话(Session)时间段内。这通常限于浏览器应用程序被关闭之前。
一旦Cookie从服务端发送至客户端,服务器就不存在可以显式删除Cookie的方法。但可通过覆盖已过期的Cookie,实现对客户端Cookie的实质性删除操作
path:限制指定Cookie的发送范围的文件目录。
domain属性:指定的域名可做到与结尾匹配一致。
secure属性:用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。
HttpOnly属性:是Cookie的扩展功能,让JavaScript脚本无法获得Cookie。主要目的防止跨站脚本攻击(Cross-site-scripting,XSS)对Cookie的信息窃取
Cookie:告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。
其他首部字段
X-Frame-Options:HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。目的是为了防止点击劫持攻击。
X-XSS-Protection:HTTP响应首部,针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
DNT:HTTP请求首部,意为拒绝个人信息被收集,表示拒绝被精准广告追踪的一种方法。
P3P:HTTP响应首部,可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
确保安全的HTTPS
HTTP的缺点
通信使用明文可能会被窃听
TCP/IP是可能被窃听的网络:因为TCP/IP协议簇的工作原理,通信内容在所有的通信线路上都有可能遇到窥视。
窃听相同段上的通信并非难事。只需要收集在互联网上流动的数据包(帧)就行了。对于收集来得到数据包的解析工作,可交给那些抓包或嗅探器工具。
Wiresshark抓包工具:可以获取HTTP协议的请求和响应的内容,并对其进行解析。
加密处理防止被窃听:通信的加密(通过SSL或TLS的组合使用,加密HTTP的通信内容。SSL和TLS将整个通信线路加密处理)。内容加密(把HTTP报文里所含的内容进行加密处理)。
不验证通信方的身份就可能遭遇伪装
任何人都可发起请求
HTTP协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在一下各种隐患。
无法确定发送至目标的Web服务器是否是按真实意图返回响应的服务器。有可能是已伪装的Web服务器。
无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
无法确定正在通信的对方是否具备访问权限。
无法判定请求是来自何方、出自谁手。
即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击(拒绝服务攻击)。
查明对手的证书
SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定通信方。
无法证明报文完整性,可能已遭篡改
接收到的内容可能有误
没有任何方法确认,发出的请求/响应和接收到的请求/响应是前后相同的。
比如:从某个Web网站上下载内容,是无法确定客户端下载的文件和服务器上存放的文件是否前后一致的。文件内容在传输途中可能已经被篡改为其他的内容。即使内容真的已改变,作为接收方的客户端也是察觉不到的。
像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(MITM)。
如何防止篡改
提供文件下载服务的Web网站也会提供响应的PGP创建的数字签名及MD5算法生成的散列值。
PGP和MD5本身被改写的话,用户是没有办法意识到的。
SSL提供认证和加密处理及摘要功能。
HTTP+加密+认证+完整性保护=HTTPS
HTTP加上加密处理和认证以及完整性保护后即是HTTPS
比如在Web页面中输入信用卡号,如果这条通信线路遭到窃听,那么信号卡号就暴露了。
HTTP+通信加密+证书+完整性保护
证书可证明服务器或客户端的身份
HTTPS是身披SSL外壳的HTTP
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。
通常HTTP直接和TCP通信。当使用SSL时,则变成先和SSL通信,再由SSL和TCP通信了。其实就是身披SSL协议这层外壳的HTTP。
相互交换密钥的公开密钥加密技术
SSL采用公开密钥加密的加密粗粒方式。
共享密钥加密的困境(对称密钥加密):加密和解密用一个密钥的方式。
使用两把密钥的公开密钥加密:使用一对非对称的密钥。私钥不能让任何人知道,公钥可以随意发布,任何人都可以获得。
HTTPS采用混合加密机制:公开密钥加密处理起来比共享密钥加密方式更为复杂,因此若在通信时使用公开密钥加密方式,效率就很低。
证明公开密钥正确性的证书
证书申请流程
1. 服务器的运维人员向数字证书认证机构提出公开密钥的申请;
2. 数字证书认证机构对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将公开密钥放入公钥证书后绑定在一起。
3. 服务器将公钥证书(公开密钥 + 数字签名)发送给客户端,进行公开密钥加密方式通信。
4. 客户端可使用数字证书认证机构的公开密钥,对证书的数字签名进行验证。如果验证通过,说明服务器的公开密钥是值得信赖的
4. 使用服务器的公开密钥对报文加密后传输
5.服务器用私钥对报文解密
可证明组织真实性的EV SSL证书
证书的作用是用来证明作为通信一方的服务器是否规范
另一个作用是可确认对方服务器背后运营的企业是否真实存在。
用以确认客户端的客户端证书
以客户端证书进行客户端认证。
现状:安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。比如可支撑客户端证书支出费用的业务。
比如网上银行就采用了客户端证书。登录网银时不仅要求用户确认输入ID和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。
认证机构信誉第一
SSL机制是以为建立在其信用绝对可靠这一大前提下的。
黑客入侵认证机构,导致颁布了伪造证书的事情。
自由认证机构颁发的证书称为自签名证书
OpenSSL开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己办法服务器证书。
独立构建的认证机构叫做自认证机构,由自认证机构颁发的“无用”证书也被戏称为自签名证书。
HTTPS的安全通信机制
SSL和TLS
子主题
子主题
子主题
SSL真的很慢吗
由于HTTPS需要做服务器、客户端双方加密及解密处理,因此会消耗CPU和内存等硬件资源
和HTTP通信相比,SSL通信部分消耗网络资源。而SSL通信部分,又因为要对通信进行处理,所以时间上延长了。
HTTPS比HTTP要慢2到100倍
为什么不一直使用HTTPS
与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。
如果是非敏感信息使用HTTP通信,在包含个人信息等敏感数据时,才利用HTTPS加密通信。
确认访问用户身份的认证
何为认证
某些Web页面只想让特定的人浏览,或者干脆本人可见。为达到这个目的,必不可少的就是认证功能。
让对方的客户端自报家门。
密码、动态令牌、数字证书、生物认证、IC卡等
HTTP使用的认证方式
BASIC认证(基本认证)、DIGEST认证(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证)
BASIC认证
采用Base64编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。
BASIC认证使用上不够便捷灵活,且达不到多数Web网站期望的安全性等级,不常用。
DIGEST认证
使用质询/响应的方式,但不会像BASIC认证那样直接发送明文密码。
一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。
SSL客户端认证
SSL客户端认证可以避免用户ID和密码被盗的情况。
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自己登录的客户端。
基于表单认证
客户端向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证。
认证多半为基于表单认证
Session管理及Cookie应用
1. 客户端发送已登录信息(用户ID、密码);
2. 服务器发放Session ID,记录认证状态;同时发送包含Session ID的Cookie Set-Cookie:PUPSESSID=233...;
3. 客户端发送包含Session ID的Cookie,服务器端通过验证Session ID来判定对方是真实用户。
基于HTTP的功能追加协议
基于HTTP的协议
HTTP功能上的不足可通过创建一套全新的协议来弥补。
消除HTTP瓶颈的SPDY
Google发布的SPDY,其开发目标旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)
HTTP的瓶颈
当某些网站上,由海量用户公开发布的内容,进了尽可能地显示这些更新的内容。客户端发送确认更新情况的请求,不管是否有更新,都要把数据全部再发送一次;客户端每次都发送相同的首部,有时不压缩数据直接发送。
Ajax的解决方法:达到局部Web页面替换加载的异步通信手段。
Comet的解决方法:一旦服务器端有内容更新了,Comet不会让请求等待,而是直接给客户端返回响应。
SPDY的设计与功能:多用复用流、赋予请求优先级、压缩HTTP首部、推送功能、服务器提示功能
SPDY消除Web瓶颈了吗
SPDY基本上只是将单个域名(IP地址)的通信多路复用,所以当一个Web网站上使用多个域名下的资源,改善效果就会受到限制。
使用浏览器进行全双工通信的WebSocket
WebSocket的设计与功能
WebSocket协议:一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程可互相发送JSON、XML、HTML或图片等任意格式的数据。
WebSocket的特点:推送功能(服务器主动向客户端推送数据的推送功能)、减少通信量(只要建立WebSocket连接,就希望一直保持连接状态。)、
握手请求:为了实现WebSocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生变化,以达到握手的目的。
Upgrade:Websocket
握手响应:对于之前的请求,返回状态码 101 Switching Protocols 的响应。
HTTP/1.1 101 Switching Protocols
Upgrade:websocket
Upgrade:websocket
WebSocket API
HTTP/2.0
特点:改善用户在使用Web时的速度体验。
Web服务器管理文件的WebDAV
是一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。
构建Web内容的技术
HTML:Web页面几乎全由HTML构建
动态HTML:使用客户端脚本语言将静态HTML内容变成动态的技术总称。JS
Web应用
Web应用
CGI:Web服务器在接收到客户端发送过来的请求后转发给程序的一组机制。
Servlet:能在服务器上创建动态内容的程序。使用Java语言实现的一个接口。
数据发布的格式及语言
XML:按应用目标进行扩展的通用标记语言。
JS衍生的轻量级应用JSON
Web的攻击技术
针对Web的攻击技术
HTTP不具备必要的安全功能
HTTP就是一个通用的单纯协议机制,因此它具备较多优势,但是在安全性方面则呈劣势。
就拿远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及会话管理等功能,HTTP协议则没有。
在客户端即可篡改请求
在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击。
通过URL查询字段或表单、HTTP首部、Cookie等途径把攻击代码传入,若Web存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
针对Web应用的攻击模式
以服务器为目标的主动攻击
SQL注入攻击和OS命令注入攻击。
以服务器为目标的被动攻击
利用用户的身份攻击企业内部网络。
因输出值转义不完整引发的安全漏洞
跨站脚本攻击(XSS):通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JS进行的一种攻击。
利用虚假输入表单骗取用户个人信息。利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。显示伪造的文章或图片。
SQL注入攻击:对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。
非法查看或篡改数据库内的数据。规避认证。执行和数据库服务器业务关联的程序等。
OS命令注入攻击:通过Web应用,执行非法的操作系统命令达到攻击的目的。
OS命令注入攻击可以向Shell发送命令,让Windows或Linux操纵系统的命令行启动程序。
HTTP首部注入攻击:指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。HTTP响应截断攻击。
HTTP首部注入攻击影响:设置任何Cookie信息、重定向至任意URL、显示任意的主体(HTTP响应截断攻击)
HTTP响应截断攻击:用在HTTP首部注入的一种攻击。攻击顺序相同,但是要将两个换行符并排插入字符串后发送。
邮件首部注入攻击:指Web应用中的邮件发送功能,攻击者通过向邮件首部To或Subject内任意添加非法内容发起的攻击。利用存在安全漏洞的Web网站,对任意邮件地址发送广告邮件或病毒邮件。
目录遍历攻击:指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。
Web应用对文件处理操作时,在由外部指定文件名的处理存在疏漏的情况下,用户可使用../等相对路径定位到/etc/passed等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到,这样一来,就有可能非法浏览、篡改或删除Web服务器上的文件。
远程文件包含漏洞:指当部分脚本内容需要从其他文件读入时吗,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击
因设置或设计上的缺陷引发的安全漏洞
强制浏览:从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
泄露顾客的个人信息等重要情报。泄露原本需要具有访问权限的用户可查阅的信息内容。泄露未外连到外界的文件。
不正确的错误消息处理:指Web应用的错误信息内包含对攻击者有用的信息。
Web应用抛出的错误消息。数据库等系统抛出的错误消息。
开放重定向:对指定的任意URL作重定向跳转的功能。如果指定的重定向URL到某个具有恶意的Web网站,那么用户就会被诱导至那个Web网站。
因会话管理疏忽引发的安全漏洞
会话劫持(SH):指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。
通过非正规的生成方法推测会话ID。通过窃听或XSS攻击盗取会话ID。通过会话固定攻击强行获取会话ID。
会话固定攻击(SF):对以窃取目标会话ID为主动攻击手段的会话劫持而言,会话固定攻击攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。
跨站点请求伪造(CSRF):指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
利用已通过认证的用户权限更新设定信息等。利用 已通过认证的用户权限购买商品。利用已通过认证的用户权限在留言版上发表言论。
其他安全漏洞
密码破解:算出密码,突破认证。
通过网络的密码试错(穷举法、字典攻击)。对已加密密码的破解。
点击劫持:指利用透明的按钮或链接做成陷阱,覆盖在Web页面之上(透明标签iframe)。诱导用户在不知情的情况下,点击链接访问内容的一种攻击手段(界面伪装)。
DoS攻击(服务停止攻击/拒绝服务攻击):是一种让运行中的服务呈停止状态的攻击。攻击对象不仅限于Web网站,还包括网络设备及服务器等。
集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。通过攻击安全漏洞使服务停止。
多台计算机发起的DoS攻击称为DDos攻击。DDos攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。
后门程序:开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能。
开发阶段作为Debug调试的后门程序。开发者为了自身利益植入的后门程序。攻击者通过某种方法设置的后门程序。
Web与网络基础
使用HTTP协议访问Web
Web使用HTTP协议作为规范,完成从客户端到服务端等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在HTTP协议上通信的。
HTTP的诞生
网络基础TCP/IP
TCP/IP协议簇
TCP/IP的分层管理
如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需要把变动的层替换掉即可。把各层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。
处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、对方的传输路线是怎样的、是否能保证传输送达等问题。
应用层决定了向用户提供应用服务时通信的活动。FTP、DNS、HTTP协议。
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。TCP和UDP。
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。
链路层用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC、光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
TCP/IP通信传输流
应用层:HTTP报文(HTTP数据)
传输层:TCP首部(HTTP数据),HTTP请求报文分割,每个报文增加上序号及端口号。
网络层:IP首部(TCP首部(HTTP数据))增加目的地址的MAC地址。
链路层:以太网首部(IP首部(TCP首部(HTTP数据)))
与HTTP关系密切的协议:IP、TCP和DNS
负责传输的IP协议
使用ARP协议凭借MAC地址进行通信。根据通信方的IP地址反查出对应的MAC地址。
确保可靠的TCP协议
字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。
确保数据能够到达目标,TCP协议采用三次握手策略。
域名解析协议DNS
通过域名查找IP地址,或逆向从IP地址反查域名的服务。
各种协议与HTTP协议的关系
客户端要浏览某个Web页面
客户端向DNS发起域名解析的请求,得到IP地址;
HTTP:生成目标服务器的HTTP请求报文
TCP:将HTTP请求报文分割成报文段,把每个报文段可靠地传给对方
IP:搜索对方的地址(路由器),一边中转一边传送。
URI和URL
统一资源标识符
URI格式
简单的HTTP协议
HTTP协议用于客户端和服务端之间的通信
应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器角色
两台计算机作为客户端和服务端的角色有可能会互换。
通过请求和响应的交换达成通信
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。
肯定是由客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
HTTP是不保存状态的协议
HTTP协议自身不对请求和响应之间的通信状态进行保存,对于发送过的请求或响应都不做持久化处理。
HTTP协议并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性。
比如用户登录购物网站,需要保存用户的状态。针对这种情况,为了实现期望的保持状态功能,于是引入了Cookie技术。
有了Cookie再用HTTP协议通信,就可以管理状态了。
请求URI定位资源
如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求URL。
告知服务器意图的HTTP方法
GET:获取资源。请求访问已被URL识别的资源。如果是文本,保持原样返回;如果是像CGI(通用网关接口)那样的程序,则返回经过执行后的输出结果。
POST:传输实体主体。目的并不是获取相应的主体内容。
PUT:传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置。
HEAD:获得报文首部。和GET方法一样,不返回报文主体部分。用于确认URL的有效性及资源更新的日期时间等。
DELETE:删除文件。按请求URL删除指定的资源。
OPTIONS:询问支持的方法。用来查询针对请求URL指定的资源支持的方法(GET、POST...)。
TRACE:追踪路径。让Web服务器端将之前的请求通信返回给客户端的方法。
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200OK的响应。
客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。因为请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。
TRACE方法本来就不常用,TRACE容易引发XST攻击。
CONNECT:要求用隧道协议连接代理。与代理服务器通信时建立隧道,用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输
使用方法下达命令
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
建立TCP连接、SYN、SYN/ACK、ACK、HTTP请求、HTTP响应、FIN、ACK、FIN、ACK、断开TCP连接。
HTTP持久连接,HTTP keep-alive。只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接旨在建立1次TCP连接后进行多次请求和响应的交互
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
除了服务器端,客户端也需要支持持久连接。
管细化:从前发送请求后需要等待并收到响应,才能发送下一个请求。管细化技术出现后,不用等待响应亦可直接发送下一个请求
这样可以做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
用持久连接可以让请求更快结束,管细化技术则比持久连接还要快。
使用Cookie的状态管理
无状态协议的优点,不必保存状态,可减少服务器的CPU及内存资源的消耗。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。
Cookie技术通过 在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
HTTP报文内的HTTP信息
HTTP报文
HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
HTTP报文大致可分为报文首部(Client或Server端需处理的请求或响应的内容及属性)和报文主体(应被发送的数据)两块。
请求报文及响应报文的结构
请求行:包含用于请求的方法,请求URL和HTTP版本。
状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
首部字段:包含表示请求和响应的各种条件和属性的各类首部。
其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。
编码提升传输效率
报文主体和实体主体的差异
报文:HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
实体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
gzip、compress、deflate、identity
分割发送的分块传输编码
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
HTTP/1.1中存在一种称为传输编码的机制,它可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
发送多种数据的多部分对象集合
HTTP协议采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
multipart/form-data:在Web表单文件上传时使用。
multipart/byteranges:状态码206响应报文包含了多个范围的内容时使用。
获取部分内容的范围请求
如果下载过程中遇到网络中断的情况,就必须重头开始。为了解决上述问题,需要一种客恢复的机制。
所谓恢复就是指能从之前下载中断处恢复下载。
要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)。
内容协商返回最合适的内容
同一个Web网站有可能存在多份相同内容的页面。比如英语版和中文版的Web页面,它们内容上虽然相同,但使用的语言却不同。
内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以语言、字符集、编码方式等为基准判断响应的资源
包含在请求报文中的某些字段就是判断的基准。
Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language
服务器驱动协商:以请求的首部字段作为参考,在服务器端自动处理。
客户端驱动协商:用户从浏览器现实的可选项列表中手动选择。比如按OS的类型或浏览器类型,自行切换成PC版页面或手机版页面。
透明协商:是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。
返回结果的HTTP状态码
状态码告知从服务器端返回的请求结果。经常使用的大概14种。
2XX成功
200 OK:客户端发来的请求在服务器端被正常处理了。
204 No Content:服务器接受的请求已成功处理,但不允许返回任何实体的主体。
比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。
206 Partial Content:对客户端进行了范围请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX重定向
301 Moved Permanently:永久性重定向。表示请求的资源已被分配了新的URL,以后使用资源现在所指的URL。
302 Found:临时性重定向。表示请求的资源已被分配了新的URL,希望用户能使用新的URL访问。
303 See Other:请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。
304 Not Modified:表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求为满足条件的情况后,直接返回304。
304 状态码返回时,不包含任何响应的主体部分。304 和重定向没有关系。
307 Temporary Redirect:临时重定向。与302Found有着相同的含义。
4XX客户端错误
客户端发生错误。
400 Bad Request:请求报文中存在语法错误。需要修改请求的内容后再次发送请求。
401 Unauthorized:发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口
403 Forbidden:对请求资源的访问被服务器拒绝了。
未获得文件系统的访问授权,访问权限出现某些问题 等情况都可能是发生403的原因。
404 Not Found:服务器上无法找到请求的资源。也可以在服务器端拒绝请求且不想说明理由时使用。
5XX服务端错误
服务器本身发生错误
500 Internal Server Error:服务器端在执行请求时发生了错误。也可能是Web应用存在bug或某些临时的故障。
503 Service Unabailable:服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
与HTTP协作的Web服务器
用单台虚拟主机实现多个域名
HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。
比如提供Web托管服务的供应商,可以用一台服务器为多位用户服务。即使物理层面只有一台服务器,但只要使用虚拟主机的功能,可以假想具有多台服务器
若一台服务器内托管了两个不同的域名,同时部署在同一个服务器上,使用DNS服务解析域名后,两者的访问IP地址会相同。
在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URL
通信数据转发程序:代理、网关、隧道
代理
一种有转发功能的应用程序,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
每次通过代理服务器转发请求或响应时,会追加写入Via首部信息,以标记出经过的主机信息。
使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
代理的使用方法。一种是是否使用缓存,另一种是是否会修改报文。
缓存代理:代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,即可以不从 源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,被称为非透明代理。
网关
转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,就像自己拥有资源的源服务器一样对请求进行处理。
客户端有时可能都不会察觉,自己的通信目标是一个网关。
利用网关可以由HTTP请求转化为其他协议通信。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
比如网关可以连接数据库,使用SQL语句查询数据。
隧道
在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
通过隧道的传输,可以和远距离的服务器安全通信。隧道本身是透明的,客户端不用在意隧道的存在。
保存资源的缓存
缓存是指 代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可以减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器也是代理服务器的一种。当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
缓存的有效期限:缓存服务器的缓存,不能保证每次都会返回对同资源的请求。因为这关系到被缓存资源的有效性问题。
即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取"新"资源
客户端的缓存:缓存还可以存在客户端浏览器中。客户端缓存称为临时文件。
当浏览器缓存失效,浏览器会再次请求新资源。
0 条评论
下一页