计算机网络笔记-5(HTTP与HTTPS)
HTTP报文
HTTP请求报文
一个HTTP请求报文首部(请求行和首部行)的例子:
GET http://www.baidu.com/index.html HTTP/1.0 //请求行
User-Agent: Wget/1.12 (linux-gnu) //表示客户端使用的程序时wget
Host: www.baidu.com //表示目标主机名是www.baidu.com
Connection: close //服务器处理完这个HTTP请求后就关闭连接
HTTP请求方法解释:
- GET
申请获取资源,不对服务器产生任何其他影响。 - HEAD
与GET类似,仅要求服务器返回头部信息,不需要传输任何实际内容 - POST
客户端向服务器提交数据的方法,会影响服务器。
服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源 - PUT
上传某个资源 - DELETE
删除某个资源 - TRACE
要求目标服务器返回原始HTTP请求的内容
可用来查看中间服务器(代理服务器)对HTTP请求的影响 - OPTIONS
查看服务器对某个特定URL支持的请求方法
可把URL设置为*,从而获得服务器支持的所有请求方法 - CONNECT
用于某些代理服务器,把请求的连接转化为安全隧道 - PATCH
对某个资源做部分修改
GET、HEAD、 OPTIONS、TRACE视为安全的方法
POST、PUT、DELETE、PATCH影响服务器资源
GET、HEAD、OPTIONS、TRACE、PUT、DELETE视为等幂的,即多次连续、重复的请求和一次请求具有完全相同的效果。
在所有头部字段之后,HTTP请求必须包含一个空行,标识头部字段的结束
请求行和每个头部字段都必须以<CR><LF>结束(回车符和换行符)
空行之后,HTTP请求可以包含可选的消息体。
HTTP响应报文
状态码解释:
- 1**:表示通知信息的,如接收的请求正在处理
- 2**:表示成功,如请求正常处理完毕
- 3**:表示重定向,如需要进行附加操作来完成请求
- 4**:表示客户端的差错,如请求中有服务器无法识别的语法
- 5**:表示服务器的差错,如服务器失效无法完成请求
HTTP1.0与HTTP1.1
HTTP 1.0特点
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题)
- 无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息。(使用 cookie 机制可以保持 session,解决无状态的问题)
HTTP1.0工作方式为非流水线方式,发送请求后需等待并收到响应,才能发送下一个请求
HTTP1.1特点
- 长连接:HTTP1.1支持长连接,一个TCP连接中可以传送多个HTTP请求和响应,减少了TCP连接重复建立和断开所造成的额外开销,减轻了服务端的负载。
- 管线化:HTTP1.1支持流水线工作方式,可以同时并行发送多个请求,不需要一个接一个地等待响应。
- 断点续传,就是可以将一个大数据,分段传输,客户端可以慢慢显示。
HTTP2.0
HTTP2.0相比HTTP1.1的优点
- 二进制分帧: HTTP1.1是通过文本的方式传输数据,表现形式具有多样性,而二进制只有0和1两种状态,实现方便且稳定;
- 首部压缩: HTTP1.*的header中带有大量信息(特别是包括cookie时),每次都需要重复发送;HTTP2.0采用头部压缩算法对传输的header进行编码,并在客户端和服务端维护一张索引表来记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。
- 多路复用: HTTP1.1虽然支持并发多个请求,但页面需要请求很多资源时,队头阻塞会导致在达到最大请求时,会阻碍排在后面的请求;HTTP2.0可以同时处理多个消息请求和响应,甚至交错发送数据,避免了队头阻塞问题,提高了传输性能。
- 服务器推送: HTTP1.1中,一个客户端的请求对应一个响应。在HTTP2.0中,服务器可以对一个客户端的请求发送多个响应。如果一个请求是由客户端主页发送的,服务器可能会响应主页内容、logo以及样式表,因为服务器知道客户端会用到这些东西。这样不但减轻了数据传送冗余步骤,也加快了页面响应的速度,提高了用户体验。
HTTPS
HTTP缺点:
- 通信使用明文
- 请求和响应不会对通信方进行确认
- 无法保护数据的完整性
HTTPS特点:
1、内容加密:采用混合加密技术,中间者无法直接查看明文内容
2、验证身份:通过证书认证客户端访问的是自己的服务器
3、保护数据完整性:防止传输的内容被中间人冒充或者篡改
SSL协议中包含密钥加密方式。密钥加密有两种方式:一种是共享密钥加密,另一种是公开密钥加密。
- 共享(对称)密钥加密
客户端和服务器共用同一个密钥,该密钥可以用于加密一段内容,也可以解密一段内容。共享密钥可有客户端或服务端随机生成,但生成之后必须将密钥发给对方,在互联网中转发密钥时有被窃听的风险。
优点:加解密算法简单,效率高
缺点:安全性不够高,转发密钥过程中易被窃取。 - 公开(非对称)密钥加密
使用一对非对称密钥,一把叫私有密钥,一把叫公开密钥。其中,私有密钥通常放在服务端,公开密钥存放在客户端。工作方式为:客户端使用服务端的公开密钥进行加密处理,服务端收到被加密的信息后,再使用自己的私有密钥进行解密。
优点:服务端不需要发送用来解密的私有密钥,私有密钥只有服务端知道,也不必担心公开密钥发送过程中被窃听。
缺点:公开密钥加密方式更复杂,其处理速度比共享密钥加密慢。
混合加密机制:
共享密钥加密和公开密钥加密两种方式并用,先使用公开密钥加密方式转发共享密钥给对方(保证共享密钥的安全传输),之后通信交换报文阶段使用共享密钥加密方式。
数字认证过程:
- 服务器把自己的公钥提交至数字证书认证机构
- 数字证书认证机构用自己的私有密钥向服务器的公钥署数字签名并颁发公钥证书
- 服务器发送公钥证书给客户端
- 客户端使用数字证书认证机构的公钥,向数字证书认证机构验证数字签名,确认服务器的公钥真实性
- 客户端随机生成共享密钥,使用服务器的公钥对报文加密传送共享密钥给服务器
- 服务器使用私钥解密获取客户端的共享密钥
- 客户端和服务器使用共享密钥进行通信
cookie与session区别
cookie工作原理
- 客户端第一次发送请求给服务器端
- 服务端创建Cookie(包含用户的信息,对应一个识别码)并将其发送给客户端,客户端会保存cookie文件
- 客户端再次访问服务端时,会自动在请求报文中加入Cookie值发送给服务端
- 服务端接受到报文后,通过Cookie值就能确认用户身份。
通过以上步骤,服务端就可以跟踪用户的访问记录,且只要用户使用同一个主机(PC端或手机端)来访问服务端网站,就可以根据请求报文中携带的Cookie信息来验证身份,不用再重新登录。
session工作原理
- 客户端第一次访问服务端
- 服务端创建一个sessionId和session形成一个映射关系,session保存在后端数据库,然后将sessionId发送给客户端并保存
- 客户端再次访问服务端时,会自动在请求报文的首部行中加入sessionId
- 服务端根据sessionId去查询Session对象,从而区分不同用户。
区别
- Cookie数据存放在客户端上,Session数据存放在服务器上;
- Cookie不是很安全,攻击者可以分析客户端本地的Cookie进行身份伪装,考虑到安全可以使用Session。
- 单个Cookie在客户端的数据大小限制为4k,session过多时会消耗服务器资源。