目录
什么是HTTP协议?
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
协议组成
HTTP协议请求由状态行、请求头、请求正文三部分组成:
- 状态行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
Method
- GET:一般是用于客户端发送一个URI 地址去获取服务端的资源(一般用于查询操作)。
- POST:一般用户客户端传输一个实体给到服务端,让服务端去保存(一般用于创建操作)。
- HEAD:用于向服务端发起一个查询请求获取head 信息,比如获取index.html 的有效性、最近更新时间等。
- PUT:向服务器发送数据(一般用于上传数据的操作)。
- DELETE:客户端发起一个Delete 请求要求服务端把某个数据删除(一般用于删除操作)。
HTTP响应
服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。
HTTP响应由三部分组成:状态行、响应头、响应正文。
- 状态行:包括协议版本Version、状态码Status Code、回应短语;
- 响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;
- 响应正文:就是响应的具体数据。
状态码
1xx | 表示HTTP请求已经接受,继续处理请求 |
2xx | 表示HTTP请求已经处理完成 |
3xx | 表示把请求访问的URL重定向到其他目录 |
4xx | 表示客户端出现错误 |
5xx | 表示服务端出现错误 |
常见状态码:
200 | OK/请求已经正常处理完毕 |
301 | 请求永久重定向 |
302 | 请求临时重定向 |
304 | 请求被重定向到客户端本地缓存,节省服务端资源 |
400 | 客户端请求存在语法错误 |
401 | 客户端请求没有经过授权 |
403 | 客户端的请求被服务器拒绝,一般为客户端没有访问权限 |
404 | 客户端请求的URL在服务端不存在 |
500 | 服务端永久错误 |
503 | 服务端发生临时错误 |
HTTP响应模型
服务器收到HTTP请求之后,会有多种方法响应这个请求,下面是HTTP响应的四种模型:
- 单进程I/O模型:服务端开启一个进程,一个进程仅能处理一个请求,并且对请求顺序处理;
- 多进程I/O模型:服务端并行开启多个进程,一个进程只能处理一个请求,这样服务端就可以同时处理多个请求;
- 复用I/O模型:服务端开启一个进程,但是呢,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间并发执行;
- 复用多线程I/O模型:服务端并行开启多个进程,同时每个进程开启多个线程,这样服务端可以同时处理进程数M*每个进程的线程数N个请求。
HTTP协议的特点
HTTP 协议是无状态的,什么是无状态呢?就是说HTTP 协议本身不会对请求和响应之间的通信状态做保存。
如何实现有状态的协议?
Http 协议中引入了cookie 技术,用来解决http 协议无状态的问题。通过在请求和响应报文中写入Cookie 信息来控制客户端的状态;Cookie会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。在基于tomcat 这类的jsp/servlet 容器中,会提供session 这样的机制来保存服务端的对象状态。
HTTP协议的缺陷
- 通信过程中是使用明文,内容可能会被窃听。
- 不验证通信双方的身份。
- 无法验证报文的完整性,报文可能被篡改。
HTTPS
HTTPS解决了哪些问题?
- 数据完整性:内容传输经过完整性校验;
- 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥;
- 身份认证:第三方无法伪造服务端(客户端)身份。
客户端发起HTTPS请求过程
- Client发起一个HTTPS(比如 https://www.xxx/user/5a9a9cdcf265da238b7d771c)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
- Server把事先配置好的公钥证书(public key certificate)返回给客户端。
- Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
- Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
- Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
- Server使用对称密钥加密“明文内容A”,发送给Client。
- Client使用对称密钥解密响应的密文,得到“明文内容A”。
- Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。