HTTP
HTTP基本概念
(Hypertext Transfer Protocol)
在两点之间传输【文字、图片、音频、 视频等】超文本数据的约定和规范
cookie
解决HTTP是无状态协议的问题
HTTP报文格式
请求报文
HTTP请求报文 | ||
---|---|---|
请求行 | GET /somedir/page.html HTTP/1.1 | 方法字段、URL字段、HTTP版本字段 |
首部行 | Host:www.someschool.edu | 指明对象所在主机(服务器域名) |
首部行 | Connection:Keep-Alive | 是否长连接,HTTP/1.1默认长连接 |
首部行 | User-agent:Mozilla/5.0 | 指明用户代理,即浏览器类型是Firefox |
首部行 | Content-Type:text/html;Charset=utf-8 | 本次数据是网页格式,utf-8编码 |
首部行 | Content-Encoding:gzip | 采用gzip压缩方式 |
首部行 | Accept-language:fr | 希望得到对象的法语版本 |
首部行 | Accept-Encoding:gzip | 可以接受gzip压缩方式 |
首部行 | Accept:* / * | 可以接受任何格式的数据 |
方法字段
- GET:用于请求获取特定资源[只读],通常用于获取网页、图片、文本等静态内容。该方法是幂等的,即多次执行相同的GET请求应该得到相同的结果。实体体为空
- POST:用于向服务器提交数据[新增或提交],通常用于提交表单数据、上传文件等操作。POST请求可能会引起服务器状态的变化,不是幂等的。
- PUT:用于向服务器上传新的资源,或者更新现有资源。PUT请求应该是幂等的,即多次执行相同的PUT请求会得到相同的结果。
- DELETE:用于请求删除指定的资源。DELETE请求应该是幂等的,即多次执行相同的DELETE请求会得到相同的结果。
- HEAD:与GET方法类似,但只返回响应头部,不返回实际内容。主要用于获取资源的元数据或检查资源是否存在。
- OPTIONS:用于获取目标资源支持的通信选项。服务器可以返回允许的方法、支持的头部字段等信息。
- TRACE:用于追踪请求在传输链路上的处理情况。服务器会将接收到的请求原样返回给客户端,用于测试和诊断。
- CONNECT:用于建立与目标资源的隧道连接,通常用于代理服务器。
响应报文
HTTP响应报文 | ||
---|---|---|
状态行 | HTTP/1.1 200 OK | 协议版本、状态码、相应状态信息 |
首部行 | Connection:close | 非持续连接 |
首部行 | Date:Tue,18,Aug,2015 15:44:04 GMT | 服务器从文件系统中检索到该对象,将其插入响应报文并发送该响应报文的时间 |
首部行 | Server:Apache/2.2.3(CentOS) | 报文由Apache Web服务器产生 |
首部行 | Last-Modified:Tue,18,Aug 2015 15:11:03 GMT | 对象创建/最后修改的时间 |
首部行 | Content-Length:6821 | 被发送对象的字节数 |
实体体 | (data data data data data …) | 所请求的对象本身 |
状态码
1xx(Informational):表示请求已经被接收,继续处理中。
2xx(Success):表示请求已成功处理并得到响应。
- 200 OK:请求成功,服务器正常返回请求的数据。
- 201 Created:请求成功,并在服务器上创建了新的资源。
- 204 No Content:请求成功,但响应不包含任何实体内容。
- 206 Partial Content:请求成功,但响应返回的body数据只是资源的一部分。
3xx(Redirection):表示需要进行进一步的操作,以完成请求。
- 301 Moved Permanently:请求的资源已永久移动到新的URL。
- 302 Found:临时重定向,请求的资源暂时移动到新的URL。
- 303 See Other:重定向到其他资源,常用于POST/PUT方法的响应中
- 304 Not Modified:资源未修改,客户端可以使用缓存的版本。
- 307 Temporary Redirect:类似302的临时重定向,但请求方法不得改变
- 308 Permanent Redirect:类似301的永久重定向,但请求方法不得改变
4xx(Client Error):表示客户端发送的请求有错误。
- 400 Bad Request:通用差错代码,服务器无法理解请求。
- 401 Unauthorized:请求需要身份验证。
- 403 Forbidden:服务器拒绝访问资源。
- 404 Not Found:请求的资源不存在。
5xx(Server Error):表示服务器在处理请求时发生错误。
- 500 Internal Server Error:服务器内部错误。
- 501 Not Implemented:客户端请求的功能还不支持,敬请期待。
- 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效的响应。
- 503 Service Unavailable:服务器暂时无法处理请求,通常是由于过载或维护。
- 505 HTTP Version Not Support:服务器不支持请求报文的HTTP协议版本。
HTTP缓存
强制缓存
只要浏览器判断缓存没有过期,就直接使用浏览器的本地缓存
协商缓存
只有未能命中强制缓存时,才能发起带有协商缓存字段的请求
状态码:304 Not Modified:资源未修改,客户端可以使用缓存的版本
- 基于时间:通过请求头部的If-Modified-Since字段和响应头部的Last-Modified字段比较
- 基于唯一标识:通过请求头部的If-None-Match字段和响应头部的Etag唯一标识响应资源字段
HTTPS
混合加密
混合加密(对称加密、非对称加密)的方式实现信息的机密性,解决了窃听的风险
非对称加密:
- 公钥加密,私钥解密
保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;- 私钥加密,公钥解密
保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能止常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。
摘要算法
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险
数字证书
将服务器公钥放入到数字证书中,解决了冒充的风险。
SSL/TLS
Secure Sockets Layer/Transport Layor Security
客户端向服务器索要并验证服务器的公钥
双方协商生成会话秘钥
双方采用会话秘钥进行加密通信
先TCP握手,再TLS握手
- SSL/TLS1.2:四次握手
- SSL/TLS1.3:三次握手
HTTP演变
HTTP 1.1
- 长连接:只要任意一端没有明确提出断开连接,则保持TCP连接状态,直到超过一定时间没有数据交互
- 管道网络传输:同一个TCP连接中,客户端可以发起多个请求,只要第一个发出,不必等待第一个返回就可以发下一个
HTTP的Keep-Alive也叫HTTP长连接,该功能是由应用程序实现的,可以使得用同一个TCP连接来发送和接收多个HTTP请求/应答,减少了HTTP短连接带来的多次TCP连接建立和释放的开销
TCP的Keepalive也叫TCP保活机制,该功能是由内核实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接
HTTP 2
- HPACK头部压缩:请求头消除重复,HPACK算法
- 二进制格式
- 并发传输:多个stream复用在一个TCP连接,使用Stream ID支持并行交错,但在TCP层仍可能队头阻塞(TCP面向字节流)
- 服务器推送:服务器可以主动向客户端发送信息
HTTP 3
QUIC协议,基于UDP
-
无队头阻塞:Stream之间独立,某个流丢包,只阻塞这个流
-
更快的连接建立
-
连接迁移
TCP四元组:(源地址,源端口,目标地址,目标端口)
QUIC协议没有用四元组的方式来“绑定”连接,而是通过连接ID来标记通信的两个端点,客户端和服务器可以各自选择一组ID来标记自己。因此即使移动设备的网络变化后,导致IP地址变化了,只要仍保有上下文信息(比如连接ID、TLS密钥等),就可以“无缝”地复用原连接