HTTP协议是用于从www服务器传输超文本到本地浏览器的传送协议,在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议通常承载于TCP协议之上,有时也承载于TLS或者SSL协议层之上,因此就形成了我们常说的HTTPS
HTTP协议的特点
HTTP协议永远是客户端发起请求,服务器端回复响应,因此HTTP协议永远无法实现在客户端没有发起请求的时候,因此服务器也无法将消息发送给客户端。
- 支持客户端/服务器模式,支持基本认证和安全认证。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。其中请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因此通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
- HTTP0.9和1.0采用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求并收到答复后即断开连接,HTTP1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式能够节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态表示对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据增加。
一次完整的HTTP请求过程
HTTP请求报文
一个HTTP请求由请求行、请求头部、空行和请求数据4个部分组成:
- 请求行
- 请求行:请求方法、请求地址和协议版本
- 请求方法:HTTP/1.1定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
- 协议版本:常用的有HTTP/1.0和HTTP/1.1
- 请求头部 请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,中间用冒号分割。
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要必不可少。
- 请求数据 可选部分,GET请求就没有请求数据,POST请求由请求数据。
HTTP响应报文
HTTP响应报文主要由状态行、响应头部、空行和响应数据组成。
- 状态行
- 1xx:指示信息--表示请求已接收,继续处理。
- 2xx:成功--表示请求已被成功接收、理解、接受。
- 3xx:重定向--要完成请求必须进行更进一步的操作。
- 4xx:客户端错误--请求有语法错误或请求无法实现。
- 5xx:服务器端错误--服务器未能实现合法的请求 详细介绍:
- 100:客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。常用于POST大数据传输
- 206:一般用来做断点续传,或者是视频文件等大文件的加载
- 301:永久重定向会缓存。新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名
- 302:临时重定向不会缓存,常用 于未登陆的用户访问用户中心重定向到登录页面
- 304:协商缓存,告诉客户端有缓存,直接使用缓存中的数据,返回页面的只有头部信息,是没有内容部分
- 400:参数有误,请求无法被服务器识别
- 403:告诉客户端进制访问该站点或者资源,如在外网环境下,然后访问只有内网IP才能访问的时候则返回
- 404:服务器找不到资源时,或者服务器拒绝请求又不想说明理由时
- 503:服务器停机维护时,主动用503响应请求或 nginx 设置限速,超过限速,会返回503
- 504:网关超时
- 响应头部
- 响应数据 用于存放需要返回给客户端的数据信息。
Session和Cookie
HTTP协议本身是无状态的,所以服务器无法判断用户身份,Cookie实际上是小段的文本信息,所以客户端在访问服务器的时候可以携带自己的Cookie信息进行访问(一般大小在4kb以内),而服务器内部也会保留每个用户的session信息(通过sessionID进行判断,sessionID携带在cookie中访问服务器)。
一般保密的内容存放在session中(例如用户登录账号密码),如果放在cookie会有泄露的风险。Cookie和session有以下差别:
- 数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
- 安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- 服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
- Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;