图解HTTP
#笔者阅读《图解HTTP》所获所感,以此记录
#附本书pdf
HTTP(Hyper Text Transfer Protocol)超文本传输协议
总流程概述:
客户端在浏览器地址栏输入URL ,浏览器进行DNS地址解析得到iIP,并附加HTTP报文其余信息,通过路由、交换机发往服务器,服务器处理响应,根据请求报文发送响应报文,后由客户端浏览器解析HTML文档返回用户界面
注:有关TCP/IP可阅读《图解TCP/IP》
TCP/IP协议族,通信双方建立通信协议,采用相同格式相同要求传输接收报文
分层网络:应用层 FTP(File Transfer Protocol)文件传输协议 DNS(Domain Name System)域名系统 HTTP协议
传输层 TCP (Transmission Control Protocol) 传输控制协议 UDP (User Data Protocol)用户数据报协议
网络层 路由算法,IP(Internet Protocol)网际协议
链路层 硬件设备 网络适配器(网卡),光纤
IP:每一个被分配到的IP地址与MAC(media access control address)地址配对,MAC为计算机网卡固定地址不变,IP可变
URL(uniform resource locator)统一资源定位符 如:浏览器访问web的网址
URI(uniform resource identifier) 适用范围更广,除web还包括ftp mailto telnet file 等资源
HTTP协议自身不对请求和相应之间的通信状态进行保存,协议对于发送过的请求或相应都不做持久化处理(为了减少服务器CPU和资源消耗,更快处理业务)
但有时需要用户在页面跳转时保持登录状态,于是引入了cookie技术,实现了状态管理
cookie技术使得服务器只需要生成cookie并记录对应的发送方,以少量的内存资源负担解决了HTTP无状态的问题,
GET:获取资源
POST:传输实体主体,通常会携带信息,如用户名密码,也要求获取资源
PUT:传输文件,一般只有特定的网站使用该方法
HEAD:获得报文头部
DELETE:删除文件
OPTIONS:询问支持的方法
TRACE:追踪路径 CONNECT:要求用隧道协议连接代理(HTTPS中使用SSL、TLS交换密钥,认证,从而建立安全连接)
登录B站搜索某一关键词,打开F12后刷新页面,可在网络中查看到浏览器与服务器之间的GET POST OPTIONS请求
早期HTTP版本中,每一次HTTP通信就要建立然后断开TCP连接
有关TCP的三次握手 四次挥手:
三次握手为建立连接时,用于确认客户端和服务器双方的接收信息能力与发送信息能力正常
第一次握手,客户端向服务器发送信息,请求建立连接
第二次握手,当服务器收到客户端的请求报文,证明客户端具有发送信息能力,并向客户端发送响应报文
第三次握手,当客户端接收到服务器的响应报文,证明客户端由发送信息的能力,接收信息能力,服务器有发送信息能力,并向服务器发送一次确认信息
这时双方都确认双方都具有收发信息的能力,可以建立通信
(如果是需要建立安全连接,三次握手中的信息还需包含密钥以及需验证的密码)
四次挥手为断开连接时,用于结束双方通信连接,需要双方都同意并确认断开连接
(通信双方都可申请主动断开连接,这里以服务器为例)
第一次挥手,服务器向客户端申请断开连接
第二次挥手,客户端告知服务器已知服务器要和他断开连接
第三次挥手,客户端告知服务器将要与服务器断开连接
第四次挥手,服务器告知客户端已知客户端要和服务器断开连接,等待一小段时间后若没有任何信息回应则断开连接
早期通信都是容量较小的文本传输,每次请求造成无谓的TCP连接建立与断开,增加通信量的开销。
为解决该问题,HTTP/1.1提出建立持久连接,只要任意一端没有明确提出断开连接则保持TCP连接状态,如今默认连接都是持久连接,如下图keep-alive
HTTP报文分为请求报文和响应报文,报文结构如下,其中报文首段分为通用首部字段(请求+响应都有)、请求首部字段,响应首部字段、实体首部字段
报文结构:
调用GET 方法,使用HTTP/2协议
向主机地址HOST为www.bilibili.com的服务器发送请求
发送方的部分信息USER-AGENT 通常由浏览器提供,包含浏览器属性及电脑系统属性,如火狐,windows x86 64位
可接受报文的种类及权重ACCEPT ,表示可以接受HTML/XML/IAMGE等文件,q代表期望返回文件的权重,默认q=1.0
可接受报文的语言种类及权重ACCEPT-language:如 zh-CN中文 en-US英文
(若访问的服务器不提供改报文类型或语言则按权重依次返回)
实体部分压缩方式 ACCEPT ENCODING
连接方式(默认):持久连接(keep-alive)
登录网站需要的认证信息:cookie
了解即可~
状态码告知从服务器端返回的结果
下面介绍几种常见的状态码,仅做科普:
301与302类似,301代表原URL失效,已永久转移到另一个新的URL;302代表原URL目前失效,暂时转移到一个新的URL
如果你已经将该URL存为一个书签,则301会自动更新你的书签保存的值并跳转到新URL,302则不会更新书签,会暂时跳转到新的URL处
403暗示了所请求的资源确实存在。跟401一样,若服务器不想透露此信息,它可以谎报一个404
当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”
即使物理层面只有一台服务器,只要使用虚拟主机的功能,即可以假想已具有多台服务器
域名通过DNS解析之后会映射到IP地址,当请求发送到服务器时,已经是IP地址得访问了,但如果一台服务器托管了多个域名,收到请求时就需要弄清楚到底要访问哪个域名,因此阿紫发送HTTP请求时必须再Host首部内完整指出主机名或域名得URL
客户端发送请求到代理服务器,代理不改变URL直接发送给持有资源的目标服务器
持有资源实体的源服务器将资源发送给代理服务器,再传给客户端
每次通过代理服务器进行转发请求或响应的时候都会把代理服务器的地址写入via首部信息
代理有两种基准分类的使用方法:一种是否使用缓存,一种是否会修改报文
缓存代理(caching proxy)会预先将资源的副本保存再代理服务器上,当代理再次接收对相同资源的请求时,在确认资源有效性后,就可以不从源服务器获取资源,而是直接将缓存过的资源作为响应返回
若缓存过期,则重新更新缓存
换而言之,如果一份资源接收缓存代理,只要同一局域网内有一次下载成功,那么同一局域网内的其余人也可以很快拿到该资源
除了代理服务器可以缓存,客户端如浏览器也可以缓存资源
网关实质上是一个网络通向其他网络的IP地址。
比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;
网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。
在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP 地址作 “与” 运算的结果不同判定两个网络中的主机处在不同的网络里。
而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络A向网络B转发数据包的过程。
HTTP有不足之处:
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已被篡改
解决方法:1.通信的加密:HTTP没有加密机制,可以通过SSL(secure socket layer)安全套接层,TLS(transport layer security)安全传输层协议来进行加密
2.内容的加密:要求客户端和服务器同时具备加密解密机制,对报文内容进行加密
问题:在HTTP协议通信时,任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应
不确认通信方,会造成以下隐患:
解决方法:查明对手的证书
证书由受信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。伪造证书从技术角度来说是一件异常困难的事
客户端持有证书即可完成个人身份的确认,可用于web网站的认证环节
问题:无法证明报文完整性,可能以遭篡改
没有任何办法确认,发出的请求、响应和接收到的请求响应是前后相同的
解决方法:
MD5 、SHA-1散列值校验
MD5是一个单向陷门函数,可以理解若已知x f,易得y=f(x),但已知y f,很难逆向求出x
SHA(Secure Hash Algorithm )该系列都为加密算法,其中介绍比较有名的SHA-256,该方法被广泛用于浏览器加密以及比特币得区块链加密中
在HTTP基础上加密就变成了HTTPS,通常在web登陆界面和购物结算界面等使用HTTPS通信
可以通过如下方式查看某一HTTPS网站的证书,或加密方式
公钥信息:
加密解密通用一个密钥的方式称为共享密钥加密,也叫做对称密钥加密,如凯撒密码:加密方式,所有字母顺次循环向后+3,a->d,b->e,abc->def,解密方式对称相反
以共享密钥方式加密需要把密钥也发送给对方,但通信被监听密钥也会落入攻击者之手,也就失去了加密意义,同时还需保管密钥,存在诸多问题
公开密钥加密则很好的解决了该问题
公开密钥使用非对称密钥,一把叫做私有密钥,一把公开密钥,私有密钥保密,公开密钥可随意发布
常见非对称RSA,AES,DES
一方根据另一方的公开密钥加密,将加密后的密文传输发送,接收方通过私有密钥解密
想要根据密文和公开密钥直接回复明文是很困难的,解密过程是在对离散对数进行求值,以目前算力很难迅速破解
简洁介绍其中一种,RSA加密方法,以帮助读者理解
RSA是第一个也是使用的最广泛的公钥加密算法,在1978年由R.Rivest、AdiShamir和Adleman三人发明,并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性
1.首先随机选择两个大素数p和q,计算n = pq
2.然后随机选择加密密钥b,满足b与(p-1)(q-1)互素。用扩展的Euclid算法计算解密密钥a,使得ab ==1 mod (p-1)(q-1) 即(a*b)%((p-1)(q-1))=1,求a
3.公开密钥:b和n
秘密密钥:a
加密:y = x ^b mod n
解密:x = y ^a mod n
如 p=7,q=11,n=77,(p-1)*(q-1)=60,取b=13,求得a=37,即(13x37)%60=1
令x=10, 加密:y = x ^b mod n,则y=40,密文为40发送
解密:x = y ^a mod n,
HTTPS采用共享密钥与公开密钥混合加密方式,由于公开密钥的加密处理起来比共享密钥加密方式更为复杂,因此若在通信中使用公开密钥加密方式,效率很低
因此,在交换密钥环节使用公开密钥加密,在建立通信交换报文阶段使用共享密钥加密
证明公开密钥正确性的证书
公开密钥加密方式无法证明公开密钥本身是货真价实的公开密钥,或许在公开密钥的传输途中真正的公开密钥已经被替换掉了
为了解决上述问题,可以使用由数字认证机构(CA)和其相关机关颁发的公开密钥证书
数字认证机构处于客户端和服务器双方都可信赖的第三方机构的立场,简单介绍一下业务流程:
- 服务器运营人员向CA提出公开密钥的申请
- CA判明提出者的身份之后会对已经申请的公开密钥做数字签名,并分配这个已签名的公开密钥
- 将该公开密钥放入公钥证书后绑定在一起
- 服务器拿到CA颁发的公钥证书
- 服务器把公钥证书发送给客户端
- 接收到公钥证书的客户端使用CA的公开密钥,对证书上的数字签名进行验证
- 若验证成功,则可确定
- 认证服务器的公开密钥是真实有效的CA机构
- 服务器的公开密钥值得信赖
SSL证书作为国际通用的产品,最为重要的便是产品兼容性(即证书根预埋技术),因为他解决了网民登录网站的信任问题,网民可以通过SSL证书轻松识别网站的真实身份。SSL证书分为如下种类:
- 增强验证型(EV)SSL证书 :证书审核级别为所有类型最严格验证方式,在OV类型的验证基础上额外验证其他企业的相关信息,比如银行开户许可证书。EV类型证书多使用于银行,金融,证券,支付等高安全标准行业。其在地址栏可以显示独特的EV绿色标识地址栏,最大程度的标识出网站的可信级别。支持ECC高安全强度加密算法,加密数据更加安全,加密性能更高
- 组织验证型(OV)SSL证书:证书审核方式为通过验证域名所有权和申请企业的真实身份信息才能签发证书。目前OV类型证书是全球运用最广,兼容性最好的证书类型。此证书类型适合中型企业和互联网业务申请。在浏览器中显示锁型标志,并能通过点击查看到企业相关信息。支持ECC高安全强度加密算法,加密数据更加安全,加密性能更高。
- 域名验证型(DV)SSL证书:证书审核方式为通过验证域名所有权即可签发证书。此类型证书适合个人和小微企业申请,价格较低,申请快捷,但是证书中无法显示企业信息,安全性较差。在浏览器中显示锁型标志。
用以确认客户端的客户端证书
HTTPS除了服务端证书,还可以使用客户端证书
现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用于的业务服务,比如那些可支撑客户端证书支出费用的业务
例如,银行的望山银行就采用了客户端证书,在登陆网银时不仅要求用户确认输入ID和密码,还要求用户的客户端证书,用已确认用户是否从特定的终端访问网银
SSL速度慢
当HTTPS使用SSL他的处理速度会变慢。
这种慢分为两种:
-
一种是之通信慢,另一种是之由于大量消耗CPU以及内存等资源,导致处理速度变慢
和使用HTTP相比,网络负载可能会变慢2-100倍,除去和TCP连接发送HTTP请求响应之外,还必须进行SSL通信,因此整体上处理通信量不可避免会增加
-
另一种是SSL必须进行加密处理,在服务器和客户端都需要进行加密和解密的运算处理,因此从结果上将,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强,通常给我们会使用SSL加速器这种专用服务器硬件来改善这类问题,可以数倍提高SSL的计算速度
因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等关键信息时候才使用HTTPS加密同通信,除此之外想要节约购买证书的开销也是原因之一
计算机本身无法判断使用者的身份,因此需要核对信息,例如:
- 密码
- 动态令牌:仅限本人持有设备内现实的一次性密码
- 数字证书:仅限终端持有的设备信息
- 生物认证:指纹和虹膜等本人的生理信息
- IC卡等
而HTTP使用的认证方式包括:
- BASIC 认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
BASCI认证
DIGEST认证
SSL客户端认证的步骤
SSL客户端认证需要事先将客户端证书分发给客户端,客户端必须安装此证书
- 接收到需要认证资源的请求,服务器发送certificate request报文,要求客户端提供客户端证书
- 用户算则即将发送的客户端证书,同时基于表单认证,向web应用程序发送到登录信息,以报文形式发送给服务器
- 服务器验证客户端证书和登录信息,通过后领取证书内容客户端的公开密钥,开始HTTPS加密通信
使用SSL客户端认证需要用到客户端证书,而客户端证书需要支付一定的费用
SSH SSL HTTPS区别 这篇博客写的很好
在建立HTTP标准规范的时候,制定者主要想把HTTP当作传输HTML文档的协议,但随着时代的发展,Web的应用多种多样,如购物网站,社交网络服务,企业内部管理工具等等
这些啊网站随追求的功能可以通过web应用和脚本程序实现,可是即使功能可以满足需求但是性能未必最优,因为HTTP协议的限制
- 一条连接上只可以发送一个请求
- 请求只能从客户端开始,客户端不可以接收除了响应之外的指令
- 请求、响应首部未经压缩就发送,首部信息越多延迟越大
- 发送冗长的首部,每次发送相同的首部造成的浪费很多
- 可任意选择数据压缩格式,非强制压缩发送
如Facebook 等网站,几乎能够实时观察到海量的用户公开发布的内容,当有几百几千万的用户发布内容的时候,web网站为了保存这些新增内容,在很短的时间内就会发生大量的内容更新,服务器已有更新就需要把内容及时的反馈到客户端界面上,这种数据量的处理是HTTP无法接受的
为了解决上述问题,提出了几种解决方法:
- 局部Web页面加载的异步通信手段
- 将响应挂起直到内容更新,模拟服务器推送功能
- SPDY
- 使用浏览器进行全双工通信的WebSocket
主要介绍编写网络页面的几种工具,这里不展开详细介绍
如果对前端有兴趣需要熟悉使用
简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的目标。应用HTTP协议的服务器和客户端以及运行在服务器上的web应用等资源才是攻击目标
从整体上来看,HTTP就是一个通用的单纯协议机制,那远程登陆用到的SSH协议来说,SSH具备协议级别的认证以及会话管理等功能 ,HTTP协议则没有。另外在架设SSH服务方面,任何人都可以轻易的创建安全等级高的服务,而HTTP即使已经架设好服务器,但如果想在服务器基础上提供web应用,很多情况下都需要重新开发。因此开发者需要自行设计并开发认证以及会话管理功能来满足web应用的安全 ,而自行设计就意味着会出现各种形形色色的实现,结果安全等级并不完备,可仍在运作的web应用背后却隐藏着容易被攻击者滥用的安全漏洞的bug
web应用中,从浏览器那接收到的HTTP请求的全部内容可以在客户端自由的变更篡改,所以web应用可能会接收到与预期数据不相同的内容
在HTTP请求报文中加载攻击代码,就可以发起对web应用的攻击,通过URL查询极端或表单,HTTP首部,cookie等途径把攻击代码植入,若Web应用存在安全漏洞,那么内部信息就会遭到窃取,被攻击者拿到管理权限
-
主动攻击:攻击者通过直接访问web应用,把攻击代码传入的攻击模式,针对服务器上的资源进行攻击
-
被动攻击
xxx
第十一章书中内容全面且完整,笔者认为没有整理的必要,可自行阅读电子书~