读《图解Http》

一、了解Web及网络基础

CERN,欧洲核子研究组织,最先提出一种能让远隔两地的研究者们共享知识的设想。

1、网络基础TCP/IP

通常使用的网络实在TCP/IP协议族的基础上运作的,而HTTP属于它内部的一个子集。

1.1TCP/IP协议族

读《图解Http》_第1张图片
image.png

1.2 TCP/IP的分层管理

TCP/IP协议族按照层次可分为四层:应用层、传输层、网络层和数据链路层。
分层的好处:可以单独的修改和替换某一个层次;设计也简单了,只需要考虑自己需要实现的功能即可。

  • 应用层
    决定了向用户提供应用服务时通信的活动。比如FTP(文件传输协议)、DNS(域名系统)和HTTP(超文本传输协议,也叫做超文本转移协议)
  • 传输层
    对上层应用层提供处于网络连接中的两台计算机之间的数据传输。有TCP(传输控制协议)和UDP(用户数据报协议)
  • 网络层(网络互联层)
    用来处理在网络上流动的数据包,数据包时网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包 给对方。
  • 链路层(数据链路层、网络接口层)
    处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网络适配器,即网卡)及光纤等物理课件部分。

1.3 TCP/IP通信传输流

读《图解Http》_第2张图片
image.png

发送端在层与层之间传输数据时,每经过一层时必定会被打伤一个该层的所属首部信息。反之,在接收端在层与层传输数据时,每经过一层时会把对应的首部消去。

这种把数据信息包装起来的做法称为封装。如下图:
读《图解Http》_第3张图片
image.png

2、与HTTP关系密切的协议:IP、TCP和DNS

2.1 负责传输的IP协议

位于网络层,称为网际协议。其作用是把各种数据包传送给对方,依靠的两个重要条件:IP地址和MAC地址。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可变化,但是MAC地址不会。
使用ARP协议凭借MAC地址进行通信。ARP:解析地址协议,它能根据通信方的IP地址反查出对应的MAC地址。

IP间的通信依赖于MAC地址,在网络上,通常是经过多台计算机和网络设备中转才能连接到对方,而在中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时采用ARP协议。
读《图解Http》_第4张图片
image.png

2.2确保可靠性的TCP协议

位于传输层,提供可靠的字节流服务。
TCP协议采用三次握手策略来保证可靠的字节流服务。握手过程中使用了TCP的标志(flag)---SYN(synchronize)和ACK(acknowledgement).具体过程如下:
1、发送端发送一个带SYN标志的数据包给对方;
2、接收端接收到后,回传一个带有SYN/ACK标志的数据包表示确认信息

3、发送端再回传一个带ACK标志的数据包,代表握手结束,接下来就可以传输了
读《图解Http》_第5张图片
image.png

2.3 负责解析域名的DNS服务

位于应用层的协议,提供域名到IP地址之间的解析服务。
读《图解Http》_第6张图片
image.png

2.4 总览

读《图解Http》_第7张图片
image.png
URI:统一资源标识符
URL:统一资源定位符

二、简单的HTTP协议

请求头的一般构成:方法(GET、POST等)、URI(统一资源标识符)、协议版本(HTTP/1.1)、请求首部字段(如Host、Content-Type等)和内容实体:
读《图解Http》_第8张图片
image.png

响应报文由协议版本、状态吗、解释状态码的原因、响应头以及内容实体组成:
读《图解Http》_第9张图片
image.png

1、HTTP是不保存状态的协议

HTTP是无状态协议,它自身是不会对请求和响应之间的通信状态进行保存的。主要是为了更快的处理大量事务,确保协议的可伸缩性。
为了解决这种无状态,引入了Cookie技术,使用Cookie来管理状态。

三、HTTP报文内的HTTP信息

1、HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。请求的一方的报文被称为请求报文,响应的一方的报文被称为响应报文。
HTTP报文大致可分为报文首部和报文主体,两者之间用一个空行划分。不一定有报文主体。

2、编码提升传输速率

2.1 报文主体和实体主体

报文:是HTTP通信中的基本单位,由8位字节流组成,通过HTTP通信传输。
实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。

四、返回结果的HTTP状态码

1、状态码告知从服务器端返回的请求结果

2、2XX 成功

2XX的响应结果表明请求被正常处理了。

  • 200 OK
  • 204 No Content
  • 206 Partial Content
    该状态码表示客户端进行了范围请求,而服务器成功执行了这部分请求。

3、3XX重定向

3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

  • 301 永久性重定向
  • 302 临时重定向
  • 303

4、4XX客户端错误

4XX的响应结果表明客户端是发生错误的原因所在

  • 400 Bad Request
    请求报文中存在语法错误
  • 401
  • 403 Forbidden
    对资源的请求被服务器拒绝了
  • 404 Not Found
    服务器上无法找到请求的资源

