深入学习理解HTTP系列(二) -- 搞懂HTTP协议
一、概述
- HTTP协议规定:请求从客户端发出,最后服务端响应该请求并返回(从客户端开始建立通信)
- 请求报文:
- 请求方法:请求访问服务器的类型
- 请求URI:请求访问的资源对象
- 协议版本:客户端使用的HTTP协议版本
- 请求首部字段(可选)
- 内容实体
- 响应报文:
- 协议版本:服务器对应的HTTP版本
- 状态码和原因短语:请求的处理结果
- 响应首部字段(可选):
- 资源实体的主体
- HTTP协议:
- 不保存状态协议,无状态(stateless)协议(更快地处理大量事务,确保协议的可伸缩性)
- 使用URI定位资源
- 请求访问服务端类型的HTTP方法:
- GET(获取资源):请求访问已被 URI 识别的资源,返回响应内容
- POST(传输实体主体):与GET功能类似
- PUT(传输文件):请求报文的主体中包含文件内容,保存至 URI 指定位置(一般不使用)
- HEAD(获取报文首部):不返回报文主体部分,确认URI有效性及资源更新的日期时间
- DELETE(删除文件):按请求URI删除指定的资源,与PUT方法相反(一般不使用)
- OPTIONS(查询支持的方法):返回服务器支持的方法
- TRACE(追踪路径):让Web服务器将之前的请求通信环回给客户端
- CONNECT(用隧道协议连接代理):用隧道协议(SSL、TLS)进行TCP 通信
- 持久连接(HTTP keep-alive或 HTTP Persistent Connections):建立一次TCP连接后进行多次请求和响应的交互,在HTTP/1.1中,连接默认为持久连接
- 管线化(pipeling):不用等待响应就可以直接发送下一个请求,做到同时并行发送多个请求
- Cookie(状态管理):通过在请求和响应报文中写入Cookie信息来控制客户端状态
- 客户端发送没有Cookie的请求,服务器保存状态信息,生成Cookie
- Set-Cookie:服务器响应报文的首部字段信息,通知客户端保存Cookie
- Cookie:客户端再次发送请求时,自动在请求报文中加入Cookie值
- 服务器检查Cookie,得倒之前状态信息
二、HTTP报文
- 请求报文结构:
- 请求行:请求方法、请求URI、HTTP版本
- 首部字段:条件和属性
- 其他:为定义的首部(Cookie)
- 报文主体
- 响应报文结构:
- 状态行:状态码、原因短语、HTTP版本
- 首部字段
- 其他
- 报文主体
- 报文主体和实体主体的差异:
- 报文(message):HTTP通信的基本单位(字节流),传输请求和响应的实体主体
- 实体(entity):有效载荷数据(实体首部、实体主体)
- 通常报文主体等于实体主体
- 传输中进行编码操作后:实体主体与报文主体不同
- 压缩传输的内容编码:服务器将实体进行压缩,客户端接收并解码(gzip、compress、deflate)
- 分割发送的分快传输编码:将实体主体分成多块(chunk),使用16进制标记块的大小(最后一块用“0(CR+LF)”标记),客户端负责解码
- 发送多种数据的多部分对象集合:首部字段Content-type,boundary字符串划分实体
- multipart/form-data:客户端上传Web表单文件
- multipart/byteranges:状态码206(部分内容)响应报文
- 获取部分内容的范围请求(Range Request)
- 内容协商返回最合适的内容(Content Negotiation):中英文网页
- 服务器驱动协商
- 客户端驱动协商
- 透明协商(结合体)
三、HTTP状态码
- 2XX 成功:
- 200 OK:请求被正常处理
- 201 No Content:请求被成功处理,但不返回资源(无报文主体)
- 206 Partial Content:响应客户端的范围请求,返回 Content-Range 指定范围内的实体内容
- 3XX 重定向:浏览器需要执行特殊处理才能完成请求
- 301 Moved Permanently:永久性重定向,资源被分配了新的 URI
- 302 Found:临时性重定向,希望用户这一次请求能使用新的URI
- 303 See Other:和302功能相同,明确客户端使用GET方法
- 304 Not Modified:客户端发送带有条件的请求,条件不满足
- 307 Temporary Redirect:临时性重定向,和302功能相同
- 4XX 客户端错误:
- 400 Bad Request:请求报文中存在语法错误
- 401 Unauthorized:请求需要有通过HTTP认证的认证信息
- 403 Forbidden:访问被服务器拒绝(没有访问权限,权限出现问题)
- 404 Not Found:服务器找不到请求的资源,也有可能服务端拒绝请求
- 5XX 服务器错误:
- 500 Internal Server Error:服务器执行请求时发生错误,服务器内部错误
- 503 Service Unavailable:服务器暂时处于超负载或停机维护状态
四、HTTP首部
报文首部
1. HTTP首部字段
- 格式:首部字段名:字段值(例如:Content-Type:text/html)
- 一个字段名可以有多个字段值
- 字段名重复,出现结果不一致
- 分类:
- 通用首部字段:请求和响应报文都使用
- 请求首部字段:补充请求的附加内容、客户端信息等
- 响应首部字段:响应的附加内容等
- 实体首部字段:针对请求和响应报文的实体部分,补充实体相关信息
- 其它首部字段(非HTTP):SetCookie、Cookie、Content- disposition
- 两种类型:缓存代理和非缓存代理
- 端到端首部(End-to-end Header):保存在由缓存生成的响应中,必须被转发
- 逐跳首部(Hop-by-hop Header):只对单次转发有效,会因通过缓存或代理而不再转发
- Connection、Keep-Alive、Proxy-Authenticate、Proxy- Authorization、Trailer、TE、Transfer-Encoding、Upgrade
- 除以上8个字段,其余皆是端到端首部字段
2. 通用首部字段
- Cache-Control:操作缓存
- 表示能否缓存的指令:
- public:表明其他用户也可利用缓存
- private:服务器为特定用户提供资源缓存服务
- no-cache:防止从缓存中返回过期的资源(客户端不会接收缓存过的响应,没有该参数指令的首部字段可以使用缓存)
- 控制可执行缓存的对象的指令
- no-store:缓存不能在本地存储请求和响应的任一部分(请求或响应中包含机密信息)
- 指定缓存期限和认证的指令
- s-maxage:供多位用户使用的公共缓存服务器(忽略Expires和max-age指令)
- max-age:缓存时间比指定的时间更小时,客户端接收缓存资源(指定为0时,不接收缓存资源),代表资源保存为缓存的最长时间(忽略Expires)
- min-fresh:要求缓存服务器返回至少还未过指定时间的缓存资源
- max-stale:指示缓存资源即使过期也照常接收
- only-if-cached:缓存服务器不重新加载响应,也不会再次确认资源有效性
- must-revalidate:代理会向源服务器再次验证即将返回的返回缓存是否有效(忽略请求的max-stale指令)
- proxy-revalidate:要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
- no-transform:缓存不能改变实体主体的媒体类型
- cache-extension token(扩展):扩展指令,若缓存服务器无法理解新指令,则直接忽略
- Connection:
- 控制不再转发给代理的首部字段(Hop-by-hop:逐跳首部)
- 管理持久连接:默认持久连接,想要断开时,将Connection字段值设为Close
- Date:表明创建HTTP报文的日期和时间
- Pragma(历史遗留字段):客户端发送请求,不返回缓存的资源(因为无法掌握网络中全部的服务器HTTP版本,所以一般同时含有Cache- Control:no-cache)
- Trailer:说明在报文主体最后记录了哪些首部字段(可应用于分块传输时)
- Transfer-Encoding:规定了传输报文主体采用的编码方式(仅对分块传输有效)
- Upgrade:检测HTTP协议是否可使用更高版本进行通信
- Via:追踪客户端于服务器之间的报文传输路径,在Via字段中附加服务器信息再转发
- Warning:告知用户一些与缓存相关的问题和警告
3. Cookie首部字段
- Cookie标准:在网景公司制定的标准上进行拓展后的产物
- Set-Cookie(响应首部字段):开始状态管理后的cookie状态信息
- Cookie(请求首部字段):服务器接收到的Cookie信息
4. 其他首部字段
- X-Frame-Options(响应首部):控制网站内容在Frame标签内的显示问题(防止点击劫持攻击)
- DENY:拒绝
- SAMEORIGN
- X-XSS- Protection(响应首部):针对跨站脚本攻击(XSS)
- 0:无效
- 1:有效
- DNT(请求首部):拒绝个人信息被收集(拒绝被精准广告追踪)
- 0:同意被追踪
- 1:拒绝被追踪
- P3P(响应首部):保护用户隐私(p3p:在线隐私偏好平台)