一、HTTP协议简介
1、HTTP是什么?
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网WWW(World Wide Web)的数据通信的基础。
2、HTTP版本发展
(1)HTTP 1.0
- 发布时间:1996 年。
- 特点:
基础功能建立:它是 HTTP 协议的早期较为成熟的版本,首次定义了客户端与服务器之间通信的基本交互模式,规定了请求方法(比如常见的 GET、POST 等)用于客户端向服务器获取或提交数据。例如,浏览器使用 GET 方法向服务器请求网页的 HTML 文档内容,服务器接收到请求后进行相应处理并返回对应的数据。
支持多种类型数据传输:可以传输文本、图像、音频、视频等多种格式的数据,使得网页内容变得更加丰富多样,不再局限于单纯的文本展示,像网页中可以嵌入图片等多媒体元素来提升视觉体验。
无状态性:服务器不会记录关于客户端的状态信息,每个请求都是独立的,这意味着如果客户端多次向服务器发起请求,服务器并不能根据之前的交互情况来对后续请求做特殊处理,每次都像是初次打交道一样去响应请求。不过这种无状态性在一些需要保持连续交互场景中(比如用户登录后的持续操作)会带来不便,后续版本对此有了改进。
每次请求建立新连接:客户端每发起一次 HTTP 请求,都要和服务器建立一次 TCP 连接,请求处理完毕后就断开连接。当一个网页包含多个元素(比如多个图片、脚本文件等)需要获取时,就需要频繁地建立和断开连接,这在一定程度上影响了性能和效率,会增加网络开销和延迟时间。
(2)HTTP 1.1
- 发布时间:1999 年,是对 HTTP/1.0 的重要改进版本。
- 特点:
持久连接:也叫长连接,默认采用持久连接的方式,即客户端和服务器建立一次 TCP 连接后,可以在这个连接上进行多次 HTTP 请求和响应的交互,不用像 HTTP/1.0 那样每次请求都新建连接,极大地减少了建立和关闭连接的开销,提升了网页加载等操作的效率。例如,在加载一个包含多个图片、样式表、脚本文件的复杂网页时,通过持久连接能更快速地获取全部资源。
管道化技术:允许客户端在同一个 TCP 连接上连续发送多个请求,而不用等待服务器对前一个请求的响应后再发下一个,服务器会按照接收请求的顺序依次返回响应结果。这样能进一步提高传输效率,减少请求等待时间,不过在实际应用中,管道化的实现效果会受到一些网络环境、服务器处理能力等因素的影响。
增加新的请求方法:新增了一些请求方法,像 PUT(用于向服务器上传文件等资源)、DELETE(用于请求服务器删除指定资源)等,丰富了客户端操作服务器资源的方式,拓展了 HTTP 协议的应用场景,比如在一些内容管理系统中可以利用 PUT 来更新文档内容、用 DELETE 来移除过期文件等。
缓存机制优化:提供了更完善的缓存控制机制,客户端和服务器可以通过相关的头信息(如 Cache-Control 等)来协商数据是否可以缓存、缓存多久等问题,减少了不必要的数据重复传输,降低了服务器的负载以及客户端获取数据的时间成本,比如对于一些不经常变动的网页图片等资源,合理设置缓存可以让客户端直接从本地缓存获取,而不用每次都向服务器请求。
(3)HTTP 2.0
- 发布时间:2015 年,旨在进一步提升网络传输性能,以适应现代互联网复杂应用的需求。
- 特点:
二进制分帧层:HTTP/2 采用二进制格式对数据进行编码传输,与 HTTP/1.x 的文本格式不同。并且引入了分帧层,将 HTTP 消息分解为多个帧,这些帧可以交错发送,不同流(一个流代表一个独立的请求 - 响应交互过程)的帧可以混合在同一个 TCP 连接中传输,然后在接收端再进行重组,这样能更充分地利用网络带宽,避免了 HTTP/1.1 中因请求顺序等待等造成的带宽闲置问题,提高了传输效率。
多路复用:基于二进制分帧和流的概念实现了多路复用,在同一个 TCP 连接上可以同时并发多个请求和响应,多个请求之间互不干扰,不像 HTTP/1.1 中虽然有管道化但还是会受顺序等限制。例如,在浏览一个复杂的电商网页,同时加载商品图片、详情数据、用户评论等不同资源时,能通过多路复用快速并行获取,极大提升网页加载速度。
头部压缩:使用 HPACK 算法对 HTTP 头部信息进行压缩,因为在 HTTP 通信中头部信息往往存在很多重复的字段(比如多个请求都有相同的用户代理等字段),压缩后可以减少数据传输量,节省网络带宽,尤其是在移动端等网络资源相对紧张的场景下效果更明显,加快了请求响应的整体速度。
服务端推送:服务器可以主动向客户端推送一些资源,比如客户端请求网页的 HTML 文档时,服务器预判客户端接下来可能还需要对应的样式表、脚本文件等,就可以不经客户端再次请求而主动将这些资源推送给客户端,进一步减少了客户端等待获取资源的时间,提升了用户体验。
(4)HTTP 3.0
- 发布时间:2022 年左右开始逐渐被更广泛关注和应用。
- 特点:
基于 QUIC 协议:HTTP/3 摒弃了之前 HTTP 版本基于 TCP 协议的做法,而是使用了 QUIC(Quick UDP Internet Connections)协议,QUIC 是基于 UDP 的一种传输层协议,它整合了 TCP 的可靠传输、拥塞控制等优点以及 UDP 的低延迟、快速连接建立等优势,能在复杂多变的网络环境下更快地建立连接,减少连接建立的延迟时间,像在网络信号不太好或者频繁切换网络(如从 WiFi 切换到移动数据)的场景下,依然能保障较流畅的通信。
继续优化性能与功能:继承了 HTTP/2 的很多优秀特性,如多路复用、头部压缩等,进一步强化了在移动互联网、实时交互应用等场景下的性能表现。例如在实时的在线游戏、视频会议等对实时性和低延迟要求很高的应用中,HTTP/3 能更好地保障数据的快速准确传输,减少卡顿、延迟等情况出现,提升用户的交互体验。
增强安全性:在协议设计上更加注重安全,默认采用加密通信(使用 TLS 1.3 等加密协议),从连接建立开始就保障数据的安全性,防止数据在传输过程中被窃取、篡改等,适应了当前互联网对数据安全要求越来越高的趋势。
二、HTTP常见的请求方法
1、GET
用于从服务器获取指定的资源。通常是获取网页内容、查询数据等操作会使用到 GET 方法。例如,当你在浏览器地址栏输入一个网址并回车访问网页时,浏览器默认就是使用 GET 方法向服务器请求该网页对应的 HTML 文档以及相关的资源(如图片、样式表、脚本文件等)。GET 请求会将请求参数附加在 URL 后面,以 “?” 开始,参数之间用 “&” 分隔,比如 “https://example.com/search?q=keyword&page=2”,这里就是向 “https://example.com” 这个服务器发起 GET 请求,查询关键词为 “keyword” 的内容,并且指定显示第 2 页的结果,服务器接收到请求后会根据这些参数查找并返回相应的资源信息。
2、POST
常用于向服务器提交数据,让服务器根据提交的数据进行相应的处理,比如在网页上填写表单(注册信息、登录信息、发表评论等)后提交数据到服务器,一般就是通过 POST 方法来实现的。POST 请求的数据是放在请求体(Request Body)中进行传输的,相比 GET 请求将参数放在 URL 上,POST 能传输更多、更复杂的数据,并且数据不会像 GET 请求那样直接暴露在 URL 上,安全性相对更高一些。
3、PUT
主要用于向服务器上传更新资源,也就是将客户端的资源放置到服务器指定的位置去替换原有的资源。例如在一些支持用户上传文件的网盘应用中,当你修改了本地的一个文档后想更新到网盘服务器上对应位置,就可以使用 PUT 方法将修改后的文档上传到服务器,覆盖原来的旧版本文档;或者在一些内容管理系统中,更新一篇已经存在的文章内容时也可以采用 PUT 请求,让服务器用新的内容替换旧的文章内容。
4、DELETE
用于请求服务器删除指定的资源。比如在一个项目管理系统中,当你有权限删除某个已经完成或者不再需要的项目时,可以通过向服务器发送 DELETE 请求,告知服务器删除对应的项目相关的数据(包括文档、记录等资源)。
5、HEAD
和 GET 方法类似,也是用于获取服务器资源的相关信息,但 HEAD 请求只返回头部信息,不会返回请求资源的实体内容。比如想要了解一个网页文档的大小、最后修改时间、服务器支持的响应格式等头部相关信息时,可以使用 HEAD 请求,它能帮助客户端在不获取整个资源实体的情况下快速判断是否需要进一步发起 GET 请求获取完整资源,常用于检查资源的可用性、验证缓存是否有效等场景。
6、OPTION
用于获取服务器针对特定资源所支持的请求方法以及服务器的一些配置信息等。比如客户端想要知道某个 URL 对应的资源允许使用哪些请求方法(是可以进行 GET、POST 还是 PUT 等操作),就可以向服务器发送 OPTIONS 请求,服务器会返回相应的响应,告知客户端支持的请求方法列表以及其他相关配置情况(如是否允许跨域等信息),这有助于客户端提前了解服务器的相关规则,合理地发起后续的请求。
7、TRACE
主要用于沿着目标服务器经过的代理服务器链回显收到的请求。当客户端发送一个 TRACE 请求时,服务器会将收到的请求信息(包括请求行、请求头)原封不动地返回给客户端。这个过程可以帮助客户端查看请求在经过一系列代理服务器时是否被修改,从而进行请求调试。
三、什么是URL
URL(Uniform Resource Locator),即统一资源定位符,是用于完整地描述互联网上网页和其他资源的地址。它就像是互联网上的 “坐标”,通过这个地址,浏览器等客户端可以精准地定位到需要访问的资源所在位置。
一般格式:
http://example.com:80/web/index.html?id=1
协议://域名(IP):端口/目录/文件名?参数
四、HTTP协议状态码
1、1XX(信息性状态码)
(1)100 Continue
- 含义:客户端在发送包含较大实体内容(如 POST 请求中的大量表单数据)的请求时,先发送请求头询问服务器是否愿意接收该请求的实体内容。服务器如果返回 100 Continue 响应码,表示服务器已收到请求头,并且愿意接收实体内容,客户端可以继续发送。
- 应用场景:在文件上传场景中比较常见。例如,当用户通过浏览器上传一个大型文件时,浏览器先发送请求头告知服务器上传文件的相关信息(如文件名、文件大小等),如果服务器返回 100 Continue,浏览器就会接着发送文件内容。
(2)101 Switching Protocols
- 含义:表示服务器理解并愿意遵从客户端的请求,通过升级协议来完成本次通信。比如从 HTTP/1.1 升级到 HTTP/2,或者从普通的 HTTP 协议切换到 WebSocket 协议(一种用于在单个 TCP 连接上进行全双工通信的协议)等情况。
- 应用场景:在一些对实时性和交互性要求较高的网页应用中,如在线游戏、实时聊天软件等,为了获得更好的性能,可能会从传统的 HTTP 协议切换到更适合实时通信的协议,此时就可能出现 101 Switching Protocols 响应码。
2、2XX(成功状态码)
(1)200 OK
- 含义:这是最常见的成功状态码,表示服务器成功处理了客户端的请求,并返回了请求的内容。无论是 GET 请求获取网页内容、POST 请求提交表单数据后得到成功处理的反馈,还是其他请求方法得到预期的响应,都可能返回 200 OK。
- 应用场景:当用户在浏览器中访问一个网页,服务器找到对应的网页文件并成功发送给浏览器时,浏览器就会收到 200 OK 响应码。例如,访问 “https://www.example.com/index.html”,如果服务器成功返回 index.html 文件的内容,响应码就是 200 OK。
(2)201 Created
- 含义:用于表示请求成功并且服务器创建了新的资源。通常是在使用 POST 或者 PUT 请求创建或更新资源后,服务器成功完成新资源的创建或更新操作时返回。
- 应用场景:在用户注册新账号时,服务器成功创建新用户记录后,会返回 201 Created 响应码;或者在内容管理系统中,使用 PUT 请求上传新的文档,服务器成功存储该文档后也会返回此码。
(3)202 Accepted
- 含义:表示服务器已经接受了客户端的请求,但处理尚未完成。这可能是因为请求的处理需要较长时间,或者需要排队等待处理等情况。
- 应用场景:在一些大型的任务处理系统中,如批量数据处理、视频转码等,当客户端提交任务请求后,服务器可能会返回 202 Accepted,告知客户端任务已经被接收,但还需要一段时间才能完成处理。
(4)204 No Content
- 含义:服务器成功处理了请求,但没有返回任何内容。这种情况可能是因为请求只是执行了一个操作,如删除资源(DELETE 请求)成功后,不需要返回具体的数据,或者只是对资源进行了更新,不需要返回更新后的内容等。
- 应用场景:当用户通过客户端删除服务器上的一个文件,服务器成功删除后,返回 204 No Content,表示删除操作成功,但没有其他内容需要返回。
3、3XX(重定向状态码)
(1)301 Moved Permanently
- 含义:表示请求的资源已经永久移动到了新的位置。客户端收到这个响应码后,下次访问应该使用新的 URL。同时,浏览器会自动将旧的 URL 重定向到新的 URL,并且在大多数情况下会更新书签等相关记录。
- 应用场景:当一个网站进行域名更换或者网页内容的永久迁移时,如从 “http://olddomain.com/page.html” 迁移到 “http://newdomain.com/page.html”,服务器会对旧 URL 的访问请求返回 301 Moved Permanently 响应码,引导浏览器访问新的 URL。
(2)302 Found
- 含义:表示请求的资源临时移动到了新的位置。与 301 不同的是,客户端下次访问时还是应该先尝试访问原来的 URL,因为资源可能会移回原来的位置。浏览器会临时性地重定向到新的 URL。
- 应用场景:在网站维护或者服务器负载均衡等场景下,资源可能会被临时迁移到其他服务器或位置,此时就会使用 302 Found 响应码来引导浏览器访问临时的资源位置。
(3)304 Not Modified
- 含义:客户端发送请求时通常会携带缓存相关的头信息(如 If - Modified - Since 等),如果服务器根据这些信息判断客户端已经有最新的资源副本(即资源自上次请求后没有被修改),就会返回 304 Not Modified 响应码。这意味着客户端可以直接使用本地缓存的资源,而不需要服务器再次发送。
- 应用场景:对于一些不经常更新的网页资源,如网站的 logo、样式表等,浏览器会在本地缓存这些资源。当再次访问包含这些资源的网页时,浏览器会向服务器发送请求询问资源是否有更新,服务器如果判断没有更新,就返回 304 Not Modified 响应码。
4、4XX(客户端错误状态码)
(1)400 Bad Request
- 含义:表示客户端发送的请求有语法错误或者请求参数不符合要求等问题。这可能是因为请求格式错误、缺少必要的参数或者参数值不合法等原因导致。
- 应用场景:如果在一个 POST 请求中,表单数据的格式不符合服务器的要求,或者在 GET 请求中,URL 中的查询参数格式错误,服务器就会返回 400 Bad Request 响应码。例如,在一个需要整数类型参数的请求中,客户端发送了一个非整数的参数值。
(2)401 Unauthorized
- 含义:表示客户端请求的资源需要进行身份验证,但客户端没有提供有效的认证凭证或者提供的凭证无效。
- 应用场景:当用户访问一个需要登录才能查看的网页或者资源时,如果用户没有登录(即没有提供正确的用户名和密码等凭证),服务器就会返回 401 Unauthorized 响应码。
(3)403 Forbidden
- 含义:表示客户端有请求的凭证,但服务器禁止客户端访问所请求的资源。这可能是因为客户端没有足够的权限,或者资源受到限制等原因。
- 应用场景:在一个企业内部的文件管理系统中,员工可能有登录系统的权限,但如果试图访问没有授权的机密文件,服务器就会返回 403 Forbidden 响应码。
(4)404 Not Found
- 含义:这是最常见的客户端错误状态码之一,表示服务器无法找到客户端请求的资源。可能是因为 URL 中的路径错误、资源被删除或者不存在等原因。
- 应用场景:当用户在浏览器中输入一个错误的网址,或者网页中的链接指向一个不存在的资源时,服务器就会返回 404 Not Found 响应码。例如,在 “https://www.example.com/nonexistentpage.html” 这个 URL 中,如果服务器上不存在 “nonexistentpage.html” 这个文件,就会返回 404 Not Found。
5、5XX(服务器错误状态码)
(1)500 Internal Server Error
- 含义:表示服务器在处理客户端请求时遇到了内部错误,通常是服务器端的代码出现问题,如程序崩溃、数据库查询错误等。
- 应用场景:在一个动态网页应用中,如果服务器端的脚本(如 PHP、Python 等)出现运行时错误,导致无法正确处理客户端的请求,就会返回 500 Internal Server Error 响应码。
(2)502 Bad Gateway
- 含义:作为网关或者代理的服务器,从上游服务器(真正提供服务的服务器)收到一个无效的响应。这可能是因为上游服务器出现故障或者网络问题等原因。
- 应用场景:在使用代理服务器访问网页时,如果代理服务器无法正确处理从目标服务器收到的响应,就会返回 502 Bad Gateway 响应码。
(3)503 Service Unavailable
- 含义:表示服务器暂时无法处理客户端的请求,通常是因为服务器过载、维护或者正在进行系统升级等原因。
- 应用场景:在电商网站进行大促活动时,由于访问量过大,服务器可能会暂时无法处理新的请求,此时就会返回 503 Service Unavailable 响应码;或者服务器定期维护期间,也会返回此码告知客户端服务暂时不可用。
(4)504 Gateway Time - out
- 含义:作为网关或者代理的服务器,在规定的时间内没有从上游服务器收到响应。这通常是因为上游服务器处理请求过慢或者网络拥塞等原因。
- 应用场景:在通过代理服务器访问一些响应速度较慢的网站时,如果代理服务器等待上游服务器响应超时,就会返回 504 Gateway Time - out 响应码。