HTTP协议:超文本传输协议|青训营笔记

108 阅读7分钟

HTTP协议:超文本传输协议

HTTP(Hypertext Transfer Protocol,超文本传输协议) 是一种用于在客户端(通常是浏览器)与服务器之间传输数据的协议,广泛应用于Web浏览、应用程序接口(API)调用、文件传输等场景。HTTP是无状态的协议,意味着每个请求都是独立的,服务器不会记录每个请求之间的历史。

HTTP协议的工作原理

  1. 客户端发起请求:当用户在浏览器中输入URL(统一资源定位符),浏览器会解析该URL并发送HTTP请求到服务器,要求获取相应的资源(如网页、图片、视频等)。
  2. 服务器处理请求:服务器接收到请求后,根据请求头信息、请求方法等参数进行处理,并返回响应数据。响应可能是所请求的资源、一个错误页面,或者其他内容。
  3. 客户端接收响应:客户端收到服务器返回的HTTP响应后,解析响应内容并显示给用户,或者进行进一步的处理(如下载文件、播放视频等)。

HTTP请求和响应的组成

img

HTTP请求结构

HTTP请求一般由以下几个部分组成:

  1. 请求行:包含请求方法、请求URL和HTTP版本。例如:

     GET /index.html HTTP/1.1
    
    • 请求方法

      :表示客户端请求的操作类型,常见的有:

      • GET:请求获取资源。
      • POST:提交数据,通常用于表单提交。
      • PUT:用于更新资源。
      • DELETE:删除资源。
      • HEAD:类似于GET,但只返回头部信息。
      • OPTIONS:获取支持的HTTP方法。
      • PATCH:部分更新资源。
  2. 请求头:提供额外的客户端信息,例如浏览器类型、语言设置、缓存控制等。例如:

     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.8
    
    • User-Agent:描述客户端浏览器类型。
    • Accept:指定客户端支持的响应内容类型。
    • Content-Type:指定请求体的内容类型(如在POST请求中发送数据时)。
    • Authorization:用于身份验证。
  3. 请求体:在某些请求方法(如POST、PUT)中,包含请求的数据。比如提交表单时,数据会作为请求体发送给服务器。

HTTP响应结构

HTTP响应由以下部分组成:

  1. 响应行:包含HTTP版本、状态码和状态消息。例如:

     HTTP/1.1 200 OK
    
    • 200:表示请求成功(常见的状态码之一)。
    • 404:表示资源未找到。
    • 500:表示服务器内部错误。
  2. 响应头:包含响应的元数据,例如服务器类型、响应时间、缓存策略等。例如:

     Content-Type: text/html; charset=UTF-8
     Server: Apache/2.4.41 (Unix)
     Date: Wed, 23 Jun 2024 10:10:00 GMT
    
    • Content-Type:表示响应数据的类型(如HTML页面、JSON数据等)。
    • Server:服务器的类型和版本信息。
  3. 响应体:这是服务器返回的实际数据,可能是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协议的特点

  1. 无状态性:每个HTTP请求和响应都是独立的,服务器不保存客户端的任何历史状态。每次请求都必须包含所有必要的信息。
  2. 无连接性:HTTP协议默认每次请求/响应结束后,连接即关闭。可以通过“持久连接”(Connection: keep-alive)保持连接。
  3. 支持多种数据格式:HTTP可以传输各种类型的数据,如文本、图像、视频、音频、JSON、XML等。
  4. 灵活性:HTTP允许在请求和响应中携带丰富的元数据(头部信息),可以进行身份验证、内容压缩、缓存控制等。
  5. 简单易用: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性能。