HTTP协议(包含与HTTPS的区别) 知识笔记

来源:互联网 发布:淘宝批量删除订单 编辑:程序博客网 时间:2024/05/19 17:48

HTTP协议处于OSI七层模型的应用顶层

使用 HTTP 协议时,客户端首先与服务端的 80 端口建立一个 TCP 连接,然后在这个连接的基础上进行请求和应答,以及数据的交换。无连接状态的。

HTTP工作原理图


1、HTTP 各版本的区别

由 HTTP 协议加载出来的网页,通常使用 HTML 语言来描述,因此 HTML 也可以理解为网页的一种数据格式。HTML 是一段纯文本,可以指定网页中的文字、图像、音频视频图片、链接,以及它们的颜色、位置等。无论计算机的底层结构如何,也无论网络底层使用了哪些协议,使用 HTML 展示出来的效果基本上是一致的。从这个角度来说 HTML 位于 OSI 七层模型的表现层。

http1.0:每对Request/Response都使用一个新的短连接;不支持断点续传,每次都从RANGE:0(http1.0新增加的字段)开始;其中Http1.0需要在request中增加“Connection:keep-alive”header才能支持,而Http1.1默认支持。
http1.1:默认使用长连接,在同一个TCP连接可以传送多个http请求和相应,同时也支持更多的请求头和相应头;还提供了身份认证、状态管理和cache缓存机制相关的头。
http2.0:支持头部压缩,流量控制,多路复用和更加安全的ssl加密算法等。这些特性都是2.0特有的。

参考:< http://www.jianshu.com/p/3b4f2c84e70f >

比较重要的点就是在于 HTTP 1.0 中每次请求和应答都会使用一个新的 TCP 连接,而从 HTTP 1.1 开始,运行在一个 TCP 连接上发送多个命令和应答。因此大幅度减少了 TCP 连接的建立和断开,提高了效率。


2、HTTP 的请求方法

HTTP的常见请求方法包括:

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
方法 描述 GET 请求指定的页面信息,并返回实体主体。 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 OPTIONS 允许客户端查看服务器的性能。 TRACE 回显服务器收到的请求,主要用于测试或诊断。

其中在Android中最常用的就是GET和POST了。两者存在的主要区别如下:

Get请求数据会附在URL之后,以 ? 分隔URL和传输的数据,多个参数用 & 连接,一般浏览器会对URL的长度有限制(如IE对URL长度限制为2083字节),所以get发送的数据是有限的。而且因为明文传输,他是不安全的。
Post请求把提交的数据放置在HTTP包的包体中,不会显示在浏览器上,其参数也是作为key/value对传输的,多个参数也是用 & 连接,所以他的安全性相对较高,但也是明文传输。且post一般用来递交数据,在数据传输方面,理论上是没有大小限制的,但是WEB服务器会规定对post提交数据大小进行限制。

HTTP报文格式:

请求报文格式

<request-line><headers><blank line>[<request-body>]

响应报文格式

<status-line><headers><blank line>[<request-body>]

请求与响应报文的区别就是第一行,一个是请求行,一个是状态行。

GET请求报文示例:

 GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive

POST请求报文示例(需要指定Content-Type,用于指示资源的MIME类型):

 POST / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive sex=man&name=Professional  
注意:    GET 可提交的数据量受到URL长度的限制,HTTP 协议规范没有对 URL 长度进行限制。这个限制是特定的浏览器及服务器对它的限制    理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制    参考上面的报文示例,可以发现 GET 和 POST 数据内容是一模一样的,只是位置不同,一个在URL里,一个在 HTTP 包的包体里

3、HTTP 的响应报文的常见状态码

  • 1xx : 指示信息–表示请求已接收,继续处理。
  • 2xx : 成功–表示请求已经被成功接收、理解、接收。
  • 3xx : 重定向–要完成请求必须进行更进一步的操作。
  • 4xx : 客户端错误–请求有语法错误或请求无法实现。
  • 5xx : 服务端错误–服务器未能实现合法的请求。