5、5XX 服务器错误

5XX的响应结果表明服务器本身发生错误。

  • 500
  • 503
    服务器暂时处于超负荷运转或者正在进行停机维护,现在无法请求。

五、与HTTP协作的Web服务器

六、HTTP首部

七、确保Web安全的HTTPS

1、HTTP的缺点

  • 通信使用明文,内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,有可能已遭篡改

1.1、通信使用明文可能会被窃听

HTTP本身不具备加密的功能,所以发送的都是明文。

  • TCP/IP是可能被窃听的网络
  • 加密处理防止被窃听
    主要的加密对象有:
    1、通信的加密
    HTTP和SSL(安全套接层)或TLS(安全层传输协议)的组合使用,加密HTTP的通信内容。
    建立了安全通信线路后,就可以在这条线路上进行HTTP通信。与SSL组合的HTTP被称为HTTPS。
    2、内容加密
    将参与通信的内容本身加密,即将报文主体加密。

1.2不验证通信方的身份就可能遭遇伪装

HTTP协议中请求和响应都不会对通信双方进行确认,所以我们没办法确定发送方和接收方是否都是自己的。主要在于:

  • 任何人都可发起请求
  • 查明对手的证书
    HTTP协议无法确定通信方,但是SSL可以,SSL不仅提供了加密处理,而且还使用了一种被称为证书的手段,可用于确定方。

2、HTTP+加密+认证+完整性保护=HTTPS

2.1 相互交换密钥的公开密钥加密技术

SSL采用一种公开密钥加密的加密处理方式。

  • 共享密钥加密
    加密和解密同用一个密钥的方式被称为共享密钥加密,也被叫做对称密钥加密。任何人只要持有这个密钥就可以解密内容了。但是又个问题,共享密钥加密必须将密钥也发送给对方,所以只要攻击者获取到了该密钥,就能为所欲为。
  • 使用两把密钥的公开密钥加密
    公开密钥加密使用的是非对称加密。一把叫做私有密钥,另一把叫公开密钥。
    使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密,对方收到被加密的信息后,使用自己的私有密钥解密。
私钥和公钥之间不会因为知道一个而推断出另外一个;使用其中的一个密钥对内容加密后,基本上用该密钥无法解密,只能使用另一个密钥解密。

举个例子:A和B要通信,A要发送一份资料给B
1、A手里的资料是x;
2、B通过一些方法,产生了两个密钥B1和B2,其中B1作为公钥,B2作为私钥
3、B通过HTTP把自己的公钥B1发送给了A
4、A接收到了来自B的公钥,然后使用该公钥对x加密,并返回给了B
5、B收到来自A的加密资料后,使用自己的私钥B2解密。

2.2 HTTPS采用混合加密机制

HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。

2.3 证明公开密钥正确性的证书

公开密钥在传输过程中也会被替换掉,所以也没办法确定它是否还是原来的样子。
为了解决这个问题,可以使用由数字证书认证机构(CA)和其他相关机关办法的公开密钥证书。数字证书认证机构是一个第三方可信赖的机构。
数字证书认证机构业务流程: 服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。
接到证书的客户端可使用数字证书认证机构的公开密钥,对该证书上的数字签名进行验证,认证通过后,便可确认:1、服务器的公开密钥是真实有效的数字证书认证机构;2、服务器的公开密钥匙值得信赖的。

3、HTTPS通信

1、客户端通过发送ClientHello报文开始SSL通信。报文中包含客户端支持的SSL的制定版本、加密组件列表。
2、服务器可进行SSL通信时,会以Server Hello报文作为应答。报文中包含SSL版本和加密组件。服务器中的加密组件内容是从接收到的客户端加密组件中筛选出来的。
3、服务器发送Certificate报文。报文中包含公开密钥证书。
4、最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束
5、SSL第一次握手技术后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
6、客户端继续发送加密组件(Change Cipher Spec)报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
7、客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。
8、服务器同样发送Change Cipher Spec报文。
9、服务器同样发松Finished报文
10、Finished报文交换完毕后,SSL链接就算建立完成。从此开始进行应用层协议通信,即发送HTTP请求。
11、应用层协议通信,发送HTTP响应
12、由客户端断开链接。发送close_notify报文
13、发送TCP FIN报文来关闭与TCP的通信。

八、确认访问用户身份的认证

这里的认证主要是为了区分访问服务器的使用者的身份。
HTTP的认证方式有:

  • BASIC认证(基本认证)
  • DIGEST认证(摘要认证)
  • SSL客户端认证
  • FormBase认证(表单认证)

1、BASIC认证(基本认证)

