最近趁有时间,重温一下网络的知识,补习一下有关 HTTP 相关知识。俗话说好记性不如烂笔头,学习最有效的方法就是边看边记录,所以这篇就记录HTTP 网络协议学习过程中的要点。
一、三个名词:
1.报文:有两种,一,向服务发送请求携带的资源叫做请求报文;从服务器返回的资源叫做响应报文。
2.媒体类型:服务器返回的内容有很多种类型,像文本、图片,音频,视频等等。比如jpeg图片的格式为image/jpeg
3.方法:HTTP支持不同的请求命令,这些命令就叫做方法,如GET、POST、PUT、DELETE、HEAD.
二、几个容易混淆的概念
HTTP 协议?TCP/IP协议?TCP/IP协议族?UDP、TCP 协议?网络七层模型?四层模型?我的天...
解释:
1.在网络的世界里,要实现端对端之间的通讯,数据在不同设备之间实现传输就必须制定一系列的网络传输协议,这一系列的传输协议就叫做 TCP/IP协议,所以,TCP/IP协议族是互联网相关的各类协议族的总和。
2.TCP/IP协议族有个重要的特点就是分层管理,跟 app 开发中的 MVC、MVVM 模式类似,业务和逻辑层分开管理,模块之间解耦,可以提高开发效率和分层管理,因此,国际标准化组织为了能统一网络协议,提出了一个叫OSI(Open Systems Interconnection Model)的标准化协议,就是我们的七层协议:从上到下分别为 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
那还有另外一个四层模型又是什么鬼?注意这里的7层模型只是一个国际标准,实际上我们应用的都是以下面简化后的四层模型,说到底它就是把七层模型中的前面三层模型简化成一个应用层,把最底部的两个数据链路层和物理层简化成一个数据链路层,它们之间的关系如下:
3.现在我们看看这个四层模型,也就是 TCP/IP 模型,先看最顶部的应用层。
应用层:这个就是我们开发中用得最多最广泛的一层了,他包括了很多协议,今天我们说的 HTTP协议 就是属于应用层,还有其他的 FTP、蓝牙、DNS等都是属于应用层。
传输层:有两个协议在负责,一个就是 TCP 协议(注意这里的 TCP 跟前面说的 TCP/IP 协议没有任何关系,TCP/IP 协议是一个总称),另外一个就是 UDP 协议。
互联网层(网络层):由 IP 协议负责。(这里 IP 可不是平时见到的 IP 地址哦~)
链路层:负责跟硬件通讯的协议,跟底层操作系统,硬件驱动、网卡、光纤等看得见的物理设备交互。
题外话:明明 TCP/IP协议是一系列协议的总和,但是命名却由 TCP 和 IP 组成,由此可见 TCP 和 IP 这两个协议的重要性。
三、HTTP 通用首部字段
首部字段(请求头)可以理解为每次发送 HTTP 请求需要附带的辅助信息,用来规定请求类型、大小、解码方式、cookie 设置等一系列的信息。
1.Cache-Control:操作缓存工作机制
多个指令用,隔开
Cache-Control: private, max-age=0, no-cache
指令说明:
- Cache-Control: public
当指定使用public指令时,则明确表明其他用户也可利用缓存。 - Cache-Control: private
当指定private指令后,响应只以特定的用户作为对象,这与public指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。 - Cache-Control:no-cache
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。
客户端发送的请求中如果包含no-cache指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。 - Cache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。控制可执行缓存的对象的指令 - Cache-Control: no-store
当使用no-store指令1时,暗示请求(和对应的响应)或响应中包含机密信息。 1从字面意思上很容易把no-cache误解成为不缓存,但事实上no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为do-notserve-from-cache-without-revalidation更合适。no-store才是真正地不进行缓存,该指令规定缓存不能在本地存储请求或响应的任一部分。
2.Connection:不再转发的首部字段名
- Connection: close
HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。 - Connection: Keep-Alive
HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。
3.Date首部字段Date表明创建HTTP报文的日期和时间。
4.Pragma: no-cache 为了兼容旧版本1.0的写法,所以为了向下兼容,通常写法是:
Cache-Control: no-cache
Pragma: no-cache
5.Transfer-Encoding:规定了传输报文主体时采用的编码方式。
四、使用HTTPS
4.1、Http的缺点:
1-通信使用明文可能会被窃听
2-不验证通信方的身份就可能遭遇伪装
3-无法证明报文完整性,可能已遭篡改
4.2、HTTP+加密+认证+完整性保护 =HTTPS
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。
HTTP 和 HTTPS 的关系
4.3.加密技术
1-对称加密
2-非对称加密
3-混合加密,为了效率,https用的就是混合加密,交换密钥用非对称加密方式,之后交换报文阶段则使用对称加密方式。
4.非对称加密也有缺点,在传输公钥过程中也有可能被篡改,因此实际的做法是传输公钥之前先向第三方认证机构进行公钥数字签名,生成公钥证书,分配一个公钥,然后跟证书绑定在一起,服务端收到证书后再发给客户端,接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二,服务器的公开密钥是值得信赖的。
第三方机构想要正确安全地把公钥交给客户端也是件困难的事,因为这个过程同样可以被劫持篡改,所以一般都是主流的浏览器已经内置了常用认证机关的公钥。
HTTPS 通讯过程.png
五、认证
为了验证用户信息,需要认证,认证的技术有:
1- BASE 认证:如果服务器返回401错误码,需要把用户名和密码以:隔开,加上 Base64编码,加在Authorization首部字段中。但是由于不安全不灵活,一般不用。
2- DISGEST认证:同样不灵活。
质询计算.png 认证步骤.png
3- SSL 认证
1>客户端首先安装证书,服务器发起请求Certificate Request报文,要求客户端提供证书。
2>客户端把证书以 Client certificate报文方式发给服务器。
3>服务器验证。
4- SSL客户端使用双因素认证
大多情况下,SSL客户端认证采用证书认证和表单认证双因素认证方式。
六、消除 HTTP 瓶颈的SPDY
HTTP 有个缺陷就是无法及时更新内容,需要客户端不断请求刷新,服务器不断返回响应,这样会浪费大量资源。
Ajax:通过 JS调用服务器请求,更新局部页面
Comet:客户端发起请求,服务器不立即响应,而是暂存起来,当有内容更新再返回响应。
SPDY:以会话层插入 http 应用层和 TCP/IP传输层之间,而且了安全,规定使用 SSL
SDPY 的设计
使用 SDPY 的优点
1- 多路复用流:接收无限制的 HTTP 请求,在一条 TCP连接上处理,能提高效率
2- 压缩 HTTP 首部
3- 推送功能:服务器可主动发送内容到客户端而不必等客户端发送请求。
网友评论