* 200 OK 客户端请求成功301 Moved Permanently 请求永久重定向(表示原 URL 不应再被使用,而应该优先选用新的 URL302 Moved Temporarily 请求临时重定向(表示请求的资源现在临时从不同的URI响应请求,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。意思就是说访问的资源可能暂时先用location的URI访问,但旧资源还在的,下次你再来访问的时候可能就不用重定向了。)304 Not Modified 文件未修改,可以直接使用缓存的文件。400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用* 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因* 404 Not Found 请求的资源不存在,例如,输入了错误的URL500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

4、Cookie 和 Session

HTTP 是一种无状态的连接,客户端每次读取 web 页面时,服务器都会认为这是一次新的会话。但有时候我们又需要持久保持某些信息,比如登录时的用户名、密码,用户上一次连接时的信息等。这些信息就由 Cookie 和 Session 保存。

这两者的根本性区别在于,cookie 保存在客户端上,而 session 则保存在服务器中。由此我们还可以拓展出以下结论:

1、cookie 相对来说不安全,浏览器可以分析本地的 cookie 进行 cookie 欺骗。2、session 可以设置超时时间,超过这个时间后就失效,以免长期占用服务端内存。3、单个 cookie 的大小有限制(4 Kb),每个站点的 cookie 数量一般也有限制(20个)。4、客户端每次都会把 cookie 发送到服务端,因此服务端可以知道 cookie,但是客户端不知道 session。

当服务器接收到 cookie 后,会根据 cookie 中的 SessionID 来找到这个客户的 session。如果没有,则会生成一个新的 SessionID 发送给客户端。session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)。


4、与HTTPS的比较(默认使用443端口)

HTTP 协议直接使用了 TCP 协议进行数据传输。由于数据没有加密,都是直接明文传输,会存在安全风险:

1、窃听风险:第三方节点可以获知通信内容。2、篡改风险:第三方节点可以修改通信内容。3、冒充风险:第三方节点可以冒充他人身份参与通信。

HTTPS 协议则是在 HTTP 和 TCP 之间新增了一个 TLS/SSL 加密层,旨在:

1、保证所有信息加密传输,无法被第三方窃取。2、为信息添加校验机制,如果被第三方恶意破坏,可以检测出来。3、配备身份证书,防止第三方伪装参与通信。

这里的证书是服务器证明自己身份的工具,它由权威的证书颁发机构(CA)发给申请者。如果证书是虚假的,或者是自己给自己颁发的证书,服务器就会不认可这个证书并发出警告:
这里写图片描述

总结一下 HTTPS 协议是如何避免前文所说的三大风险的:
1、先用非对称加密传输密码,然后用这个密码对称加密数据,使得第三方无法获得通信内容
2、发送方将数据的哈希结果写到数据中,接收方解密后对比数据的哈希结果,如果不一致则说明被修改。由于传输数据加密,第三方无法修改哈希结果。
3、由权威机构颁发证书,再加上证书校验机制,避免第三方伪装参与通信。

在使用HTTPS协议进行通信的时候,采用的是混合加密方式,在SSL通信阶段利用(公开密钥加密,即有两个密钥,一个是公钥,一个是私钥)非对称加密对交换随机密码串,然后在数据通信阶段利用同一随机密码串进行数据加密传输,即共享密钥加密(对称密钥加密)。
在进行SSL通信阶段,主要目的是将从客户端生成的一种被称为Pre-master secret的随机密码串传输给服务端,然后两端就可以通过该密码串对数据进行加密传输了。
而将随机密码串安全的从客户端传输给服务端就是SSL通信的关键,大致的步骤就是客户端将自己支持的SSL的指定版本、加密组件列表(所使用的加密算法及密钥长度等)告知给服务端,服务端从中选出一种加密组件内容以及公开密钥证书告知给客户端,客户端在接收到之后会利用证书验证公开密钥,在验证成功之后,会生成一个随机密码串并用公开密钥进行以及服务端指定的加密算法进行加密,然后传输给服务端,服务端在接收之后利用私钥以及对应的解密算法进行解密,之后,两端就可以利用该随机密码串进行数据等加密传输。

(具体的加密算法暂不涉及)


参考文章:
【1】https://hit-alibaba.github.io/interview/basic/network/HTTP.html
【2】[面试∙网络] TCP/IP(六):HTTP 与 HTTPS 简介
【3】HTTPS科普扫盲帖

原创粉丝点击