HTTP协议:超文本传输协议
HTTP(Hypertext Transfer Protocol,超文本传输协议) 是一种用于在客户端(通常是浏览器)与服务器之间传输数据的协议,广泛应用于Web浏览、应用程序接口(API)调用、文件传输等场景。HTTP是无状态的协议,意味着每个请求都是独立的,服务器不会记录每个请求之间的历史。
HTTP协议的工作原理
- 客户端发起请求:当用户在浏览器中输入URL(统一资源定位符),浏览器会解析该URL并发送HTTP请求到服务器,要求获取相应的资源(如网页、图片、视频等)。
- 服务器处理请求:服务器接收到请求后,根据请求头信息、请求方法等参数进行处理,并返回响应数据。响应可能是所请求的资源、一个错误页面,或者其他内容。
- 客户端接收响应:客户端收到服务器返回的HTTP响应后,解析响应内容并显示给用户,或者进行进一步的处理(如下载文件、播放视频等)。
HTTP请求和响应的组成
HTTP请求结构
HTTP请求一般由以下几个部分组成:
-
请求行:包含请求方法、请求URL和HTTP版本。例如:
GET /index.html HTTP/1.1-
请求方法
:表示客户端请求的操作类型,常见的有:
GET:请求获取资源。POST:提交数据,通常用于表单提交。PUT:用于更新资源。DELETE:删除资源。HEAD:类似于GET,但只返回头部信息。OPTIONS:获取支持的HTTP方法。PATCH:部分更新资源。
-
-
请求头:提供额外的客户端信息,例如浏览器类型、语言设置、缓存控制等。例如:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8User-Agent:描述客户端浏览器类型。Accept:指定客户端支持的响应内容类型。Content-Type:指定请求体的内容类型(如在POST请求中发送数据时)。Authorization:用于身份验证。
-
请求体:在某些请求方法(如POST、PUT)中,包含请求的数据。比如提交表单时,数据会作为请求体发送给服务器。
HTTP响应结构
HTTP响应由以下部分组成:
-
响应行:包含HTTP版本、状态码和状态消息。例如:
HTTP/1.1 200 OK200:表示请求成功(常见的状态码之一)。404:表示资源未找到。500:表示服务器内部错误。
-
响应头:包含响应的元数据,例如服务器类型、响应时间、缓存策略等。例如:
Content-Type: text/html; charset=UTF-8 Server: Apache/2.4.41 (Unix) Date: Wed, 23 Jun 2024 10:10:00 GMTContent-Type:表示响应数据的类型(如HTML页面、JSON数据等)。Server:服务器的类型和版本信息。
-
响应体:这是服务器返回的实际数据,可能是HTML页面、图片、JSON数据等内容。
HTTP的状态码
HTTP响应中包含的状态码用来表示请求的处理结果,常见的状态码有:
-
1xx(信息性状态码) :
100 Continue:继续请求。101 Switching Protocols:协议切换。
-
2xx(成功状态码) :
200 OK:请求成功。201 Created:请求已完成,并创建了新的资源。
-
3xx(重定向状态码) :
301 Moved Permanently:资源永久移动。302 Found:资源临时移动。
-
4xx(客户端错误状态码) :
400 Bad Request:请求格式错误。401 Unauthorized:需要身份验证。404 Not Found:未找到请求的资源。403 Forbidden:禁止访问。
-
5xx(服务器错误状态码) :
500 Internal Server Error:服务器内部错误。502 Bad Gateway:网关错误。503 Service Unavailable:服务不可用。
HTTP协议的特点
- 无状态性:每个HTTP请求和响应都是独立的,服务器不保存客户端的任何历史状态。每次请求都必须包含所有必要的信息。
- 无连接性:HTTP协议默认每次请求/响应结束后,连接即关闭。可以通过“持久连接”(
Connection: keep-alive)保持连接。 - 支持多种数据格式:HTTP可以传输各种类型的数据,如文本、图像、视频、音频、JSON、XML等。
- 灵活性:HTTP允许在请求和响应中携带丰富的元数据(头部信息),可以进行身份验证、内容压缩、缓存控制等。
- 简单易用:HTTP的请求和响应结构简单,易于理解和实现,成为Web应用的基础。
HTTP/1.1与HTTP/2的区别
-
HTTP/1.1:
- 单个连接每次只能发送一个请求/响应。
- 请求和响应头是明文传输,重复的头部信息会浪费带宽。
- 不支持多路复用,即一个连接只能处理一个请求。
-
HTTP/2(相比HTTP/1.1的改进):
- 支持多路复用:在一个连接中并行处理多个请求和响应,减少延迟。
- 头部压缩:使用HPACK算法压缩请求和响应头部,减少冗余。
- 流量控制:支持流量控制,可以管理多个请求的数据流。
- 服务器推送:服务器可以在客户端请求前主动发送相关资源,减少加载时间。
HTTP请求GET和POST的区别
1. 传输数据的方式不同
GET提交:GET参数通过URL传递。
请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST提交:POST放在Request body中。
把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据。
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
2. 传输数据的大小不同
首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。
3. POST比GET安全性更高
POST的安全性要比GET的安全性高。因为GET传递的参数直接暴露在URL上,所以不能用来传递敏感信息。
注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为:
(1) GET请求参数会被完整保留在浏览器历史记录里,也就是说会被浏览器主动缓存(cache),而POST中的参数不会被保留。
(2) 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。
总结
HTTP是Web通信的基础协议,采用请求-响应模式,具有简洁、灵活的特点。随着Web技术的发展,HTTP协议不断演化,从HTTP/1.0到HTTP/2,增强了性能和效率,尤其是在并发请求和数据传输优化方面。HTTP/3作为最新的版本,则引入了基于QUIC协议的改进,进一步提升了Web性能。