一、HTTP 基本概念
HTTP(HyperText Transfer Protocol 超文本传输协议),用于从WWW服务器传输超文本到本地浏览器的传输协议。实际作用就是为客户端与服务器的数据交换。
整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目。
二、HTTP 协议结构
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
1.HTTP请求
HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。
HTTP请求由请求行、请求头、请求正文三部分组成:
- 请求行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
格式如下:
Method Request-URI HTTP-Version CRLF。
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
(1)请求报文的起始由请求行构成(有些资料称为状态行,名字不一样而已,都是指的一个东西),用来说明该请求想要做什么,由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,注意每个字段之间都用空格分隔。
URL字段表示服务器的资源目录定位。
HTTP协议的请求方法有:
GET — 访问服务器的资源,请求获取Request-URI所标识的资源。
POST — 向服务器发送要修改的数据,在Request-URI所标识的资源后附加新的数据。
HEAD — 获取服务器文档的首部,由Request-URI所标识的资源的响应消息报头。
PUT — 向服务器上传资源,并用Request-URI作为其标识。
DELETE — 删除服务器的资源
CONNECT — 保留将来使用。
OPTIONS — 请求查询服务器的性能,或者查询与资源相关的选项和需求。
注意:方法名称是区分大小写的。
get方法和post方法的区别
-
GET 一般用于信息获取,比如刚才我们浏览百度首页,其使用的就是GET方法。GET 请求一般不会产生副作用,它仅仅只是获取资源信息,就像数据库查询一样,不会修改、增加数据,不会影响资源的状态,并且对同一个 URL 的多次GET请求应该返回相同的结果。
而 POST 请求表示可能会修改服务器上的资源。 -
GET 和 POST 请求参数位置不同,GET 请求对应的参数放在 URL 中,而 POST 请求对应的参数放在 HTTP 请求主体中。(但是这只是一种约定,GET 请求中出现 Body 也是被允许的)
-
GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。处于安全考虑,在一些涉及安全的请求比如:登录请求需要用 POST 提交表单,而GET 请求一般用来获取静态资源。
(2)请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
Accept 指定客户端能够接收的内容格式类型
Accept-Language 指定客户端能够接受的语言类型
Accept-Ecoding 指定客户端能够接受的编码类型
User-Agent 用户代理,向服务器说明自己的操作系统、浏览器等信息
Connection 是否开启持久连接(keepalive)
Host 服务器域名,允许多个域名同处一个IP地址,即虚拟主机。
…
(3)主体部分就是报文的具体数据,指浏览器端通过http协议发送给服务器的实体数据。GET请求时,通过url传给服务器的值。POST请求时,通过表单发送给服务器的值。
2.HTTP响应
HTTP 响应是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,HTTP 响应和 HTTP 请求相似,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。
格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
(1)响应报文的起始由状态行构成,用来说明服务器做了什么,由协议版本,状态码,状态码描述三个字段组成,同样的每个字段之间留有空格.
状态码用来表示服务器对客户端响应的结果。一般由三位数字构成,第一个数字定义了响应的类别:
1xx : 表示请求已经接受了,继续处理。
2xx : 表示请求已经处理掉了。
3xx : 重定向。
4xx : 一般表示客户端有错误,请求无法实现。
5xx : 一般为服务器端的错误。
常见的状态码:
200 OK :客户端请求成功。
301 Moved Permanently :请求永久重定向。
302 Moved Temporarily: 请求临时重定向。
304 Not Modified :文件未修改,可以直接使用缓存的文件。
400 Bad Request :由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized :请求未经授权,无法访问。
403 Forbidden :服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。
404 Not Found :请求的资源不存在,比如输入了错误的URL。
500 Internal Server Error: 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable :服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
(2)首部由多个响应头(也叫首部行)组成, 首部字段名如下:
Location:这个头配合302状态码,用于告诉客户端找谁(跳转)
Server 服务器软件名,Apache/Nginx
Content-Encoding:告诉浏览器,服务器的数据压缩格式
Content-Length:告诉浏览器,回送数据的长度
Content-Type:告诉浏览器,回送数据的类型
Last-Modified:告诉浏览器当前资源缓存时间
Refresh:告诉浏览器,隔多长时间刷新
Date 服务器发出响应报文的时间
Last-Modified 请求资源的最后的修改时间
Connection:响应完成后,是否断开连接。 close/Keep-Alive
…
(3)主体部分是响应报文的具体数据,用于存放需要返回给客户端的数据信息。
三.HTTP工作过程
通常,一个完整的流程一般是这样的:由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
一次完整的 HTTP 通信过程:
- 建立 TCP 连接
在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80; - 客户端向服务器发送请求命令
一旦建立了TCP连接,客户端就会向服务器发送请求命令;
例如:GET/sample/hello.jsp HTTP/1.1 - 客户端发送请求头信息
客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送; - 服务器应答
客户端向服务器发出请求后,服务器会客户端返回响应;
例如: HTTP/1.1 200 OK
响应的第一部分是协议的版本号和响应状态码 - 服务器返回响应头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档; - 服务器向客户端发送数据
服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据; - 服务器关闭 TCP 连接
一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色。仅从一条通信线路来说,服务器端和客服端的角色是确定的。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
四、HTTP和HTTPS的区别与联系
1、HTTPS基本概念
HTTPS是以安全为目标的HTTP通道,简单讲是加密版的HTTP,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
2、HTTPS的工作原理
(1)、客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到server的443端口。
(2)、服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。
(3)、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
(4)、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密。
(5)、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
(6)、服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
(7). 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
(8). 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。