安全级别很低,这里认证的是用户名和密码。将用户名和密码用冒号连接起来后,以Base64方式编码后发送给服务器。可以发现,这里并没有做任何的加密处理,所以很不安全。主要流程如下:
1、客户端发起请求
2、服务器返回401,表示需要认证;并返回认证方式BASIC
3、客户端将用户ID和密码用冒号连接,然后Base64后返回给服务器
4、认证通过,则返回200

2、DIGEST认证(摘要认证)

它采用质询/响应的方式,只不过DIGEST不会直接发送明文。
质询/响应方式:一方A会发送认证要求给另一方B,B在接受到认证请求后,会根据接收到的质询码生成响应码,然后发送给A,A对此响应码进行校验即可。
DIGEST的认证流程如下:
1、客户端发起请求
2、服务器返回401,并在响应首部字段Authorization里返回一个必须的质询码字段nonce和必须的字段realm在,以及其他的信息,如uri等
3、客户端解析该质询码,生成一个响应码,并返回给服务器,首部字段中包括username、realm、nonce、uri和response字段,响应码放在response里面
4、服务器接收到首部字段Authorization后,解析响应码及其他认证信息,如果通过,则返回200

3、SSL客户端认证

安全级别较高。需要事先将客户端证书发给客户端,且客户端必须安装此证书。
SSL认证流程如下:
1、客户端发起请求
2、服务器需要认证时,会发送Certificate报文,要求客户端提供证书
3、客户端将证书信息以报文形式发送给服务器
4、服务器进行处理认证,认证通过后,领取证书内的客户端公开密钥,进行HTTPS加密通信

不过一般客户端认证采用的是双因素认证,即结合另外一种认证方式进行认证,最常用的是表单认证。因为SSL认证只能认证客户端是合法的,但是不能认证使用者就是用户本人,所以需要结合其他认证方式来确定用户是否合法。

4、FormBase认证(表单认证)

表单认证基本和BASIC认证相同,只不过表单认证采取了Cookie来管理,因为HTTP是无状态的,所以采用Cookie来保证其有状态性。
认证流程如下:
1、客户端发起请求,将用户名和密码放入实体中,发送给服务器,通常采用的是POST方法
2、服务器接收到请求后,会发放一个SessionID,来作为用户的身份识别
3、客户端将接收到的SessionID作为Cookie保存在本地,下次请求的时候,会默认带上该SessionID。

不过,这种方式如果处理不当,也会有被伪装的风险,所以服务器可以通过对SessionID设置有效期来保证其安全性;为了防止跨站脚本攻击(XSS),事先可以在Cookie内加上httponly属性。

九、基于HTTP的功能追加协议--WebSocket

有这么一种场景:在Facebook和Twitter等SNS网站上,几乎能够实时观察到海量用户公开发布的内容。当几百、几千万的用户发布内容时,Web网站为了保存这些新增内容在很短的时间内就会发生大量内容更新;相应的,为了尽可能实时的显示这些更新内容,服务器上已有新内容,就需要直接把那些内容反馈到客户端的界面上。
针对这一现象,HTTP上肯定是完成不了的,因为HTTP只能是由客户端发起请求,它做响应,一次响应结束,这次连接就会被关闭,下次还需要重新连接。总之,HTTP标准由如下的瓶颈:
1、一条连接只能发送一个请求
2、请求只能从客户端开始
3、请求/响应首部未经压缩就发送
4、发送冗长的首部
5、可任意选择数据压缩格式,也可以不压缩
针对这些瓶颈,先后出现了Ajax、Comet等新技术。但是都不能很好的解决问题。Ajax采用轮询,每隔一段时间就会自动请求一次;Comet采用阻塞的办法,客户端的请求会被刮起在后台,当有新内容的时候才会返回,这样无疑会消耗更多的资源。
而WebSocket可以解决这个问题。

1、WebSocket--全双工通信

一旦客户端和服务器建立了WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送任意格式的数据。
通信连接是建立在HTTP基础上的,一旦建立了连接,无论是客户端还是服务器都可直接向对方发送报文。
主要特点有:

  • 推送功能
    服务器可直接向客户端推送数据
  • 减少通信量
    只要建立了WebSocket连接,在断开前,不用再次连接,可以直接发送想要发送的内容。

2、WebSocket连接

连接采用的是HTTP请求,想要进行WebSocket通信,需要进行一次握手,一旦握手成功将不再使用HTTP的数据帧,而是采用WebSocket独立的数据帧。返回状态吗是101才表示WebSocket连接成功。
读《图解Http》_第10张图片
image.png

如上图所示,WebSocket的协议是ws,采用安全机制的是wss。

你可能感兴趣的:(读《图解Http》)